annotate vendor/zendframework/zend-feed/src/Reader/FeedSet.php @ 2:5311817fb629

Theme updates
author Chris Cannam
date Tue, 10 Jul 2018 13:19:18 +0000
parents c75dbcec494b
children a9cd425dd02b
rev   line source
Chris@0 1 <?php
Chris@0 2 /**
Chris@0 3 * Zend Framework (http://framework.zend.com/)
Chris@0 4 *
Chris@0 5 * @link http://github.com/zendframework/zf2 for the canonical source repository
Chris@0 6 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
Chris@0 7 * @license http://framework.zend.com/license/new-bsd New BSD License
Chris@0 8 */
Chris@0 9
Chris@0 10 namespace Zend\Feed\Reader;
Chris@0 11
Chris@0 12 use ArrayObject;
Chris@0 13 use DOMNodeList;
Chris@0 14 use Zend\Feed\Uri;
Chris@0 15
Chris@0 16 class FeedSet extends ArrayObject
Chris@0 17 {
Chris@0 18 public $rss = null;
Chris@0 19
Chris@0 20 public $rdf = null;
Chris@0 21
Chris@0 22 public $atom = null;
Chris@0 23
Chris@0 24 /**
Chris@0 25 * Import a DOMNodeList from any document containing a set of links
Chris@0 26 * for alternate versions of a document, which will normally refer to
Chris@0 27 * RSS/RDF/Atom feeds for the current document.
Chris@0 28 *
Chris@0 29 * All such links are stored internally, however the first instance of
Chris@0 30 * each RSS, RDF or Atom type has its URI stored as a public property
Chris@0 31 * as a shortcut where the use case is simply to get a quick feed ref.
Chris@0 32 *
Chris@0 33 * Note that feeds are not loaded at this point, but will be lazy
Chris@0 34 * loaded automatically when each links 'feed' array key is accessed.
Chris@0 35 *
Chris@0 36 * @param DOMNodeList $links
Chris@0 37 * @param string $uri
Chris@0 38 * @return void
Chris@0 39 */
Chris@0 40 public function addLinks(DOMNodeList $links, $uri)
Chris@0 41 {
Chris@0 42 foreach ($links as $link) {
Chris@0 43 if (strtolower($link->getAttribute('rel')) !== 'alternate'
Chris@2 44 || ! $link->getAttribute('type') || ! $link->getAttribute('href')) {
Chris@0 45 continue;
Chris@0 46 }
Chris@2 47 if (! isset($this->rss) && $link->getAttribute('type') == 'application/rss+xml') {
Chris@0 48 $this->rss = $this->absolutiseUri(trim($link->getAttribute('href')), $uri);
Chris@2 49 } elseif (! isset($this->atom) && $link->getAttribute('type') == 'application/atom+xml') {
Chris@0 50 $this->atom = $this->absolutiseUri(trim($link->getAttribute('href')), $uri);
Chris@2 51 } elseif (! isset($this->rdf) && $link->getAttribute('type') == 'application/rdf+xml') {
Chris@0 52 $this->rdf = $this->absolutiseUri(trim($link->getAttribute('href')), $uri);
Chris@0 53 }
Chris@0 54 $this[] = new static([
Chris@0 55 'rel' => 'alternate',
Chris@0 56 'type' => $link->getAttribute('type'),
Chris@0 57 'href' => $this->absolutiseUri(trim($link->getAttribute('href')), $uri),
Chris@2 58 'title' => $link->getAttribute('title'),
Chris@0 59 ]);
Chris@0 60 }
Chris@0 61 }
Chris@0 62
Chris@0 63 /**
Chris@0 64 * Attempt to turn a relative URI into an absolute URI
Chris@2 65 *
Chris@2 66 * @param string $link
Chris@2 67 * @param string $uri OPTIONAL
Chris@2 68 * @return string|null absolutised link or null if invalid
Chris@0 69 */
Chris@0 70 protected function absolutiseUri($link, $uri = null)
Chris@0 71 {
Chris@0 72 $linkUri = Uri::factory($link);
Chris@2 73 if ($linkUri->isAbsolute()) {
Chris@2 74 // invalid absolute link can not be recovered
Chris@2 75 return $linkUri->isValid() ? $link : null;
Chris@2 76 }
Chris@0 77
Chris@2 78 $scheme = 'http';
Chris@2 79 if ($uri !== null) {
Chris@2 80 $uri = Uri::factory($uri);
Chris@2 81 $scheme = $uri->getScheme() ?: $scheme;
Chris@2 82 }
Chris@0 83
Chris@2 84 if ($linkUri->getHost()) {
Chris@2 85 $link = $this->resolveSchemeRelativeUri($link, $scheme);
Chris@2 86 } elseif ($uri !== null) {
Chris@2 87 $link = $this->resolveRelativeUri($link, $scheme, $uri->getHost(), $uri->getPath());
Chris@2 88 }
Chris@0 89
Chris@2 90 if (! Uri::factory($link)->isValid()) {
Chris@2 91 return null;
Chris@0 92 }
Chris@2 93
Chris@0 94 return $link;
Chris@0 95 }
Chris@0 96
Chris@0 97 /**
Chris@2 98 * Resolves scheme relative link to absolute
Chris@2 99 *
Chris@2 100 * @param string $link
Chris@2 101 * @param string $scheme
Chris@2 102 * @return string
Chris@2 103 */
Chris@2 104 private function resolveSchemeRelativeUri($link, $scheme)
Chris@2 105 {
Chris@2 106 $link = ltrim($link, '/');
Chris@2 107 return sprintf('%s://%s', $scheme, $link);
Chris@2 108 }
Chris@2 109
Chris@2 110 /**
Chris@2 111 * Resolves relative link to absolute
Chris@2 112 *
Chris@2 113 * @param string $link
Chris@2 114 * @param string $scheme
Chris@2 115 * @param string $host
Chris@2 116 * @param string $uriPath
Chris@2 117 * @return string
Chris@2 118 */
Chris@2 119 private function resolveRelativeUri($link, $scheme, $host, $uriPath)
Chris@2 120 {
Chris@2 121 if ($link[0] !== '/') {
Chris@2 122 $link = $uriPath . '/' . $link;
Chris@2 123 }
Chris@2 124 return sprintf(
Chris@2 125 '%s://%s/%s',
Chris@2 126 $scheme,
Chris@2 127 $host,
Chris@2 128 $this->canonicalizePath($link)
Chris@2 129 );
Chris@2 130 }
Chris@2 131
Chris@2 132 /**
Chris@0 133 * Canonicalize relative path
Chris@0 134 */
Chris@0 135 protected function canonicalizePath($path)
Chris@0 136 {
Chris@0 137 $parts = array_filter(explode('/', $path));
Chris@0 138 $absolutes = [];
Chris@0 139 foreach ($parts as $part) {
Chris@0 140 if ('.' == $part) {
Chris@0 141 continue;
Chris@0 142 }
Chris@0 143 if ('..' == $part) {
Chris@0 144 array_pop($absolutes);
Chris@0 145 } else {
Chris@0 146 $absolutes[] = $part;
Chris@0 147 }
Chris@0 148 }
Chris@0 149 return implode('/', $absolutes);
Chris@0 150 }
Chris@0 151
Chris@0 152 /**
Chris@0 153 * Supports lazy loading of feeds using Reader::import() but
Chris@0 154 * delegates any other operations to the parent class.
Chris@0 155 *
Chris@0 156 * @param string $offset
Chris@0 157 * @return mixed
Chris@0 158 */
Chris@0 159 public function offsetGet($offset)
Chris@0 160 {
Chris@2 161 if ($offset == 'feed' && ! $this->offsetExists('feed')) {
Chris@2 162 if (! $this->offsetExists('href')) {
Chris@0 163 return;
Chris@0 164 }
Chris@0 165 $feed = Reader::import($this->offsetGet('href'));
Chris@0 166 $this->offsetSet('feed', $feed);
Chris@0 167 return $feed;
Chris@0 168 }
Chris@0 169 return parent::offsetGet($offset);
Chris@0 170 }
Chris@0 171 }