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"}