aboutsummaryrefslogtreecommitdiff
path: root/formats/AtomFormat.php
diff options
context:
space:
mode:
Diffstat (limited to 'formats/AtomFormat.php')
-rw-r--r--formats/AtomFormat.php356
1 files changed, 182 insertions, 174 deletions
diff --git a/formats/AtomFormat.php b/formats/AtomFormat.php
index 3d9b7c93..5f564266 100644
--- a/formats/AtomFormat.php
+++ b/formats/AtomFormat.php
@@ -1,4 +1,5 @@
<?php
+
/**
* AtomFormat - RFC 4287: The Atom Syndication Format
* https://tools.ietf.org/html/rfc4287
@@ -6,178 +7,185 @@
* Validator:
* https://validator.w3.org/feed/
*/
-class AtomFormat extends FormatAbstract{
- const MIME_TYPE = 'application/atom+xml';
-
- protected const ATOM_NS = 'http://www.w3.org/2005/Atom';
- protected const MRSS_NS = 'http://search.yahoo.com/mrss/';
-
- const LIMIT_TITLE = 140;
-
- public function stringify(){
- $urlPrefix = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://';
- $urlHost = (isset($_SERVER['HTTP_HOST'])) ? $_SERVER['HTTP_HOST'] : '';
- $urlPath = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : '';
- $urlRequest = (isset($_SERVER['REQUEST_URI'])) ? $_SERVER['REQUEST_URI'] : '';
-
- $feedUrl = $urlPrefix . $urlHost . $urlRequest;
-
- $extraInfos = $this->getExtraInfos();
- $uri = !empty($extraInfos['uri']) ? $extraInfos['uri'] : REPOSITORY;
-
- $document = new DomDocument('1.0', $this->getCharset());
- $document->formatOutput = true;
- $feed = $document->createElementNS(self::ATOM_NS, 'feed');
- $document->appendChild($feed);
- $feed->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:media', self::MRSS_NS);
-
- $title = $document->createElement('title');
- $feed->appendChild($title);
- $title->setAttribute('type', 'text');
- $title->appendChild($document->createTextNode($extraInfos['name']));
-
- $id = $document->createElement('id');
- $feed->appendChild($id);
- $id->appendChild($document->createTextNode($feedUrl));
-
- $uriparts = parse_url($uri);
- if(!empty($extraInfos['icon'])) {
- $iconUrl = $extraInfos['icon'];
- } else {
- $iconUrl = $uriparts['scheme'] . '://' . $uriparts['host'] . '/favicon.ico';
- }
- $icon = $document->createElement('icon');
- $feed->appendChild($icon);
- $icon->appendChild($document->createTextNode($iconUrl));
-
- $logo = $document->createElement('logo');
- $feed->appendChild($logo);
- $logo->appendChild($document->createTextNode($iconUrl));
-
- $feedTimestamp = gmdate(DATE_ATOM, $this->lastModified);
- $updated = $document->createElement('updated');
- $feed->appendChild($updated);
- $updated->appendChild($document->createTextNode($feedTimestamp));
-
- // since we can't guarantee that all items have an author,
- // a global feed author is mandatory
- $feedAuthor = 'RSS-Bridge';
- $author = $document->createElement('author');
- $feed->appendChild($author);
- $authorName = $document->createElement('name');
- $author->appendChild($authorName);
- $authorName->appendChild($document->createTextNode($feedAuthor));
-
- $linkAlternate = $document->createElement('link');
- $feed->appendChild($linkAlternate);
- $linkAlternate->setAttribute('rel', 'alternate');
- $linkAlternate->setAttribute('type', 'text/html');
- $linkAlternate->setAttribute('href', $uri);
-
- $linkSelf = $document->createElement('link');
- $feed->appendChild($linkSelf);
- $linkSelf->setAttribute('rel', 'self');
- $linkSelf->setAttribute('type', 'application/atom+xml');
- $linkSelf->setAttribute('href', $feedUrl);
-
- foreach($this->getItems() as $item) {
- $entryTimestamp = $item->getTimestamp();
- $entryTitle = $item->getTitle();
- $entryContent = $item->getContent();
- $entryUri = $item->getURI();
- $entryID = '';
-
- if (!empty($item->getUid()))
- $entryID = 'urn:sha1:' . $item->getUid();
-
- if (empty($entryID)) // Fallback to provided URI
- $entryID = $entryUri;
-
- if (empty($entryID)) // Fallback to title and content
- $entryID = 'urn:sha1:' . hash('sha1', $entryTitle . $entryContent);
-
- if (empty($entryTimestamp))
- $entryTimestamp = $this->lastModified;
-
- if (empty($entryTitle)) {
- $entryTitle = str_replace("\n", ' ', strip_tags($entryContent));
- if (strlen($entryTitle) > self::LIMIT_TITLE) {
- $wrapPos = strpos(wordwrap($entryTitle, self::LIMIT_TITLE), "\n");
- $entryTitle = substr($entryTitle, 0, $wrapPos) . '...';
- }
- }
-
- if (empty($entryContent))
- $entryContent = ' ';
-
- $entry = $document->createElement('entry');
- $feed->appendChild($entry);
-
- $title = $document->createElement('title');
- $entry->appendChild($title);
- $title->setAttribute('type', 'html');
- $title->appendChild($document->createTextNode($entryTitle));
-
- $entryTimestamp = gmdate(DATE_ATOM, $entryTimestamp);
- $published = $document->createElement('published');
- $entry->appendChild($published);
- $published->appendChild($document->createTextNode($entryTimestamp));
-
- $updated = $document->createElement('updated');
- $entry->appendChild($updated);
- $updated->appendChild($document->createTextNode($entryTimestamp));
-
- $id = $document->createElement('id');
- $entry->appendChild($id);
- $id->appendChild($document->createTextNode($entryID));
-
- if (!empty($entryUri)) {
- $entryLinkAlternate = $document->createElement('link');
- $entry->appendChild($entryLinkAlternate);
- $entryLinkAlternate->setAttribute('rel', 'alternate');
- $entryLinkAlternate->setAttribute('type', 'text/html');
- $entryLinkAlternate->setAttribute('href', $entryUri);
- }
-
- if (!empty($item->getAuthor())) {
- $author = $document->createElement('author');
- $entry->appendChild($author);
- $authorName = $document->createElement('name');
- $author->appendChild($authorName);
- $authorName->appendChild($document->createTextNode($item->getAuthor()));
- }
-
- $content = $document->createElement('content');
- $content->setAttribute('type', 'html');
- $content->appendChild($document->createTextNode($this->sanitizeHtml($entryContent)));
- $entry->appendChild($content);
-
- foreach($item->getEnclosures() as $enclosure) {
- $entryEnclosure = $document->createElement('link');
- $entry->appendChild($entryEnclosure);
- $entryEnclosure->setAttribute('rel', 'enclosure');
- $entryEnclosure->setAttribute('type', getMimeType($enclosure));
- $entryEnclosure->setAttribute('href', $enclosure);
- }
-
- foreach($item->getCategories() as $category) {
- $entryCategory = $document->createElement('category');
- $entry->appendChild($entryCategory);
- $entryCategory->setAttribute('term', $category);
- }
-
- if (!empty($item->thumbnail)) {
- $thumbnail = $document->createElementNS(self::MRSS_NS, 'thumbnail');
- $entry->appendChild($thumbnail);
- $thumbnail->setAttribute('url', $item->thumbnail);
- }
- }
-
- $toReturn = $document->saveXML();
-
- // Remove invalid characters
- ini_set('mbstring.substitute_character', 'none');
- $toReturn = mb_convert_encoding($toReturn, $this->getCharset(), 'UTF-8');
- return $toReturn;
- }
+class AtomFormat extends FormatAbstract
+{
+ const MIME_TYPE = 'application/atom+xml';
+
+ protected const ATOM_NS = 'http://www.w3.org/2005/Atom';
+ protected const MRSS_NS = 'http://search.yahoo.com/mrss/';
+
+ const LIMIT_TITLE = 140;
+
+ public function stringify()
+ {
+ $urlPrefix = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://';
+ $urlHost = (isset($_SERVER['HTTP_HOST'])) ? $_SERVER['HTTP_HOST'] : '';
+ $urlPath = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : '';
+ $urlRequest = (isset($_SERVER['REQUEST_URI'])) ? $_SERVER['REQUEST_URI'] : '';
+
+ $feedUrl = $urlPrefix . $urlHost . $urlRequest;
+
+ $extraInfos = $this->getExtraInfos();
+ $uri = !empty($extraInfos['uri']) ? $extraInfos['uri'] : REPOSITORY;
+
+ $document = new DomDocument('1.0', $this->getCharset());
+ $document->formatOutput = true;
+ $feed = $document->createElementNS(self::ATOM_NS, 'feed');
+ $document->appendChild($feed);
+ $feed->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:media', self::MRSS_NS);
+
+ $title = $document->createElement('title');
+ $feed->appendChild($title);
+ $title->setAttribute('type', 'text');
+ $title->appendChild($document->createTextNode($extraInfos['name']));
+
+ $id = $document->createElement('id');
+ $feed->appendChild($id);
+ $id->appendChild($document->createTextNode($feedUrl));
+
+ $uriparts = parse_url($uri);
+ if (!empty($extraInfos['icon'])) {
+ $iconUrl = $extraInfos['icon'];
+ } else {
+ $iconUrl = $uriparts['scheme'] . '://' . $uriparts['host'] . '/favicon.ico';
+ }
+ $icon = $document->createElement('icon');
+ $feed->appendChild($icon);
+ $icon->appendChild($document->createTextNode($iconUrl));
+
+ $logo = $document->createElement('logo');
+ $feed->appendChild($logo);
+ $logo->appendChild($document->createTextNode($iconUrl));
+
+ $feedTimestamp = gmdate(DATE_ATOM, $this->lastModified);
+ $updated = $document->createElement('updated');
+ $feed->appendChild($updated);
+ $updated->appendChild($document->createTextNode($feedTimestamp));
+
+ // since we can't guarantee that all items have an author,
+ // a global feed author is mandatory
+ $feedAuthor = 'RSS-Bridge';
+ $author = $document->createElement('author');
+ $feed->appendChild($author);
+ $authorName = $document->createElement('name');
+ $author->appendChild($authorName);
+ $authorName->appendChild($document->createTextNode($feedAuthor));
+
+ $linkAlternate = $document->createElement('link');
+ $feed->appendChild($linkAlternate);
+ $linkAlternate->setAttribute('rel', 'alternate');
+ $linkAlternate->setAttribute('type', 'text/html');
+ $linkAlternate->setAttribute('href', $uri);
+
+ $linkSelf = $document->createElement('link');
+ $feed->appendChild($linkSelf);
+ $linkSelf->setAttribute('rel', 'self');
+ $linkSelf->setAttribute('type', 'application/atom+xml');
+ $linkSelf->setAttribute('href', $feedUrl);
+
+ foreach ($this->getItems() as $item) {
+ $entryTimestamp = $item->getTimestamp();
+ $entryTitle = $item->getTitle();
+ $entryContent = $item->getContent();
+ $entryUri = $item->getURI();
+ $entryID = '';
+
+ if (!empty($item->getUid())) {
+ $entryID = 'urn:sha1:' . $item->getUid();
+ }
+
+ if (empty($entryID)) { // Fallback to provided URI
+ $entryID = $entryUri;
+ }
+
+ if (empty($entryID)) { // Fallback to title and content
+ $entryID = 'urn:sha1:' . hash('sha1', $entryTitle . $entryContent);
+ }
+
+ if (empty($entryTimestamp)) {
+ $entryTimestamp = $this->lastModified;
+ }
+
+ if (empty($entryTitle)) {
+ $entryTitle = str_replace("\n", ' ', strip_tags($entryContent));
+ if (strlen($entryTitle) > self::LIMIT_TITLE) {
+ $wrapPos = strpos(wordwrap($entryTitle, self::LIMIT_TITLE), "\n");
+ $entryTitle = substr($entryTitle, 0, $wrapPos) . '...';
+ }
+ }
+
+ if (empty($entryContent)) {
+ $entryContent = ' ';
+ }
+
+ $entry = $document->createElement('entry');
+ $feed->appendChild($entry);
+
+ $title = $document->createElement('title');
+ $entry->appendChild($title);
+ $title->setAttribute('type', 'html');
+ $title->appendChild($document->createTextNode($entryTitle));
+
+ $entryTimestamp = gmdate(DATE_ATOM, $entryTimestamp);
+ $published = $document->createElement('published');
+ $entry->appendChild($published);
+ $published->appendChild($document->createTextNode($entryTimestamp));
+
+ $updated = $document->createElement('updated');
+ $entry->appendChild($updated);
+ $updated->appendChild($document->createTextNode($entryTimestamp));
+
+ $id = $document->createElement('id');
+ $entry->appendChild($id);
+ $id->appendChild($document->createTextNode($entryID));
+
+ if (!empty($entryUri)) {
+ $entryLinkAlternate = $document->createElement('link');
+ $entry->appendChild($entryLinkAlternate);
+ $entryLinkAlternate->setAttribute('rel', 'alternate');
+ $entryLinkAlternate->setAttribute('type', 'text/html');
+ $entryLinkAlternate->setAttribute('href', $entryUri);
+ }
+
+ if (!empty($item->getAuthor())) {
+ $author = $document->createElement('author');
+ $entry->appendChild($author);
+ $authorName = $document->createElement('name');
+ $author->appendChild($authorName);
+ $authorName->appendChild($document->createTextNode($item->getAuthor()));
+ }
+
+ $content = $document->createElement('content');
+ $content->setAttribute('type', 'html');
+ $content->appendChild($document->createTextNode($this->sanitizeHtml($entryContent)));
+ $entry->appendChild($content);
+
+ foreach ($item->getEnclosures() as $enclosure) {
+ $entryEnclosure = $document->createElement('link');
+ $entry->appendChild($entryEnclosure);
+ $entryEnclosure->setAttribute('rel', 'enclosure');
+ $entryEnclosure->setAttribute('type', getMimeType($enclosure));
+ $entryEnclosure->setAttribute('href', $enclosure);
+ }
+
+ foreach ($item->getCategories() as $category) {
+ $entryCategory = $document->createElement('category');
+ $entry->appendChild($entryCategory);
+ $entryCategory->setAttribute('term', $category);
+ }
+
+ if (!empty($item->thumbnail)) {
+ $thumbnail = $document->createElementNS(self::MRSS_NS, 'thumbnail');
+ $entry->appendChild($thumbnail);
+ $thumbnail->setAttribute('url', $item->thumbnail);
+ }
+ }
+
+ $toReturn = $document->saveXML();
+
+ // Remove invalid characters
+ ini_set('mbstring.substitute_character', 'none');
+ $toReturn = mb_convert_encoding($toReturn, $this->getCharset(), 'UTF-8');
+ return $toReturn;
+ }
}