diff options
Diffstat (limited to '3rdparty/fguillot/picofeed/lib/PicoFeed/Syndication/Rss20.php')
-rw-r--r-- | 3rdparty/fguillot/picofeed/lib/PicoFeed/Syndication/Rss20.php | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/3rdparty/fguillot/picofeed/lib/PicoFeed/Syndication/Rss20.php b/3rdparty/fguillot/picofeed/lib/PicoFeed/Syndication/Rss20.php new file mode 100644 index 000000000..efb2dd489 --- /dev/null +++ b/3rdparty/fguillot/picofeed/lib/PicoFeed/Syndication/Rss20.php @@ -0,0 +1,207 @@ +<?php + +namespace PicoFeed\Syndication; + +use DomDocument; +use DomAttr; +use DomElement; + +/** + * Rss 2.0 writer class + * + * @author Frederic Guillot + * @package Syndication + */ +class Rss20 extends Writer +{ + /** + * List of required properties for each feed + * + * @access private + * @var array + */ + private $required_feed_properties = array( + 'title', + 'site_url', + 'feed_url', + ); + + /** + * List of required properties for each item + * + * @access private + * @var array + */ + private $required_item_properties = array( + 'title', + 'url', + ); + + /** + * Get the Rss 2.0 document + * + * @access public + * @param string $filename Optional filename + * @return string + */ + public function execute($filename = '') + { + $this->checkRequiredProperties($this->required_feed_properties, $this); + + $this->dom = new DomDocument('1.0', 'UTF-8'); + $this->dom->formatOutput = true; + + // <rss/> + $rss = $this->dom->createElement('rss'); + $rss->setAttribute('version', '2.0'); + $rss->setAttributeNodeNS(new DomAttr('xmlns:content', 'http://purl.org/rss/1.0/modules/content/')); + $rss->setAttributeNodeNS(new DomAttr('xmlns:atom', 'http://www.w3.org/2005/Atom')); + + $channel = $this->dom->createElement('channel'); + + // <generator/> + $generator = $this->dom->createElement('generator', 'PicoFeed (https://github.com/fguillot/picoFeed)'); + $channel->appendChild($generator); + + // <title/> + $title = $this->dom->createElement('title'); + $title->appendChild($this->dom->createTextNode($this->title)); + $channel->appendChild($title); + + // <description/> + $description = $this->dom->createElement('description'); + $description->appendChild($this->dom->createTextNode(isset($this->description) ? $this->description : $this->title)); + $channel->appendChild($description); + + // <pubDate/> + $this->addPubDate($channel, $this->updated); + + // <atom:link/> + $link = $this->dom->createElement('atom:link'); + $link->setAttribute('href', $this->feed_url); + $link->setAttribute('rel', 'self'); + $link->setAttribute('type', 'application/rss+xml'); + $channel->appendChild($link); + + // <link/> + $link = $this->dom->createElement('link'); + $link->appendChild($this->dom->createTextNode($this->site_url)); + $channel->appendChild($link); + + // <webMaster/> + if (isset($this->author)) $this->addAuthor($channel, 'webMaster', $this->author); + + // <item/> + foreach ($this->items as $item) { + $this->checkRequiredProperties($this->required_item_properties, $item); + $channel->appendChild($this->createEntry($item)); + } + + $rss->appendChild($channel); + $this->dom->appendChild($rss); + + if ($filename) { + $this->dom->save($filename); + } + else { + return $this->dom->saveXML(); + } + } + + /** + * Create item entry + * + * @access public + * @param arrray $item Item properties + * @return DomElement + */ + public function createEntry(array $item) + { + $entry = $this->dom->createElement('item'); + + // <title/> + $title = $this->dom->createElement('title'); + $title->appendChild($this->dom->createTextNode($item['title'])); + $entry->appendChild($title); + + // <link/> + $link = $this->dom->createElement('link'); + $link->appendChild($this->dom->createTextNode($item['url'])); + $entry->appendChild($link); + + // <guid/> + if (isset($item['id'])) { + $guid = $this->dom->createElement('guid'); + $guid->setAttribute('isPermaLink', 'false'); + $guid->appendChild($this->dom->createTextNode($item['id'])); + $entry->appendChild($guid); + } + else { + $guid = $this->dom->createElement('guid'); + $guid->setAttribute('isPermaLink', 'true'); + $guid->appendChild($this->dom->createTextNode($item['url'])); + $entry->appendChild($guid); + } + + // <pubDate/> + $this->addPubDate($entry, isset($item['updated']) ? $item['updated'] : ''); + + // <description/> + if (isset($item['summary'])) { + $description = $this->dom->createElement('description'); + $description->appendChild($this->dom->createTextNode($item['summary'])); + $entry->appendChild($description); + } + + // <content/> + if (isset($item['content'])) { + $content = $this->dom->createElement('content:encoded'); + $content->appendChild($this->dom->createCDATASection($item['content'])); + $entry->appendChild($content); + } + + // <author/> + if (isset($item['author'])) { + $this->addAuthor($entry, 'author', $item['author']); + } + + return $entry; + } + + /** + * Add publication date + * + * @access public + * @param DomElement $xml XML node + * @param integer $value Timestamp + */ + public function addPubDate(DomElement $xml, $value = 0) + { + $xml->appendChild($this->dom->createElement( + 'pubDate', + date(DATE_RFC822, $value ?: time()) + )); + } + + /** + * Add author + * + * @access public + * @param DomElement $xml XML node + * @param string $tag Tag name + * @param array $values Author name and email + */ + public function addAuthor(DomElement $xml, $tag, array $values) + { + $value = ''; + + if (isset($values['email'])) $value .= $values['email']; + if ($value && isset($values['name'])) $value .= ' ('.$values['name'].')'; + + if ($value) { + $author = $this->dom->createElement($tag); + $author->appendChild($this->dom->createTextNode($value)); + $xml->appendChild($author); + } + } +} |