Chris@0: entry = $entry; Chris@0: $this->entryKey = $entryKey; Chris@0: $this->domDocument = $entry->ownerDocument; Chris@0: if ($type !== null) { Chris@0: $this->data['type'] = $type; Chris@0: } elseif ($this->domDocument !== null) { Chris@0: $this->data['type'] = Reader\Reader::detectType($this->domDocument); Chris@0: } else { Chris@0: $this->data['type'] = Reader\Reader::TYPE_ANY; Chris@0: } Chris@0: $this->loadExtensions(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the DOM Chris@0: * Chris@0: * @return DOMDocument Chris@0: */ Chris@0: public function getDomDocument() Chris@0: { Chris@0: return $this->domDocument; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the entry element Chris@0: * Chris@0: * @return DOMElement Chris@0: */ Chris@0: public function getElement() Chris@0: { Chris@0: return $this->entry; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the Entry's encoding Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: public function getEncoding() Chris@0: { Chris@0: $assumed = $this->getDomDocument()->encoding; Chris@0: if (empty($assumed)) { Chris@0: $assumed = 'UTF-8'; Chris@0: } Chris@0: return $assumed; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get entry as xml Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: public function saveXml() Chris@0: { Chris@0: $dom = new DOMDocument('1.0', $this->getEncoding()); Chris@0: $deep = version_compare(PHP_VERSION, '7', 'ge') ? 1 : true; Chris@0: $entry = $dom->importNode($this->getElement(), $deep); Chris@0: $dom->appendChild($entry); Chris@12: return $dom->saveXML(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the entry type Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: public function getType() Chris@0: { Chris@0: return $this->data['type']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the XPath query object Chris@0: * Chris@0: * @return DOMXPath Chris@0: */ Chris@0: public function getXpath() Chris@0: { Chris@12: if (! $this->xpath) { Chris@0: $this->setXpath(new DOMXPath($this->getDomDocument())); Chris@0: } Chris@0: return $this->xpath; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set the XPath query Chris@0: * Chris@0: * @param DOMXPath $xpath Chris@0: * @return AbstractEntry Chris@0: */ Chris@0: public function setXpath(DOMXPath $xpath) Chris@0: { Chris@0: $this->xpath = $xpath; Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get registered extensions Chris@0: * Chris@0: * @return array Chris@0: */ Chris@0: public function getExtensions() Chris@0: { Chris@0: return $this->extensions; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Return an Extension object with the matching name (postfixed with _Entry) Chris@0: * Chris@0: * @param string $name Chris@0: * @return Reader\Extension\AbstractEntry Chris@0: */ Chris@0: public function getExtension($name) Chris@0: { Chris@0: if (array_key_exists($name . '\\Entry', $this->extensions)) { Chris@0: return $this->extensions[$name . '\\Entry']; Chris@0: } Chris@0: return; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Method overloading: call given method on first extension implementing it Chris@0: * Chris@0: * @param string $method Chris@0: * @param array $args Chris@0: * @return mixed Chris@0: * @throws Exception\RuntimeException if no extensions implements the method Chris@0: */ Chris@0: public function __call($method, $args) Chris@0: { Chris@0: foreach ($this->extensions as $extension) { Chris@0: if (method_exists($extension, $method)) { Chris@0: return call_user_func_array([$extension, $method], $args); Chris@0: } Chris@0: } Chris@0: throw new Exception\RuntimeException(sprintf( Chris@0: 'Method: %s does not exist and could not be located on a registered Extension', Chris@0: $method Chris@0: )); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Load extensions from Zend\Feed\Reader\Reader Chris@0: * Chris@0: * @return void Chris@0: */ Chris@0: protected function loadExtensions() Chris@0: { Chris@0: $all = Reader\Reader::getExtensions(); Chris@0: $manager = Reader\Reader::getExtensionManager(); Chris@0: $feed = $all['entry']; Chris@0: foreach ($feed as $extension) { Chris@0: if (in_array($extension, $all['core'])) { Chris@0: continue; Chris@0: } Chris@0: $plugin = $manager->get($extension); Chris@0: $plugin->setEntryElement($this->getElement()); Chris@0: $plugin->setEntryKey($this->entryKey); Chris@0: $plugin->setType($this->data['type']); Chris@0: $this->extensions[$extension] = $plugin; Chris@0: } Chris@0: } Chris@0: }