<?php if (!defined('PmWiki')) exit();
/*  Copyright 2004-2005 Steffen Burmeister (der@dolph.de)

    Version 1.0:
	   * initial public release

    This file is an extension to PmWiki; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published
    by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.  See pmwiki.php for full details.

	 
	 Based on the pmwiki file rss.php:
    Copyright 2002-2004 Patrick R. Michaud (pmichaud@pobox.com)

    This script defines "?action=rsss".  It will read the current page
    for a specific wiki syntax, and then output an RSS 2.0 document with 
	 the current page as the channel and the separated (by !!! hedings) 
	 content of the page as items.

    To add RSS capabilities to your site, simply add to config.php:

        include_once('cookbook/rsssimple.php');

    To avoid the cost of loading this script and initializing RSS variables 
    when you aren't going to generate a feed, use this instead:

        if ($action == 'rsss') { include_once('cookbook/rsssimple.php'); }

    Site Format Definition (sample site):

--------------------------------------------------------------------------
	 !:: Blog

    Here goes some text. You can describe your blog here, but it will be
	 skipped in the feed. Everything depends on level three (!!!) headings.

	 You can also give a RSS-link like that to your readers: \\
	 [[http://www.mysite.com/pmwiki2/pmwiki.php/Main/Blog?action=rsss | RSS-Feed]]
	 
	 !!!2005-08-16 :: blog item 1 [[#a2005-08-16]]
	 Some text that will be shown. The anchor above is for emulating
	 the permalink feature of other blogs.

	 !!!2005-08-15 :: blog item 2 [[#a2005-08-15]]
	 Another blog entry. Full '''wiki-syntax''' is supported [[Main.HomePage | here]].
--------------------------------------------------------------------------

    See a working example at: http://www.dolph.de

	 Have fun!
*/

SDV($HandleActions['rsss'],'HandleRssSimple');  


/* ****  feed configuration **** */
SDV($RssTitle,"My Blog");                        # rss feed title
SDV($RssLink,"http://www.mysite.com");           # rss feed link
SDV($RssDesc,"This is my blog");                 # rss feed description
SDV($RssLanguage,"en-US");                       # rss feed language
SDV($RssCopyright,"Me");                         # rss feed copyright
SDV($RssEditor,"me@mysite.com");                 # rss feed managing editor
SDV($RssWebMaster,"webmaster@mysite.com");       # rss feed webmaster
SDV($RssMaxItems,0);				                   # maximum items to display (set to 0 for all)
/* ***************************** */

SDV($RssItems,array());				                # RSS item elements

### RSS 2.0 definitions
SDV($RssChannelFmt,'<?xml version="1.0"?'.'>
  <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel>
      <title>'.$RssTitle.'</title>
      <link>'.$RssLink.'</link>
      <description>'.$RssDesc.'</description>
      <language>'.$RssLanguage.'</language>
      <copyright>'.$RssCopyright.'</copyright>
      <managingEditor>'.$RssEditor.'</managingEditor>
      <webMaster>'.$RssWebMaster.'</webMaster>
      <lastBuildDate>$RssChannelBuildDate</lastBuildDate>
      <generator>$Version with rsssimple.php</generator>');
SDV($RssItemFmt,'
        <item>
          <title>$RssItemTitle</title>
          <link>$RssItemLink</link>
          <description>$RssItemDesc</description>
          <pubDate>$RssItemPubDate</pubDate>
        </item>');
SDV($HandleRssFmt,array(&$RssChannelFmt,&$RssItems,'</channel></rss>'));


function HandleRssSimple($pagename, $auth='read') {

  global $RssMaxItems,$RssEditor, $RssDesc,
    $RssChannelFmt,$RssChannelDesc,$RssChannelBuildDate,
    $RssItems,$RssItemFmt,
    $HandleRssFmt,$FmtV,$ScriptUrl,$Group,$Name;
	 
  $t = ReadTrail($pagename,$pagename);
  $page = RetrieveAuthPage($pagename, $auth, false, READPAGE_CURRENT);
  if (!$page) Abort("?cannot read $pagename");
  
  $cbgmt = $page['time'];
  SDV($RssChannelBuildDate, gmdate('D, d M Y H:i:s \G\M\T', $cbgmt));
		  
  $source = $page['text'];
  $number_of_items = preg_match_all('/!!!.*\ ::\ /', $source, $dates); // get the number of items and the dates
  $dates = $dates[0];

  $source_in_html = MarkupToHTML($pagename,$source);

  $entries = preg_split('/!!!.*\ ::\ /', $source, -1, PREG_SPLIT_DELIM_CAPTURE);
  array_shift($entries); // throw away everything before the first heading

  $noitems = count($dates);
  if ( $RssMaxItems > 0 && $noitems > $RssMaxItems ) { $noitems = $RssMaxItems; }

  for ($i=0; $i<$noitems; $i++) {
    
	 # extract the date
	 preg_match('/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/', $dates[$i], $date);
	 $date = $date[0];

	 # extract the title and the description
    $content = preg_split('/\n/', $entries[$i], 2);

    preg_match('/\[\[#.*\]\]/', $content[0], $anchor);	 
	 $anchor = str_replace('[[', '', $anchor[0]);
	 $anchor = str_replace(']]', '', $anchor);
	 
	 $title = preg_replace('/\[\[.*\]\]/', '', $content[0]);
	 $title = trim($title);

	 
    $description = $content[1];
	 $description = trim($description);
    $description = MarkupToHTML($pagename, $description);
	 //$description = strip_tags($description); # without html tags
	 $description = "<![CDATA[ " . $description . " ]]>"; # as cdata enclosure
	 
	 $link = $ScriptUrl ."/". str_replace('.', '/', $pagename) . $anchor;

	 //print_r("$date - $title <br> $description<br>$link<br><br>"); // debug output
    
	 SDV($RssDesc,entityencode(FmtPageName($RssDesc,$pagename)));
	 
    $FmtV['$RssItemTitle'] = $title;
	 $FmtV['$RssItemLink'] = $link;
	 $FmtV['$RssItemDesc'] = $description;
	 $FmtV['$RssItemAuthor'] = $RssEditor;
    $FmtV['$RssItemPubDate'] = gmdate("r", mktime(0,0,0,substr($date,5,2),substr($date,8,2),substr($date,0,4)));

	 //$RssItems[] = entityencode(FmtPageName($RssItemFmt,$title)); // items with entity-encoding
	 $RssItems[] = FmtPageName($RssItemFmt,$title); // items without entity-encoding
  }
  header("Content-type: text/xml");
  PrintFmt($pagename,$HandleRssFmt);
  exit();
}

# entityencode() and $EntitiesTable are used to convert non-ASCII characters 
# and named entities into numeric entities, since the RSS and RDF
# specifications don't have a good way of incorporating them by default.
function entityencode($s) {
  global $EntitiesTable;
  $s = str_replace(array_keys($EntitiesTable),array_values($EntitiesTable),$s);
  return preg_replace('/([\\x80-\\xff])/e',"'&#'.ord('\$1').';'",$s); 
}

SDVA($EntitiesTable, array(
  # entities defined in "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent"
  '&nbsp;' => '&#160;', 
  '&iexcl;' => '&#161;', 
  '&cent;' => '&#162;', 
  '&pound;' => '&#163;', 
  '&curren;' => '&#164;', 
  '&yen;' => '&#165;', 
  '&brvbar;' => '&#166;', 
  '&sect;' => '&#167;', 
  '&uml;' => '&#168;', 
  '&copy;' => '&#169;', 
  '&ordf;' => '&#170;', 
  '&laquo;' => '&#171;', 
  '&not;' => '&#172;', 
  '&shy;' => '&#173;', 
  '&reg;' => '&#174;', 
  '&macr;' => '&#175;', 
  '&deg;' => '&#176;', 
  '&plusmn;' => '&#177;', 
  '&sup2;' => '&#178;', 
  '&sup3;' => '&#179;', 
  '&acute;' => '&#180;', 
  '&micro;' => '&#181;', 
  '&para;' => '&#182;', 
  '&middot;' => '&#183;', 
  '&cedil;' => '&#184;', 
  '&sup1;' => '&#185;', 
  '&ordm;' => '&#186;', 
  '&raquo;' => '&#187;', 
  '&frac14;' => '&#188;', 
  '&frac12;' => '&#189;', 
  '&frac34;' => '&#190;', 
  '&iquest;' => '&#191;', 
  '&Agrave;' => '&#192;', 
  '&Aacute;' => '&#193;', 
  '&Acirc;' => '&#194;', 
  '&Atilde;' => '&#195;', 
  '&Auml;' => '&#196;', 
  '&Aring;' => '&#197;', 
  '&AElig;' => '&#198;', 
  '&Ccedil;' => '&#199;', 
  '&Egrave;' => '&#200;', 
  '&Eacute;' => '&#201;', 
  '&Ecirc;' => '&#202;', 
  '&Euml;' => '&#203;', 
  '&Igrave;' => '&#204;', 
  '&Iacute;' => '&#205;', 
  '&Icirc;' => '&#206;', 
  '&Iuml;' => '&#207;', 
  '&ETH;' => '&#208;', 
  '&Ntilde;' => '&#209;', 
  '&Ograve;' => '&#210;', 
  '&Oacute;' => '&#211;', 
  '&Ocirc;' => '&#212;', 
  '&Otilde;' => '&#213;', 
  '&Ouml;' => '&#214;', 
  '&times;' => '&#215;', 
  '&Oslash;' => '&#216;', 
  '&Ugrave;' => '&#217;', 
  '&Uacute;' => '&#218;', 
  '&Ucirc;' => '&#219;', 
  '&Uuml;' => '&#220;', 
  '&Yacute;' => '&#221;', 
  '&THORN;' => '&#222;', 
  '&szlig;' => '&#223;', 
  '&agrave;' => '&#224;', 
  '&aacute;' => '&#225;', 
  '&acirc;' => '&#226;', 
  '&atilde;' => '&#227;', 
  '&auml;' => '&#228;', 
  '&aring;' => '&#229;', 
  '&aelig;' => '&#230;', 
  '&ccedil;' => '&#231;', 
  '&egrave;' => '&#232;', 
  '&eacute;' => '&#233;', 
  '&ecirc;' => '&#234;', 
  '&euml;' => '&#235;', 
  '&igrave;' => '&#236;', 
  '&iacute;' => '&#237;', 
  '&icirc;' => '&#238;', 
  '&iuml;' => '&#239;', 
  '&eth;' => '&#240;', 
  '&ntilde;' => '&#241;', 
  '&ograve;' => '&#242;', 
  '&oacute;' => '&#243;', 
  '&ocirc;' => '&#244;', 
  '&otilde;' => '&#245;', 
  '&ouml;' => '&#246;', 
  '&divide;' => '&#247;', 
  '&oslash;' => '&#248;', 
  '&ugrave;' => '&#249;', 
  '&uacute;' => '&#250;', 
  '&ucirc;' => '&#251;', 
  '&uuml;' => '&#252;', 
  '&yacute;' => '&#253;', 
  '&thorn;' => '&#254;', 
  '&yuml;' => '&#255;', 
  # entities defined in "http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent"
  '&quot;' => '&#34;', 
  #'&amp;' => '&#38;#38;', 
  #'&lt;' => '&#38;#60;', 
  #'&gt;' => '&#62;', 
  '&apos;' => '&#39;', 
  '&OElig;' => '&#338;', 
  '&oelig;' => '&#339;', 
  '&Scaron;' => '&#352;', 
  '&scaron;' => '&#353;', 
  '&Yuml;' => '&#376;', 
  '&circ;' => '&#710;', 
  '&tilde;' => '&#732;', 
  '&ensp;' => '&#8194;', 
  '&emsp;' => '&#8195;', 
  '&thinsp;' => '&#8201;', 
  '&zwnj;' => '&#8204;', 
  '&zwj;' => '&#8205;', 
  '&lrm;' => '&#8206;', 
  '&rlm;' => '&#8207;', 
  '&ndash;' => '&#8211;', 
  '&mdash;' => '&#8212;', 
  '&lsquo;' => '&#8216;', 
  '&rsquo;' => '&#8217;', 
  '&sbquo;' => '&#8218;', 
  '&ldquo;' => '&#8220;', 
  '&rdquo;' => '&#8221;', 
  '&bdquo;' => '&#8222;', 
  '&dagger;' => '&#8224;', 
  '&Dagger;' => '&#8225;', 
  '&permil;' => '&#8240;', 
  '&lsaquo;' => '&#8249;', 
  '&rsaquo;' => '&#8250;', 
  '&euro;' => '&#8364;', 
  # entities defined in "http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent"
  '&fnof;' => '&#402;', 
  '&Alpha;' => '&#913;', 
  '&Beta;' => '&#914;', 
  '&Gamma;' => '&#915;', 
  '&Delta;' => '&#916;', 
  '&Epsilon;' => '&#917;', 
  '&Zeta;' => '&#918;', 
  '&Eta;' => '&#919;', 
  '&Theta;' => '&#920;', 
  '&Iota;' => '&#921;', 
  '&Kappa;' => '&#922;', 
  '&Lambda;' => '&#923;', 
  '&Mu;' => '&#924;', 
  '&Nu;' => '&#925;', 
  '&Xi;' => '&#926;', 
  '&Omicron;' => '&#927;', 
  '&Pi;' => '&#928;', 
  '&Rho;' => '&#929;', 
  '&Sigma;' => '&#931;', 
  '&Tau;' => '&#932;', 
  '&Upsilon;' => '&#933;', 
  '&Phi;' => '&#934;', 
  '&Chi;' => '&#935;', 
  '&Psi;' => '&#936;', 
  '&Omega;' => '&#937;', 
  '&alpha;' => '&#945;', 
  '&beta;' => '&#946;', 
  '&gamma;' => '&#947;', 
  '&delta;' => '&#948;', 
  '&epsilon;' => '&#949;', 
  '&zeta;' => '&#950;', 
  '&eta;' => '&#951;', 
  '&theta;' => '&#952;', 
  '&iota;' => '&#953;', 
  '&kappa;' => '&#954;', 
  '&lambda;' => '&#955;', 
  '&mu;' => '&#956;', 
  '&nu;' => '&#957;', 
  '&xi;' => '&#958;', 
  '&omicron;' => '&#959;', 
  '&pi;' => '&#960;', 
  '&rho;' => '&#961;', 
  '&sigmaf;' => '&#962;', 
  '&sigma;' => '&#963;', 
  '&tau;' => '&#964;', 
  '&upsilon;' => '&#965;', 
  '&phi;' => '&#966;', 
  '&chi;' => '&#967;', 
  '&psi;' => '&#968;', 
  '&omega;' => '&#969;', 
  '&thetasym;' => '&#977;', 
  '&upsih;' => '&#978;', 
  '&piv;' => '&#982;', 
  '&bull;' => '&#8226;', 
  '&hellip;' => '&#8230;', 
  '&prime;' => '&#8242;', 
  '&Prime;' => '&#8243;', 
  '&oline;' => '&#8254;', 
  '&frasl;' => '&#8260;', 
  '&weierp;' => '&#8472;', 
  '&image;' => '&#8465;', 
  '&real;' => '&#8476;', 
  '&trade;' => '&#8482;', 
  '&alefsym;' => '&#8501;', 
  '&larr;' => '&#8592;', 
  '&uarr;' => '&#8593;', 
  '&rarr;' => '&#8594;', 
  '&darr;' => '&#8595;', 
  '&harr;' => '&#8596;', 
  '&crarr;' => '&#8629;', 
  '&lArr;' => '&#8656;', 
  '&uArr;' => '&#8657;', 
  '&rArr;' => '&#8658;', 
  '&dArr;' => '&#8659;', 
  '&hArr;' => '&#8660;', 
  '&forall;' => '&#8704;', 
  '&part;' => '&#8706;', 
  '&exist;' => '&#8707;', 
  '&empty;' => '&#8709;', 
  '&nabla;' => '&#8711;', 
  '&isin;' => '&#8712;', 
  '&notin;' => '&#8713;', 
  '&ni;' => '&#8715;', 
  '&prod;' => '&#8719;', 
  '&sum;' => '&#8721;', 
  '&minus;' => '&#8722;', 
  '&lowast;' => '&#8727;', 
  '&radic;' => '&#8730;', 
  '&prop;' => '&#8733;', 
  '&infin;' => '&#8734;', 
  '&ang;' => '&#8736;', 
  '&and;' => '&#8743;', 
  '&or;' => '&#8744;', 
  '&cap;' => '&#8745;', 
  '&cup;' => '&#8746;', 
  '&int;' => '&#8747;', 
  '&there4;' => '&#8756;', 
  '&sim;' => '&#8764;', 
  '&cong;' => '&#8773;', 
  '&asymp;' => '&#8776;', 
  '&ne;' => '&#8800;', 
  '&equiv;' => '&#8801;', 
  '&le;' => '&#8804;', 
  '&ge;' => '&#8805;', 
  '&sub;' => '&#8834;', 
  '&sup;' => '&#8835;', 
  '&nsub;' => '&#8836;', 
  '&sube;' => '&#8838;', 
  '&supe;' => '&#8839;', 
  '&oplus;' => '&#8853;', 
  '&otimes;' => '&#8855;', 
  '&perp;' => '&#8869;', 
  '&sdot;' => '&#8901;', 
  '&lceil;' => '&#8968;', 
  '&rceil;' => '&#8969;', 
  '&lfloor;' => '&#8970;', 
  '&rfloor;' => '&#8971;', 
  '&lang;' => '&#9001;', 
  '&rang;' => '&#9002;', 
  '&loz;' => '&#9674;', 
  '&spades;' => '&#9824;', 
  '&clubs;' => '&#9827;', 
  '&hearts;' => '&#9829;', 
  '&diams;' => '&#9830;'));