miniflux-legacy/vendor/PicoFeed/Writers/Rss20.php

197 lines
5.9 KiB
PHP
Raw Normal View History

<?php
namespace PicoFeed\Writers;
2014-05-20 20:20:27 +02:00
use DomDocument;
use DomAttr;
use DomElement;
use PicoFeed\Writer;
/**
* Rss 2.0 writer class
*
* @author Frederic Guillot
* @package picofeed
*/
class Rss20 extends Writer
{
2014-05-20 20:20:27 +02:00
/**
* List of required properties for each feed
*
* @access private
* @var array
*/
private $required_feed_properties = array(
'title',
'site_url',
2013-07-01 16:03:43 +02:00
'feed_url',
);
2014-05-20 20:20:27 +02:00
/**
* List of required properties for each item
*
* @access private
* @var array
*/
private $required_item_properties = array(
'title',
'url',
);
2014-05-20 20:20:27 +02:00
/**
* 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);
2014-05-20 20:20:27 +02:00
$this->dom = new DomDocument('1.0', 'UTF-8');
$this->dom->formatOutput = true;
// <rss/>
$rss = $this->dom->createElement('rss');
$rss->setAttribute('version', '2.0');
2014-05-20 20:20:27 +02:00
$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, isset($this->updated) ? $this->updated : '');
2013-07-01 16:03:43 +02:00
// <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);
2013-07-01 16:03:43 +02:00
$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/>
2013-08-10 04:23:57 +02:00
if (isset($item['id'])) {
$guid = $this->dom->createElement('guid');
2013-08-10 04:23:57 +02:00
$guid->setAttribute('isPermaLink', 'false');
$guid->appendChild($this->dom->createTextNode($item['id']));
2013-08-10 04:23:57 +02:00
$entry->appendChild($guid);
}
else {
$guid = $this->dom->createElement('guid');
2013-08-10 04:23:57 +02:00
$guid->setAttribute('isPermaLink', 'true');
$guid->appendChild($this->dom->createTextNode($item['url']));
2013-08-10 04:23:57 +02:00
$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']);
$channel->appendChild($entry);
}
$rss->appendChild($channel);
$this->dom->appendChild($rss);
if ($filename) {
$this->dom->save($filename);
}
else {
return $this->dom->saveXML();
}
}
2014-05-20 20:20:27 +02:00
/**
* Add publication date
*
* @access public
* @param DomElement $xml XML node
* @param string $value Timestamp
*/
public function addPubDate(DomElement $xml, $value = '')
{
$xml->appendChild($this->dom->createElement(
'pubDate',
date(DATE_RFC822, $value ?: time())
));
}
2014-05-20 20:20:27 +02:00
/**
* 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);
}
}
2014-05-20 20:20:27 +02:00
}