diff options
Diffstat (limited to '3rdparty/ZendFeed/Reader/AbstractFeed.php')
-rw-r--r-- | 3rdparty/ZendFeed/Reader/AbstractFeed.php | 300 |
1 files changed, 300 insertions, 0 deletions
diff --git a/3rdparty/ZendFeed/Reader/AbstractFeed.php b/3rdparty/ZendFeed/Reader/AbstractFeed.php new file mode 100644 index 000000000..57ed45d3e --- /dev/null +++ b/3rdparty/ZendFeed/Reader/AbstractFeed.php @@ -0,0 +1,300 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Feed\Reader; + +use DOMDocument; +use DOMElement; +use DOMXPath; + +abstract class AbstractFeed implements Feed\FeedInterface +{ + /** + * Parsed feed data + * + * @var array + */ + protected $data = array(); + + /** + * Parsed feed data in the shape of a DOMDocument + * + * @var DOMDocument + */ + protected $domDocument = null; + + /** + * An array of parsed feed entries + * + * @var array + */ + protected $entries = array(); + + /** + * A pointer for the iterator to keep track of the entries array + * + * @var int + */ + protected $entriesKey = 0; + + /** + * The base XPath query used to retrieve feed data + * + * @var DOMXPath + */ + protected $xpath = null; + + /** + * Array of loaded extensions + * + * @var array + */ + protected $extensions = array(); + + /** + * Original Source URI (set if imported from a URI) + * + * @var string + */ + protected $originalSourceUri = null; + + /** + * Constructor + * + * @param DomDocument $domDocument The DOM object for the feed's XML + * @param string $type Feed type + */ + public function __construct(DOMDocument $domDocument, $type = null) + { + $this->domDocument = $domDocument; + $this->xpath = new DOMXPath($this->domDocument); + + if ($type !== null) { + $this->data['type'] = $type; + } else { + $this->data['type'] = Reader::detectType($this->domDocument); + } + $this->registerNamespaces(); + $this->indexEntries(); + $this->loadExtensions(); + } + + /** + * Set an original source URI for the feed being parsed. This value + * is returned from getFeedLink() method if the feed does not carry + * a self-referencing URI. + * + * @param string $uri + */ + public function setOriginalSourceUri($uri) + { + $this->originalSourceUri = $uri; + } + + /** + * Get an original source URI for the feed being parsed. Returns null if + * unset or the feed was not imported from a URI. + * + * @return string|null + */ + public function getOriginalSourceUri() + { + return $this->originalSourceUri; + } + + /** + * Get the number of feed entries. + * Required by the Iterator interface. + * + * @return int + */ + public function count() + { + return count($this->entries); + } + + /** + * Return the current entry + * + * @return \Zend\Feed\Reader\AbstractEntry + */ + public function current() + { + if (substr($this->getType(), 0, 3) == 'rss') { + $reader = new Entry\RSS($this->entries[$this->key()], $this->key(), $this->getType()); + } else { + $reader = new Entry\Atom($this->entries[$this->key()], $this->key(), $this->getType()); + } + + $reader->setXpath($this->xpath); + + return $reader; + } + + /** + * Get the DOM + * + * @return DOMDocument + */ + public function getDomDocument() + { + return $this->domDocument; + } + + /** + * Get the Feed's encoding + * + * @return string + */ + public function getEncoding() + { + $assumed = $this->getDomDocument()->encoding; + if (empty($assumed)) { + $assumed = 'UTF-8'; + } + return $assumed; + } + + /** + * Get feed as xml + * + * @return string + */ + public function saveXml() + { + return $this->getDomDocument()->saveXml(); + } + + /** + * Get the DOMElement representing the items/feed element + * + * @return DOMElement + */ + public function getElement() + { + return $this->getDomDocument()->documentElement; + } + + /** + * Get the DOMXPath object for this feed + * + * @return DOMXPath + */ + public function getXpath() + { + return $this->xpath; + } + + /** + * Get the feed type + * + * @return string + */ + public function getType() + { + return $this->data['type']; + } + + /** + * Return the current feed key + * + * @return int + */ + public function key() + { + return $this->entriesKey; + } + + /** + * Move the feed pointer forward + * + */ + public function next() + { + ++$this->entriesKey; + } + + /** + * Reset the pointer in the feed object + * + */ + public function rewind() + { + $this->entriesKey = 0; + } + + /** + * Check to see if the iterator is still valid + * + * @return bool + */ + public function valid() + { + return 0 <= $this->entriesKey && $this->entriesKey < $this->count(); + } + + public function getExtensions() + { + return $this->extensions; + } + + public function __call($method, $args) + { + foreach ($this->extensions as $extension) { + if (method_exists($extension, $method)) { + return call_user_func_array(array($extension, $method), $args); + } + } + throw new Exception\BadMethodCallException('Method: ' . $method + . 'does not exist and could not be located on a registered Extension'); + } + + /** + * Return an Extension object with the matching name (postfixed with _Feed) + * + * @param string $name + * @return \Zend\Feed\Reader\Extension\AbstractFeed + */ + public function getExtension($name) + { + if (array_key_exists($name . '\Feed', $this->extensions)) { + return $this->extensions[$name . '\Feed']; + } + return null; + } + + protected function loadExtensions() + { + $all = Reader::getExtensions(); + $manager = Reader::getExtensionManager(); + $feed = $all['feed']; + foreach ($feed as $extension) { + if (in_array($extension, $all['core'])) { + continue; + } + $plugin = $manager->get($extension); + $plugin->setDomDocument($this->getDomDocument()); + $plugin->setType($this->data['type']); + $plugin->setXpath($this->xpath); + $this->extensions[$extension] = $plugin; + } + } + + /** + * Read all entries to the internal entries array + * + */ + abstract protected function indexEntries(); + + /** + * Register the default namespaces for the current feed format + * + */ + abstract protected function registerNamespaces(); +} |