summaryrefslogtreecommitdiff
path: root/formats/AtomFormat.php
diff options
context:
space:
mode:
Diffstat (limited to 'formats/AtomFormat.php')
-rw-r--r--formats/AtomFormat.php97
1 files changed, 75 insertions, 22 deletions
diff --git a/formats/AtomFormat.php b/formats/AtomFormat.php
index bb5e30e..1159a61 100644
--- a/formats/AtomFormat.php
+++ b/formats/AtomFormat.php
@@ -1,21 +1,30 @@
<?php
/**
-* Atom
-* Documentation Source http://en.wikipedia.org/wiki/Atom_%28standard%29 and
-* http://tools.ietf.org/html/rfc4287
-*/
+ * AtomFormat - RFC 4287: The Atom Syndication Format
+ * https://tools.ietf.org/html/rfc4287
+ *
+ * Validator:
+ * https://validator.w3.org/feed/
+ */
class AtomFormat extends FormatAbstract{
+ const LIMIT_TITLE = 140;
+
public function stringify(){
- $https = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? 's' : '';
- $httpHost = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '';
- $httpInfo = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
+ $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'] : '';
- $serverRequestUri = isset($_SERVER['REQUEST_URI']) ? $this->xml_encode($_SERVER['REQUEST_URI']) : '';
+ $feedUrl = $this->xml_encode($urlPrefix . $urlHost . $urlRequest);
$extraInfos = $this->getExtraInfos();
$title = $this->xml_encode($extraInfos['name']);
$uri = !empty($extraInfos['uri']) ? $extraInfos['uri'] : REPOSITORY;
+ // since we can't guarantee that all items have an author,
+ // a global feed author is mandatory
+ $feedAuthor = 'RSS-Bridge';
+
$uriparts = parse_url($uri);
if(!empty($extraInfos['icon'])) {
$icon = $extraInfos['icon'];
@@ -27,11 +36,40 @@ class AtomFormat extends FormatAbstract{
$entries = '';
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 = $this->xml_encode($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 = $entryTitle;
+
$entryAuthor = $this->xml_encode($item->getAuthor());
- $entryTitle = $this->xml_encode($item->getTitle());
- $entryUri = $this->xml_encode($item->getURI());
- $entryTimestamp = $this->xml_encode(date(DATE_ATOM, $item->getTimestamp()));
- $entryContent = $this->xml_encode($this->sanitizeHtml($item->getContent()));
+ $entryTitle = $this->xml_encode($entryTitle);
+ $entryUri = $this->xml_encode($entryUri);
+ $entryTimestamp = $this->xml_encode(gmdate(DATE_ATOM, $entryTimestamp));
+ $entryContent = $this->xml_encode($this->sanitizeHtml($entryContent));
$entryEnclosures = '';
foreach($item->getEnclosures() as $enclosure) {
@@ -49,16 +87,28 @@ class AtomFormat extends FormatAbstract{
. PHP_EOL;
}
+ $entryLinkAlternate = '';
+ if (!empty($entryUri)) {
+ $entryLinkAlternate = '<link rel="alternate" type="text/html" href="'
+ . $entryUri
+ . '"/>';
+ }
+
+ if (!empty($entryAuthor)) {
+ $entryAuthor = '<author><name>'
+ . $entryAuthor
+ . '</name></author>';
+ }
+
$entries .= <<<EOD
<entry>
- <author>
- <name>{$entryAuthor}</name>
- </author>
<title type="html">{$entryTitle}</title>
- <link rel="alternate" type="text/html" href="{$entryUri}" />
- <id>{$entryUri}</id>
+ <published>{$entryTimestamp}</published>
<updated>{$entryTimestamp}</updated>
+ <id>{$entryID}</id>
+ {$entryLinkAlternate}
+ {$entryAuthor}
<content type="html">{$entryContent}</content>
{$entryEnclosures}
{$entryCategories}
@@ -67,21 +117,24 @@ class AtomFormat extends FormatAbstract{
EOD;
}
- $feedTimestamp = date(DATE_ATOM, time());
- $charset = $this->getCharset();
+ $feedTimestamp = gmdate(DATE_ATOM, $this->lastModified);
+ $charset = $this->getCharset();
/* Data are prepared, now let's begin the "MAGIE !!!" */
$toReturn = <<<EOD
<?xml version="1.0" encoding="{$charset}"?>
-<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0">
+<feed xmlns="http://www.w3.org/2005/Atom">
<title type="text">{$title}</title>
- <id>http{$https}://{$httpHost}{$httpInfo}/</id>
+ <id>{$feedUrl}</id>
<icon>{$icon}</icon>
<logo>{$icon}</logo>
<updated>{$feedTimestamp}</updated>
+ <author>
+ <name>{$feedAuthor}</name>
+ </author>
<link rel="alternate" type="text/html" href="{$uri}" />
- <link rel="self" href="http{$https}://{$httpHost}{$serverRequestUri}" />
+ <link rel="self" type="application/atom+xml" href="{$feedUrl}" />
{$entries}
</feed>
EOD;