From a9723f67430a19d0d99b027b8e4e0f84f9f94849 Mon Sep 17 00:00:00 2001 From: "Edward Z. Yang" Date: Sat, 25 Apr 2009 04:32:28 -0400 Subject: [PATCH] Numerous improvements to newsfeed functionality. * Create abstract class XHTMLCompiler_DOMFilter_NewsBase which can be used to generate date nodes. * Added news:idPrefix, which can be used to resolve id conflicts. * Generate dates for permalinked news pages * Fix broken smoketest Signed-off-by: Edward Z. Yang --- XHTMLCompiler/DOMFilter/News.php | 17 +++++------------ XHTMLCompiler/DOMFilter/NewsBase.php | 21 +++++++++++++++++++++ XHTMLCompiler/DOMFilter/NewsDate.php | 20 ++++++++++++++++++++ XHTMLCompiler/DOMFilter/NewsLinker.php | 3 ++- XHTMLCompiler/FilterManager.php | 1 + common.php | 1 + config.filters.php | 1 + smoketests/DOMFilter/News.xhtml | 4 ++-- 8 files changed, 53 insertions(+), 15 deletions(-) create mode 100644 XHTMLCompiler/DOMFilter/NewsBase.php create mode 100644 XHTMLCompiler/DOMFilter/NewsDate.php diff --git a/XHTMLCompiler/DOMFilter/News.php b/XHTMLCompiler/DOMFilter/News.php index 478a4cd..45489fd 100644 --- a/XHTMLCompiler/DOMFilter/News.php +++ b/XHTMLCompiler/DOMFilter/News.php @@ -7,7 +7,7 @@ * it makes major changes to page content and may pull data from * sources that have not been processed yet. */ -class XHTMLCompiler_DOMFilter_News extends XHTMLCompiler_DOMFilter +class XHTMLCompiler_DOMFilter_News extends XHTMLCompiler_DOMFilter_NewsBase { protected $name = 'News'; protected $prefix = 'news'; @@ -38,6 +38,8 @@ class XHTMLCompiler_DOMFilter_News extends XHTMLCompiler_DOMFilter if (!$limit) $limit = 5; $header = $this->confiscateAttr($container, $this->ns, 'header'); if (!$header) $header = 'h2'; + $idPrefix = $this->confiscateAttr($container, $this->ns, 'idPrefix'); + if (!$idPrefix) $idPrefix = ''; $increase = $header[1] - 1; // amount increase sub-headings // Recursively glob for source files @@ -70,7 +72,7 @@ class XHTMLCompiler_DOMFilter_News extends XHTMLCompiler_DOMFilter // Generate ID for this entry. The format is // year-month-date-lc-title-with-dashes - $entryNode->setAttribute('id', $this->generateId($entryFile->getPathStem())); + $entryNode->setAttribute('id', $idPrefix . $this->generateId($entryFile->getPathStem())); // Grab the title $node = $subdom->getElementsByTagName('h1')->item(0); @@ -84,16 +86,7 @@ class XHTMLCompiler_DOMFilter_News extends XHTMLCompiler_DOMFilter // a timezone to be more like ours. $dateTime = $entryFile->getCreatedTime(); if ($dateTime) { - $time = $dateTime->format('g:i A T'); - $date = $dateTime->format('l, F j, Y'); - $dateNode = $dom->createElement('div'); - $dateNode->setAttribute('class', 'date'); - $abbrNode = $dom->createElement('abbr'); - $abbrNode->setAttribute('class', 'at' . $dateTime->format('U')); - $dateText = $dom->createTextNode("Posted $time on $date"); - $abbrNode->appendChild($dateText); - $dateNode->appendChild($abbrNode); - $entryNode->appendChild($dateNode); + $entryNode->appendChild($this->makeDateNode($dom, $dateTime)); } // Grab the content diff --git a/XHTMLCompiler/DOMFilter/NewsBase.php b/XHTMLCompiler/DOMFilter/NewsBase.php new file mode 100644 index 0000000..8c3c8c5 --- /dev/null +++ b/XHTMLCompiler/DOMFilter/NewsBase.php @@ -0,0 +1,21 @@ +format('g:i A T'); + $date = $dateTime->format('l, F j, Y'); + $dateNode = $dom->createElement('div'); + $dateNode->setAttribute('class', 'date'); + $abbrNode = $dom->createElement('abbr'); + $abbrNode->setAttribute('class', 'at' . $dateTime->format('U')); + $dateText = $dom->createTextNode("Posted $time on $date"); + $abbrNode->appendChild($dateText); + $dateNode->appendChild($abbrNode); + return $dateNode; + } +} + diff --git a/XHTMLCompiler/DOMFilter/NewsDate.php b/XHTMLCompiler/DOMFilter/NewsDate.php new file mode 100644 index 0000000..aba331f --- /dev/null +++ b/XHTMLCompiler/DOMFilter/NewsDate.php @@ -0,0 +1,20 @@ +attr['news'])) return; + $dateTime = $page->getCreatedTime(); + if (!$dateTime) return; + $content = $dom->getElementById('content'); + $body = $content->parentNode; + $date = $this->makeDateNode($dom, $dateTime); + $date->setAttribute('id', 'news-date'); + $body->insertBefore($date, $content); + } +} diff --git a/XHTMLCompiler/DOMFilter/NewsLinker.php b/XHTMLCompiler/DOMFilter/NewsLinker.php index 01f6c6c..5ccd4f6 100644 --- a/XHTMLCompiler/DOMFilter/NewsLinker.php +++ b/XHTMLCompiler/DOMFilter/NewsLinker.php @@ -35,7 +35,8 @@ class XHTMLCompiler_DOMFilter_NewsLinker extends XHTMLCompiler_DOMFilter } } - $body = $dom->getElementsByTagName('body')->item(0); + $content = $dom->getElementById('content'); + $body = $content->parentNode; $nav = $dom->createElement('div'); $nav->setAttribute('id', 'news-navigation'); diff --git a/XHTMLCompiler/FilterManager.php b/XHTMLCompiler/FilterManager.php index 6b2cf1a..01a31e2 100644 --- a/XHTMLCompiler/FilterManager.php +++ b/XHTMLCompiler/FilterManager.php @@ -279,6 +279,7 @@ class XHTMLCompiler_FilterManager * Adds validation errors to the output document as a message */ public function buildErrors($dom) { + // This should output some error to command line utility $body = $dom->getElementsByTagName('body')->item(0); if (!$body) { $dom->appendChild($html = $dom->createElement('html')); diff --git a/common.php b/common.php index 6c255e9..05dd94f 100644 --- a/common.php +++ b/common.php @@ -31,6 +31,7 @@ require_once 'XHTMLCompiler/Filter.php'; require_once 'XHTMLCompiler/FilterManager.php'; require_once 'XHTMLCompiler/TextFilter.php'; require_once 'XHTMLCompiler/DOMFilter.php'; +require_once 'XHTMLCompiler/DOMFilter/NewsBase.php'; set_exception_handler('xhtmlcompiler_exception_handler'); $xc = XHTMLCompiler::getInstance(); // invoke the super-object diff --git a/config.filters.php b/config.filters.php index 404165a..a812a2d 100644 --- a/config.filters.php +++ b/config.filters.php @@ -5,6 +5,7 @@ $filters->addDOMFilter('Metadata'); $filters->addDOMFilter('News'); $filters->addDOMFilter('NewsLinker'); +$filters->addDOMFilter('NewsDate'); $filters->addDOMFilter('GenerateTableOfContents'); $filters->addDOMFilter('Acronymizer'); $filters->addDOMFilter('Quoter'); diff --git a/smoketests/DOMFilter/News.xhtml b/smoketests/DOMFilter/News.xhtml index b12071d..16026f5 100644 --- a/smoketests/DOMFilter/News.xhtml +++ b/smoketests/DOMFilter/News.xhtml @@ -22,7 +22,7 @@

Only one news entry should be shown here:

-
+

Old entries

@@ -30,4 +30,4 @@

- \ No newline at end of file + -- 2.11.4.GIT