aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorArthurHoaro <arthur@hoa.ro>2016-08-03 09:45:28 +0200
committerArthurHoaro <arthur@hoa.ro>2016-08-03 09:54:57 +0200
commitc6d876bb2afe7e9ec1a64c74e766360e2fa441e0 (patch)
treef1e704d6c937ac6aec8814141cbb2f1e40e5ba88
parent9646b7da22c4c6f3419bfe51431720dd622374d8 (diff)
downloadShaarli-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.php38
-rw-r--r--tests/FeedBuilderTest.php14
-rw-r--r--tests/utils/ReferenceLinkDB.php6
-rw-r--r--tpl/feed.atom.html3
-rw-r--r--tpl/feed.rss.html3
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>&#8212; '. $permalink; 155 $link['description'] = format_description($link['description']) . PHP_EOL .'<br>&#8212; '. $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"}