From 9646b7da22c4c6f3419bfe51431720dd622374d8 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Wed, 3 Aug 2016 09:44:04 +0200 Subject: Save the update date in LinkDB and pass it to linklist templates It can be used as a timestamp by templates under the key 'updated_timestamp'. --- application/LinkDB.php | 3 ++- index.php | 12 +++++++++++- tpl/linklist.html | 11 ++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/application/LinkDB.php b/application/LinkDB.php index d80434bf..de9e73b0 100644 --- a/application/LinkDB.php +++ b/application/LinkDB.php @@ -12,8 +12,9 @@ * * Available keys: * - description: description of the entry - * - linkdate: date of the creation of this entry, in the form YYYYMMDD_HHMMSS + * - linkdate: creation date of this entry, format: YYYYMMDD_HHMMSS * (e.g.'20110914_192317') + * - updated: last modification date of this entry, format: YYYYMMDD_HHMMSS * - private: Is this link private? 0=no, other value=yes * - tags: tags attached to this entry (separated by spaces) * - title Title of the link diff --git a/index.php b/index.php index 55b12adc..d425afda 100644 --- a/index.php +++ b/index.php @@ -1227,6 +1227,9 @@ function renderPage($conf, $pluginManager) // -------- User clicked the "Save" button when editing a link: Save link to database. if (isset($_POST['save_edit'])) { + $linkdate = $_POST['lf_linkdate']; + $updated = isset($LINKSDB[$linkdate]) ? strval(date('Ymd_His')) : false; + // Go away! if (! tokenOk($_POST['token'])) { die('Wrong token.'); @@ -1237,7 +1240,7 @@ function renderPage($conf, $pluginManager) $tags = preg_replace('/(^| )\-/', '$1', $tags); // Remove duplicates. $tags = implode(' ', array_unique(explode(' ', $tags))); - $linkdate = $_POST['lf_linkdate']; + $url = trim($_POST['lf_url']); if (! startsWith($url, 'http:') && ! startsWith($url, 'https:') && ! startsWith($url, 'ftp:') && ! startsWith($url, 'magnet:') @@ -1252,6 +1255,7 @@ function renderPage($conf, $pluginManager) 'description' => $_POST['lf_description'], 'private' => (isset($_POST['lf_private']) ? 1 : 0), 'linkdate' => $linkdate, + 'updated' => $updated, 'tags' => str_replace(',', ' ', $tags) ); // If title is empty, use the URL as title. @@ -1696,6 +1700,12 @@ function buildLinkList($PAGE,$LINKSDB, $conf, $pluginManager) $link['class'] = $link['private'] == 0 ? $classLi : 'private'; $date = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['linkdate']); $link['timestamp'] = $date->getTimestamp(); + if (! empty($link['updated'])) { + $date = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['updated']); + $link['updated_timestamp'] = $date->getTimestamp(); + } else { + $link['updated_timestamp'] = ''; + } $taglist = explode(' ', $link['tags']); uasort($taglist, 'strcasecmp'); $link['taglist'] = $taglist; diff --git a/tpl/linklist.html b/tpl/linklist.html index 2316f145..9979f12a 100644 --- a/tpl/linklist.html +++ b/tpl/linklist.html @@ -89,7 +89,16 @@
{if="$value.description"}
{$value.description}
{/if} {if="!$hide_timestamps || isLoggedIn()"} - {function="strftime('%c', $value.timestamp)"} - permalink - + {$updated=$value.updated_timestamp ? 'Edited: '. strftime('%c', $value.updated_timestamp) : 'Permalink'} + + + + {function="strftime('%c', $value.timestamp)"} + {if="$value.updated_timestamp"}*{/if} + + - permalink + - + {else} permalink - {/if} -- cgit v1.2.3 From c6d876bb2afe7e9ec1a64c74e766360e2fa441e0 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Wed, 3 Aug 2016 09:45:28 +0200 Subject: 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 ddefe6ce..58c6bb17 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 460fb0c5..c9ff397d 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 fcc7a4f9..937961c8 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 2ebb162a..1932f507 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 26de7f19..4bfe4196 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"} -- cgit v1.2.3