OSDN Git Service

BugTrack2/361 Simplify URL. Keep slash / and colon : in page name URL
[pukiwiki/pukiwiki.git] / plugin / rss.inc.php
index 444d09e..19faf42 100644 (file)
 <?php
-/////////////////////////////////////////////////
-// PukiWiki - Yet another WikiWikiWeb clone.
+// PukiWiki - Yet another WikiWikiWeb clone
+// $Id: rss.inc.php,v 1.21 2007/02/11 05:53:31 henoheno Exp $
 //
-// $Id: rss.inc.php,v 1.4 2003/06/09 07:56:58 arino Exp $
+// RSS plugin: Publishing RSS of RecentChanges
 //
-// RecentChanges ¤Î RSS ¤ò½ÐÎÏ
+// Usage: plugin=rss[&ver=[0.91|1.0|2.0]] (Default: 0.91)
+//
+// NOTE for acronyms
+//   RSS 0.9,  1.0  : RSS means 'RDF Site Summary'
+//   RSS 0.91, 0.92 : RSS means 'Rich Site Summary'
+//   RSS 2.0        : RSS means 'Really Simple Syndication' (born from RSS 0.92)
+
 function plugin_rss_action()
 {
-       global $rss_max,$page_title,$whatsnew;
-
-       $self = 'http://'.SERVER_NAME.PHP_SELF.'?';
-       
-       $page_title_utf8 = mb_convert_encoding($page_title,'UTF-8',SOURCE_ENCODING);
-       
-       $items = '';
-       
-       if (!file_exists(CACHE_DIR.'recent.dat'))
-       {
-               return '';
+       global $vars, $rss_max, $page_title, $whatsnew;
+
+       $version = isset($vars['ver']) ? $vars['ver'] : '';
+       switch($version){
+       case '':  $version = '0.91'; break; // Default
+       case '1': $version = '1.0';  break; // Sugar
+       case '2': $version = '2.0';  break; // Sugar
+       case '0.91': /* FALLTHROUGH */
+       case '1.0' : /* FALLTHROUGH */
+       case '2.0' : break;
+       default: die('Invalid RSS version!!');
        }
-       $recent = file(CACHE_DIR.'recent.dat');
-       $lines = array_splice($recent,0,$rss_max);
-       foreach ($lines as $line)
-       {
-               list($time,$page) = explode("\t",rtrim($line));
-               $r_page = rawurlencode($page);
-               $title = mb_convert_encoding($page,'UTF-8',SOURCE_ENCODING);
-               $desc = get_date('D, d M Y H:i:s T',$time);
-               $items .= <<<EOD
+
+       $recent = CACHE_DIR . 'recent.dat';
+       if (! file_exists($recent)) die('recent.dat is not found');
+
+       $lang = LANG;
+       $page_title_utf8 = mb_convert_encoding($page_title, 'UTF-8', SOURCE_ENCODING);
+       $self = get_script_uri();
+
+       // Creating <item>
+       $items = $rdf_li = '';
+
+       foreach (file_head($recent, $rss_max) as $line) {
+               list($time, $page) = explode("\t", rtrim($line));
+               $r_page = pagename_urlencode($page);
+               $title  = mb_convert_encoding($page, 'UTF-8', SOURCE_ENCODING);
+
+               switch ($version) {
+               case '0.91': /* FALLTHROUGH */
+               case '2.0':
+                       $date = get_date('D, d M Y H:i:s T', $time);
+                       $date = ($version == '0.91') ?
+                               ' <description>' . $date . '</description>' :
+                               ' <pubDate>'     . $date . '</pubDate>';
+                       $items .= <<<EOD
 <item>
  <title>$title</title>
- <link>$self$r_page</link>
- <description>$desc</description>
+ <link>$self?$r_page</link>
+$date
+</item>
+
+EOD;
+                       break;
+
+               case '1.0':
+                       // Add <item> into <items>
+                       $rdf_li .= '    <rdf:li rdf:resource="' . $self .
+                               '?' . $r_page . '" />' . "\n";
+
+                       $date = substr_replace(get_date('Y-m-d\TH:i:sO', $time), ':', -2, 0);
+                       $items .= <<<EOD
+<item rdf:about="$self?$r_page">
+ <title>$title</title>
+ <link>$self?$r_page</link>
+ <dc:date>$date</dc:date>
+ <dc:identifier>$self?$r_page</dc:identifier>
 </item>
 
 EOD;
+                       break;
+               }
        }
-       
-       header('Content-type: application/xml');
-       
-       print <<<EOD
-<?xml version="1.0" encoding="UTF-8"?>
 
-<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN"
-            "http://my.netscape.com/publish/formats/rss-0.91.dtd">
+       // Feeding start
+       pkwk_common_headers();
+       header('Content-type: application/xml');
+       print '<?xml version="1.0" encoding="UTF-8"?>' . "\n\n";
 
-<rss version="0.91">
+       $r_whatsnew = pagename_urlencode($whatsnew);
+       switch ($version) {
+       case '0.91':
+               print '<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN"' .
+               ' "http://my.netscape.com/publish/formats/rss-0.91.dtd">' . "\n";
+                /* FALLTHROUGH */
 
-<channel>
-<title>$page_title_utf8</title>
-<link>$self$whatsnew</link>
-<description>PukiWiki RecentChanges</description>
-<language>ja</language>
+       case '2.0':
+               print <<<EOD
+<rss version="$version">
+ <channel>
+  <title>$page_title_utf8</title>
+  <link>$self?$r_whatsnew</link>
+  <description>PukiWiki RecentChanges</description>
+  <language>$lang</language>
 
 $items
-</channel>
+ </channel>
 </rss>
 EOD;
+               break;
+
+       case '1.0':
+               print <<<EOD
+<rdf:RDF
+  xmlns:dc="http://purl.org/dc/elements/1.1/"
+  xmlns="http://purl.org/rss/1.0/"
+  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+  xml:lang="$lang">
+ <channel rdf:about="$self?$r_whatsnew">
+  <title>$page_title_utf8</title>
+  <link>$self?$r_whatsnew</link>
+  <description>PukiWiki RecentChanges</description>
+  <items>
+   <rdf:Seq>
+$rdf_li
+   </rdf:Seq>
+  </items>
+ </channel>
+
+$items
+</rdf:RDF>
+EOD;
+               break;
+       }
        exit;
 }
-?>
\ No newline at end of file
+