<?php if (!defined('PmWiki')) exit();
/*  Copyright 2004-2006 Steffen Burmeister (der[at]dolph.de)
    Copyright 2006 Mark A. Matienzo (mark[at]thesecretmirror.com)
    Copyright 2011 F. Galcik (frantisek.galcik[at]gbox.sk)

    Version 1.3 (2011-11-15):
      * instead of anchor, user can specify other page (for rss changelog)  
      * fixed bug in time generation      
    
		Version 1.2 (2006-07-27):
      * added guid support

    Version 1.1 (2005-08-25):
      * added time support

    Version 1.0 (2005-08-17):
      * 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 !!! headings)
    content of the page as items.

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

        if ($action == 'rsss') { include_once('cookbook/rsssimple-1.3.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.

    Let me explain it a bit more:
    The RSS channel options are defined in the rsssimple.php script. But 
    every RSS item is extracted from the wikipage by separating the page 
    into chunks between !!! headings. The heading itself will be the 
    item-title. Everything up to the next !!! heading will be in the 
    item-description.

    The date/time in the heading is also very important. Be shure it matches
    the date given at the beginning of the level 3 heading (see below).

    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]]

		!!!2011-08-16 22:05 :: blog item 5 [[AGroup/APage]]
		You can use blog also for producing rss-style changelog of your website
		
		!!!2005-08-16 22:05 :: blog item 4 [[#a2005-08-16T22:05]]
    Some text that will be shown. The anchor above is for emulating
    the permalink feature of other blogs. You can skip that anchor
    if you like.

    !!!2005-08-16 14:30 :: blog item 3 [[#a2005-08-16T14:30]]
    Another blog entry. Full '''wiki-syntax''' is supported [[Main.HomePage | here]].

    Note, that you can also specify the time if you like.

    !!!2005-08-14 :: blog item 2 [[#a2005-08-14]]
    And another one.
    
    You can make paragraphs too.

    !!!2005-08-13 :: first blog item [[#a2005-08-13]]
     Welcome to my blog!
--------------------------------------------------------------------------

    See a working example at: http://www.dolph.de
			      http://mark.thesecretmirror.com/
	 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" encoding="iso-8859-1"?'.'>
  <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 v1.1</generator>');
SDV($RssItemFmt,'
        <item>
          <title>$RssItemTitle</title>
          <link>$RssItemLink</link>
	  <guid isPermaLink="true">$RssItemLink</guid>
	  <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 time
	 preg_match('/[0-9][0-9]:[0-9][0-9]/', $dates[$i], $time);
	 $time = $time[0];

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

   # extract link for rss item (anchor or link to a page)
   preg_match('/\[\[.*\]\]/', $content[0], $itemLink);	 
	 $itemLink = str_replace('[[', '', $itemLink[0]);
	 $itemLink = trim(str_replace(']]', '', $itemLink));
	 if (($itemLink != '') && (substr($itemLink, 0, 1) == '#'))
	 		$itemLink = $pagename.$itemLink;
	 
	 $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 = MakeLink($pagename, $itemLink, NULL, NULL, '$LinkUrl');

	 // print_r("$date - $time - $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(substr($time,0,2),substr($time,3,2),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;'));