From c6d876bb2afe7e9ec1a64c74e766360e2fa441e0 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Wed, 3 Aug 2016 09:45:28 +0200 Subject: [PATCH] Set updated date for items in feeds RSS doesn't support updated date for items, so we use the ATOM extension. Updated dates also bump the global update --- application/FeedBuilder.php | 38 +++++++++++++++++++++++++++------ tests/FeedBuilderTest.php | 14 +++++++++--- tests/utils/ReferenceLinkDB.php | 6 ++++-- tpl/feed.atom.html | 3 ++- tpl/feed.rss.html | 3 ++- 5 files changed, 51 insertions(+), 13 deletions(-) diff --git a/application/FeedBuilder.php b/application/FeedBuilder.php index ddefe6c..58c6bb1 100644 --- a/application/FeedBuilder.php +++ b/application/FeedBuilder.php @@ -154,17 +154,23 @@ class FeedBuilder } $link['description'] = format_description($link['description']) . PHP_EOL .'
— '. $permalink; - $date = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['linkdate']); + $pubDate = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['linkdate']); + $link['pub_iso_date'] = $this->getIsoDate($pubDate); - if ($this->feedType == self::$FEED_RSS) { - $link['iso_date'] = $date->format(DateTime::RSS); + // atom:entry elements MUST contain exactly one atom:updated element. + if (!empty($link['updated'])) { + $upDate = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['updated']); + $link['up_iso_date'] = $this->getIsoDate($upDate, DateTime::ATOM); } else { - $link['iso_date'] = $date->format(DateTime::ATOM); + $link['up_iso_date'] = $this->getIsoDate($pubDate, DateTime::ATOM);; } // Save the more recent item. - if (empty($this->latestDate) || $this->latestDate < $date) { - $this->latestDate = $date; + if (empty($this->latestDate) || $this->latestDate < $pubDate) { + $this->latestDate = $pubDate; + } + if (!empty($upDate) && $this->latestDate < $upDate) { + $this->latestDate = $upDate; } $taglist = array_filter(explode(' ', $link['tags']), 'strlen'); @@ -249,6 +255,26 @@ class FeedBuilder return $this->latestDate->format($type); } + /** + * Get ISO date from DateTime according to feed type. + * + * @param DateTime $date Date to format. + * @param string|bool $format Force format. + * + * @return string Formatted date. + */ + protected function getIsoDate(DateTime $date, $format = false) + { + if ($format !== false) { + return $date->format($format); + } + if ($this->feedType == self::$FEED_RSS) { + return $date->format(DateTime::RSS); + + } + return $date->format(DateTime::ATOM); + } + /** * Returns the number of link to display according to 'nb' user input parameter. * diff --git a/tests/FeedBuilderTest.php b/tests/FeedBuilderTest.php index 460fb0c..c9ff397 100644 --- a/tests/FeedBuilderTest.php +++ b/tests/FeedBuilderTest.php @@ -76,7 +76,7 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase // Test headers (RSS) $this->assertEquals(self::$RSS_LANGUAGE, $data['language']); $this->assertEmpty($data['pubsubhub_url']); - $this->assertRegExp('/Tue, 10 Mar 2015 11:46:51 \+\d{4}/', $data['last_update']); + $this->assertRegExp('/Wed, 03 Aug 2016 09:30:33 \+\d{4}/', $data['last_update']); $this->assertEquals(true, $data['show_dates']); $this->assertEquals('http://host.tld/index.php?do=feed', $data['self_link']); $this->assertEquals('http://host.tld/', $data['index_url']); @@ -88,7 +88,10 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase $this->assertEquals('20150310_114651', $link['linkdate']); $this->assertEquals('http://host.tld/?WDWyig', $link['guid']); $this->assertEquals('http://host.tld/?WDWyig', $link['url']); - $this->assertRegExp('/Tue, 10 Mar 2015 11:46:51 \+\d{4}/', $link['iso_date']); + $this->assertRegExp('/Tue, 10 Mar 2015 11:46:51 \+\d{4}/', $link['pub_iso_date']); + $pub = DateTime::createFromFormat(DateTime::RSS, $link['pub_iso_date']); + $up = DateTime::createFromFormat(DateTime::ATOM, $link['up_iso_date']); + $this->assertEquals($pub, $up); $this->assertContains('Stallman has a beard', $link['description']); $this->assertContains('Permalink', $link['description']); $this->assertContains('http://host.tld/?WDWyig', $link['description']); @@ -101,6 +104,9 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase // Test multitags. $this->assertEquals(5, count($data['links']['20141125_084734']['taglist'])); $this->assertEquals('css', $data['links']['20141125_084734']['taglist'][0]); + + // Test update date + $this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['links']['20150310_114633']['up_iso_date']); } /** @@ -112,8 +118,10 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase $feedBuilder->setLocale(self::$LOCALE); $data = $feedBuilder->buildData(); $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links'])); + $this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['last_update']); $link = array_shift($data['links']); - $this->assertRegExp('/2015-03-10T11:46:51\+\d{2}:+\d{2}/', $link['iso_date']); + $this->assertRegExp('/2015-03-10T11:46:51\+\d{2}:\d{2}/', $link['pub_iso_date']); + $this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['links']['20150310_114633']['up_iso_date']); } /** diff --git a/tests/utils/ReferenceLinkDB.php b/tests/utils/ReferenceLinkDB.php index fcc7a4f..937961c 100644 --- a/tests/utils/ReferenceLinkDB.php +++ b/tests/utils/ReferenceLinkDB.php @@ -30,7 +30,8 @@ class ReferenceLinkDB 'Richard Stallman and the Free Software Revolution. Read this. #hashtag', 0, '20150310_114633', - 'free gnu software stallman -exclude stuff hashtag' + 'free gnu software stallman -exclude stuff hashtag', + '20160803_093033' ); $this->addLink( @@ -82,7 +83,7 @@ class ReferenceLinkDB /** * Adds a new link */ - protected function addLink($title, $url, $description, $private, $date, $tags) + protected function addLink($title, $url, $description, $private, $date, $tags, $updated = '') { $link = array( 'title' => $title, @@ -91,6 +92,7 @@ class ReferenceLinkDB 'private' => $private, 'linkdate' => $date, 'tags' => $tags, + 'updated' => $updated, ); $this->_links[$date] = $link; diff --git a/tpl/feed.atom.html b/tpl/feed.atom.html index 2ebb162..1932f50 100644 --- a/tpl/feed.atom.html +++ b/tpl/feed.atom.html @@ -27,7 +27,8 @@ {/if} {$value.guid} {if="$show_dates"} - {$value.iso_date} + {$value.pub_iso_date} + {$value.up_iso_date} {/if} diff --git a/tpl/feed.rss.html b/tpl/feed.rss.html index 26de7f1..4bfe419 100644 --- a/tpl/feed.rss.html +++ b/tpl/feed.rss.html @@ -22,7 +22,8 @@ {$value.url} {/if} {if="$show_dates"} - {$value.iso_date} + {$value.pub_iso_date} + {$value.up_iso_date} {/if} {loop="$value.taglist"}