From 4e36640c238b82716e0fee90304a5e8120b0d695 Mon Sep 17 00:00:00 2001 From: Jeff Teunissen <deek@d2dc.net> Date: Tue, 9 Aug 2011 22:36:03 -0400 Subject: [PATCH] Generate a basic RSS feed from the news It's for Ohloh. --- lib/date.inc | 10 +++++++++- lib/news.inc | 49 ++++++++++++++++++++++++++++++++++++++++--------- rss.php | 20 ++++++++++++++++++++ 3 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 rss.php diff --git a/lib/date.inc b/lib/date.inc index 700808c..d01adae 100644 --- a/lib/date.inc +++ b/lib/date.inc @@ -37,7 +37,15 @@ return substr ($date, 3) . ' ' . $shortMonths[substr ($date, 1, 2)]; } - + + function RFCDateFromSQLDateTime ($sqlDateTime) + { + $dtime = explode ( ' ', $sqlDateTime); + $date = explode ( '-', $dtime[0]); + $time = explode ( ':', $dtime[1]); + return strftime ( '%a, %d %b %Y %R GMT', mktime ($time[0], $time[1], $time[2], $date[1], $date[2], $date[0])); + } + function dateFromSQLDateTime ($sqlDateTime) { $time = explode ( ' ', $sqlDateTime); diff --git a/lib/news.inc b/lib/news.inc index 7565805..39b3a51 100644 --- a/lib/news.inc +++ b/lib/news.inc @@ -37,6 +37,10 @@ $createQuery="CREATE TABLE news_main (" function formatNews ($date, $user, $text) { + need ('date'); + + $date = dateFromSQLDateTime ($date); + return "<DL>\n" .' <DT>' . "<EM>Posted on </EM>$date<EM> by </EM><STRONG>$user</STRONG>" @@ -45,12 +49,29 @@ function formatNews ($date, $user, $text) ."</DL>\n"; } - -function formatNewsArray ($a) +function formatNewsRSS ($date, $user, $text) { need ('date'); - return formatNews (dateFromSQLDateTime ($a['n_date']), $a['n_user'], stripSlashes($a['n_news'])); + $rfcDate = RFCDateFromSQLDateTime ($date); + $humanDate = dateFromSQLDateTime ($date); + + return "<item><title>QF News for $humanDate (posted by $user)</title>\n" + ."<link>http://www.quakeforge.net/</link>\n" + ."<pubDate>$rfcDate</pubDate>" + ."<author>$user</author>" + ."<description><![CDATA[$text]]></description>" + ."</item>\n"; +} + +function formatNewsArray ($a) +{ + return formatNews ($a['n_date'], $a['n_user'], stripSlashes($a['n_news'])); +} + +function formatNewsArrayRSS ($a) +{ + return formatNewsRSS ($a['n_date'], $a['n_user'], stripSlashes($a['n_news'])); } @@ -79,17 +100,27 @@ function latestNews ($max=5) function printLatestNews ($max=5) { - $filler = date ('d M Y'); + $filler = date ('d-M-Y H:i:s'); $entries = latestNews ($max); + global $newsFormat; + + if ($newsFormat && strtolower($newsFormat) == 'rss') { + $fmt = 'formatNewsRSS'; + } else { + $fmt = 'formatNews'; + } if ($entries === true) { // success, but no data - printNews ($filler, 'Web Server', 'Nobody has posted news yet, so I got nothing to say right now.'); + echo $fmt($filler, 'Web Server', 'Nobody has posted news yet, so I got nothing to say right now.'); } elseif ($entries === false) { // bad query - printNews ($filler, 'Web Server', 'Got an error while finding news. Bug a project administrator, eh?'); + echo $fmt($filler, 'Web Server', 'Got an error while finding news. Bug a project administrator, eh?'); } elseif ($entries === null) { // boom - printNews ($filler, 'Web Server', 'Couldn\'t connect to the project news server...Sorry.'); - } else for ($i = 0; $i < count ($entries); $i++) { - printNewsArray ($entries[$i]); + echo $fmt($filler, 'Web Server', 'Couldn\'t connect to the project news server...Sorry.'); + } else { + for ($i = 0; $i < count ($entries); $i++) { + echo $fmt($entries[$i]['n_date'], $entries[$i]['n_user'], + stripSlashes($entries[$i]['n_news'])); + } } } diff --git a/rss.php b/rss.php new file mode 100644 index 0000000..8a93a1c --- /dev/null +++ b/rss.php @@ -0,0 +1,20 @@ +<? + define ('siteHome', "/home/project-web/quake/htdocs"); + require siteHome . "/parts/library.inc"; // Load function library + + header ("Content-Type: text/xml"); + echo('<?xml version="1.0" encoding="utf-8"?>' . "\n"); +?> +<rss version="2.0"> +<channel> +<title>QuakeForge News</title> +<description>Latest QuakeForge Project news</description> +<link>http://www.quakeforge.net/</link> +<copyright>Copyright 1999-2011 Contributors of the QuakeForge Project</copyright> +<? + $newsFormat = "RSS"; + + need ('news'); + printLatestNews (5); +?> +</rss>