diff options
author | ArthurHoaro <arthur@hoa.ro> | 2016-08-03 09:45:28 +0200 |
---|---|---|
committer | ArthurHoaro <arthur@hoa.ro> | 2016-08-03 09:54:57 +0200 |
commit | c6d876bb2afe7e9ec1a64c74e766360e2fa441e0 (patch) | |
tree | f1e704d6c937ac6aec8814141cbb2f1e40e5ba88 | |
parent | 9646b7da22c4c6f3419bfe51431720dd622374d8 (diff) | |
download | Shaarli-c6d876bb2afe7e9ec1a64c74e766360e2fa441e0.tar.gz Shaarli-c6d876bb2afe7e9ec1a64c74e766360e2fa441e0.tar.zst Shaarli-c6d876bb2afe7e9ec1a64c74e766360e2fa441e0.zip |
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
-rw-r--r-- | application/FeedBuilder.php | 38 | ||||
-rw-r--r-- | tests/FeedBuilderTest.php | 14 | ||||
-rw-r--r-- | tests/utils/ReferenceLinkDB.php | 6 | ||||
-rw-r--r-- | tpl/feed.atom.html | 3 | ||||
-rw-r--r-- | tpl/feed.rss.html | 3 |
5 files changed, 51 insertions, 13 deletions
diff --git a/application/FeedBuilder.php b/application/FeedBuilder.php index ddefe6ce..58c6bb17 100644 --- a/application/FeedBuilder.php +++ b/application/FeedBuilder.php | |||
@@ -154,17 +154,23 @@ class FeedBuilder | |||
154 | } | 154 | } |
155 | $link['description'] = format_description($link['description']) . PHP_EOL .'<br>— '. $permalink; | 155 | $link['description'] = format_description($link['description']) . PHP_EOL .'<br>— '. $permalink; |
156 | 156 | ||
157 | $date = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['linkdate']); | 157 | $pubDate = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['linkdate']); |
158 | $link['pub_iso_date'] = $this->getIsoDate($pubDate); | ||
158 | 159 | ||
159 | if ($this->feedType == self::$FEED_RSS) { | 160 | // atom:entry elements MUST contain exactly one atom:updated element. |
160 | $link['iso_date'] = $date->format(DateTime::RSS); | 161 | if (!empty($link['updated'])) { |
162 | $upDate = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['updated']); | ||
163 | $link['up_iso_date'] = $this->getIsoDate($upDate, DateTime::ATOM); | ||
161 | } else { | 164 | } else { |
162 | $link['iso_date'] = $date->format(DateTime::ATOM); | 165 | $link['up_iso_date'] = $this->getIsoDate($pubDate, DateTime::ATOM);; |
163 | } | 166 | } |
164 | 167 | ||
165 | // Save the more recent item. | 168 | // Save the more recent item. |
166 | if (empty($this->latestDate) || $this->latestDate < $date) { | 169 | if (empty($this->latestDate) || $this->latestDate < $pubDate) { |
167 | $this->latestDate = $date; | 170 | $this->latestDate = $pubDate; |
171 | } | ||
172 | if (!empty($upDate) && $this->latestDate < $upDate) { | ||
173 | $this->latestDate = $upDate; | ||
168 | } | 174 | } |
169 | 175 | ||
170 | $taglist = array_filter(explode(' ', $link['tags']), 'strlen'); | 176 | $taglist = array_filter(explode(' ', $link['tags']), 'strlen'); |
@@ -250,6 +256,26 @@ class FeedBuilder | |||
250 | } | 256 | } |
251 | 257 | ||
252 | /** | 258 | /** |
259 | * Get ISO date from DateTime according to feed type. | ||
260 | * | ||
261 | * @param DateTime $date Date to format. | ||
262 | * @param string|bool $format Force format. | ||
263 | * | ||
264 | * @return string Formatted date. | ||
265 | */ | ||
266 | protected function getIsoDate(DateTime $date, $format = false) | ||
267 | { | ||
268 | if ($format !== false) { | ||
269 | return $date->format($format); | ||
270 | } | ||
271 | if ($this->feedType == self::$FEED_RSS) { | ||
272 | return $date->format(DateTime::RSS); | ||
273 | |||
274 | } | ||
275 | return $date->format(DateTime::ATOM); | ||
276 | } | ||
277 | |||
278 | /** | ||
253 | * Returns the number of link to display according to 'nb' user input parameter. | 279 | * Returns the number of link to display according to 'nb' user input parameter. |
254 | * | 280 | * |
255 | * If 'nb' not set or invalid, default value: $DEFAULT_NB_LINKS. | 281 | * If 'nb' not set or invalid, default value: $DEFAULT_NB_LINKS. |
diff --git a/tests/FeedBuilderTest.php b/tests/FeedBuilderTest.php index 460fb0c5..c9ff397d 100644 --- a/tests/FeedBuilderTest.php +++ b/tests/FeedBuilderTest.php | |||
@@ -76,7 +76,7 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase | |||
76 | // Test headers (RSS) | 76 | // Test headers (RSS) |
77 | $this->assertEquals(self::$RSS_LANGUAGE, $data['language']); | 77 | $this->assertEquals(self::$RSS_LANGUAGE, $data['language']); |
78 | $this->assertEmpty($data['pubsubhub_url']); | 78 | $this->assertEmpty($data['pubsubhub_url']); |
79 | $this->assertRegExp('/Tue, 10 Mar 2015 11:46:51 \+\d{4}/', $data['last_update']); | 79 | $this->assertRegExp('/Wed, 03 Aug 2016 09:30:33 \+\d{4}/', $data['last_update']); |
80 | $this->assertEquals(true, $data['show_dates']); | 80 | $this->assertEquals(true, $data['show_dates']); |
81 | $this->assertEquals('http://host.tld/index.php?do=feed', $data['self_link']); | 81 | $this->assertEquals('http://host.tld/index.php?do=feed', $data['self_link']); |
82 | $this->assertEquals('http://host.tld/', $data['index_url']); | 82 | $this->assertEquals('http://host.tld/', $data['index_url']); |
@@ -88,7 +88,10 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase | |||
88 | $this->assertEquals('20150310_114651', $link['linkdate']); | 88 | $this->assertEquals('20150310_114651', $link['linkdate']); |
89 | $this->assertEquals('http://host.tld/?WDWyig', $link['guid']); | 89 | $this->assertEquals('http://host.tld/?WDWyig', $link['guid']); |
90 | $this->assertEquals('http://host.tld/?WDWyig', $link['url']); | 90 | $this->assertEquals('http://host.tld/?WDWyig', $link['url']); |
91 | $this->assertRegExp('/Tue, 10 Mar 2015 11:46:51 \+\d{4}/', $link['iso_date']); | 91 | $this->assertRegExp('/Tue, 10 Mar 2015 11:46:51 \+\d{4}/', $link['pub_iso_date']); |
92 | $pub = DateTime::createFromFormat(DateTime::RSS, $link['pub_iso_date']); | ||
93 | $up = DateTime::createFromFormat(DateTime::ATOM, $link['up_iso_date']); | ||
94 | $this->assertEquals($pub, $up); | ||
92 | $this->assertContains('Stallman has a beard', $link['description']); | 95 | $this->assertContains('Stallman has a beard', $link['description']); |
93 | $this->assertContains('Permalink', $link['description']); | 96 | $this->assertContains('Permalink', $link['description']); |
94 | $this->assertContains('http://host.tld/?WDWyig', $link['description']); | 97 | $this->assertContains('http://host.tld/?WDWyig', $link['description']); |
@@ -101,6 +104,9 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase | |||
101 | // Test multitags. | 104 | // Test multitags. |
102 | $this->assertEquals(5, count($data['links']['20141125_084734']['taglist'])); | 105 | $this->assertEquals(5, count($data['links']['20141125_084734']['taglist'])); |
103 | $this->assertEquals('css', $data['links']['20141125_084734']['taglist'][0]); | 106 | $this->assertEquals('css', $data['links']['20141125_084734']['taglist'][0]); |
107 | |||
108 | // Test update date | ||
109 | $this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['links']['20150310_114633']['up_iso_date']); | ||
104 | } | 110 | } |
105 | 111 | ||
106 | /** | 112 | /** |
@@ -112,8 +118,10 @@ class FeedBuilderTest extends PHPUnit_Framework_TestCase | |||
112 | $feedBuilder->setLocale(self::$LOCALE); | 118 | $feedBuilder->setLocale(self::$LOCALE); |
113 | $data = $feedBuilder->buildData(); | 119 | $data = $feedBuilder->buildData(); |
114 | $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links'])); | 120 | $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links'])); |
121 | $this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['last_update']); | ||
115 | $link = array_shift($data['links']); | 122 | $link = array_shift($data['links']); |
116 | $this->assertRegExp('/2015-03-10T11:46:51\+\d{2}:+\d{2}/', $link['iso_date']); | 123 | $this->assertRegExp('/2015-03-10T11:46:51\+\d{2}:\d{2}/', $link['pub_iso_date']); |
124 | $this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['links']['20150310_114633']['up_iso_date']); | ||
117 | } | 125 | } |
118 | 126 | ||
119 | /** | 127 | /** |
diff --git a/tests/utils/ReferenceLinkDB.php b/tests/utils/ReferenceLinkDB.php index fcc7a4f9..937961c8 100644 --- a/tests/utils/ReferenceLinkDB.php +++ b/tests/utils/ReferenceLinkDB.php | |||
@@ -30,7 +30,8 @@ class ReferenceLinkDB | |||
30 | 'Richard Stallman and the Free Software Revolution. Read this. #hashtag', | 30 | 'Richard Stallman and the Free Software Revolution. Read this. #hashtag', |
31 | 0, | 31 | 0, |
32 | '20150310_114633', | 32 | '20150310_114633', |
33 | 'free gnu software stallman -exclude stuff hashtag' | 33 | 'free gnu software stallman -exclude stuff hashtag', |
34 | '20160803_093033' | ||
34 | ); | 35 | ); |
35 | 36 | ||
36 | $this->addLink( | 37 | $this->addLink( |
@@ -82,7 +83,7 @@ class ReferenceLinkDB | |||
82 | /** | 83 | /** |
83 | * Adds a new link | 84 | * Adds a new link |
84 | */ | 85 | */ |
85 | protected function addLink($title, $url, $description, $private, $date, $tags) | 86 | protected function addLink($title, $url, $description, $private, $date, $tags, $updated = '') |
86 | { | 87 | { |
87 | $link = array( | 88 | $link = array( |
88 | 'title' => $title, | 89 | 'title' => $title, |
@@ -91,6 +92,7 @@ class ReferenceLinkDB | |||
91 | 'private' => $private, | 92 | 'private' => $private, |
92 | 'linkdate' => $date, | 93 | 'linkdate' => $date, |
93 | 'tags' => $tags, | 94 | 'tags' => $tags, |
95 | 'updated' => $updated, | ||
94 | ); | 96 | ); |
95 | $this->_links[$date] = $link; | 97 | $this->_links[$date] = $link; |
96 | 98 | ||
diff --git a/tpl/feed.atom.html b/tpl/feed.atom.html index 2ebb162a..1932f507 100644 --- a/tpl/feed.atom.html +++ b/tpl/feed.atom.html | |||
@@ -27,7 +27,8 @@ | |||
27 | {/if} | 27 | {/if} |
28 | <id>{$value.guid}</id> | 28 | <id>{$value.guid}</id> |
29 | {if="$show_dates"} | 29 | {if="$show_dates"} |
30 | <updated>{$value.iso_date}</updated> | 30 | <published>{$value.pub_iso_date}</published> |
31 | <updated>{$value.up_iso_date}</updated> | ||
31 | {/if} | 32 | {/if} |
32 | <content type="html" xml:lang="{$language}"> | 33 | <content type="html" xml:lang="{$language}"> |
33 | <![CDATA[{$value.description}]]> | 34 | <![CDATA[{$value.description}]]> |
diff --git a/tpl/feed.rss.html b/tpl/feed.rss.html index 26de7f19..4bfe4196 100644 --- a/tpl/feed.rss.html +++ b/tpl/feed.rss.html | |||
@@ -22,7 +22,8 @@ | |||
22 | <link>{$value.url}</link> | 22 | <link>{$value.url}</link> |
23 | {/if} | 23 | {/if} |
24 | {if="$show_dates"} | 24 | {if="$show_dates"} |
25 | <pubDate>{$value.iso_date}</pubDate> | 25 | <pubDate>{$value.pub_iso_date}</pubDate> |
26 | <atom:modified>{$value.up_iso_date}</atom:modified> | ||
26 | {/if} | 27 | {/if} |
27 | <description><![CDATA[{$value.description}]]></description> | 28 | <description><![CDATA[{$value.description}]]></description> |
28 | {loop="$value.taglist"} | 29 | {loop="$value.taglist"} |