Extension:RSS (GISWiki)

Adjusted output to be in wiki code rather than HTML by User:Cogdog; Fixed it to work in MediaWiki 1.6 Piku; Adding Date output, by User:Arcy 30. 07. 2006; define date format as constant, adjust for feeds w/o dates, weird Yahoo formats by User:Cogdog

This is a minor further modified
 * version of the User:Mafs/RSS engine from User:Mafs, which in turn is based on the
 * version of the RSS engine from User:Rdb78, which in turn is based on the
 * vesion of the RSS engine from User:Duesentrieb, which in turn is an extended
 * version of the RSS-feed extension by Mutante.

There are two further arguments:
 * title -> display an alternative title instead of chanel name (usefull for very long an ugly chanel names]
 * title = none -> dont display any title

It gets used on http://www.giswiki.org/index.php/News


 * 12)  * iconv , see also 
 * 13) Installation:
 * 14)  * put this file (rss.php) into the extension directory of your mediawiki installation
 * 15)  * add the following to the end of LocalSettings.php: include("extensions/rss.php");
 * 16)  * make sure magpie can be found by PHP.
 * 17) Usage:
 * 18)  Use one section between -tags for each feed. The rss section may contain parameters
 * 19)  separated by a pipe ("|"), just like links and templates. These parameters are supported:
 * 20)    * charset=...             The charset used by the feed. iconv is used to convert this.
 * 21)    * short                   Do not show the description text for each news item.
 * 22)    * max=x                   Shows x most recent headlines.
 * 23)    * highlight= term1 term2  The terms separated by a space are highlighted.
 * 24)    * filter= term1 term2     Show only rss items containing at least one of the terms.
 * 25)    * reverse                 display the rss items in reverse order.
 * 26)    * title=x                 display an alternative title instead of chanel name.
 * 27)    * title = none            dont display any title.
 * 28)    * date                    display the date and time stamp below the title.
 * 29) Example:
 * 30)    http://slashdot.org/slashdot.rss|charset=UTF-8|short|max=5
 * 1)    * title=x                 display an alternative title instead of chanel name.
 * 2)    * title = none            dont display any title.
 * 3)    * date                    display the date and time stamp below the title.
 * 4) Example:
 * 5)    http://slashdot.org/slashdot.rss|charset=UTF-8|short|max=5
 * 1)    http://slashdot.org/slashdot.rss|charset=UTF-8|short|max=5

define('MAGPIE_DIR', '/fullpath/to/my/magpie/');
 * 1) define location of magpie )

define('MAGPIE_CACHE_DIR', MAGPIE_DIR . 'cache/');
 * 1) specify magpie cache directory, make sure it is writable (chmod 0666)

define ('DATE_FORMAT', "r");
 * 1) specify output format for date using PHP date formats

require_once(MAGPIE_DIR . 'rss_fetch.inc');
 * 1) access magpie library

$wgExtensionFunctions[] = "wfRssExtension";
 * 1) install extension hook

function wfRssExtension { global $wgParser;
 * 1) extension hook callback function

#install parser hook for tags $wgParser->setHook( "rss", "renderRss" ); }

function renderRss($input, $argv, $parser = null) { if (!$parser) $parser =& $GLOBALS['wgParser']; global $wgOutputEncoding;
 * 1) parser hook callback function

$DefaultEncoding = "ISO-8859-1"; $DisableCache = true;

# $input = mysql_escape_string($input);

if (!$input) return ""; #if -section is empty, return nothing

#parse fields in rss-section $fields= explode("|",$input); $url= @$fields[0];

$args= array; for ($i=1; $i<sizeof($fields); $i++) { $f= $fields[$i];

if (strpos($f,"=")===False) $args[strtolower(trim($f))]= False; else { list($k,$v)= explode("=",$f,2); if (trim($v)==False) $args[strtolower(trim($k))] = False; else $args[strtolower(trim($k))]= trim($v); } }

#get charset from argument-array $charset= @$args["charset"]; if (!$charset) $charset= $DefaultEncoding;

#get max number of headlines from argument-array $maxheads = @$args["max"]; $headcnt = 0;

#get short-flag from argument-array #if short is set, no description text is printed if (isset($args["short"])) $short = True; else $short = False;

#get reverse-flag from argument-array if (isset($args["reverse"])) $reverse = True; else $reverse = False;

#get date-flag from argument-array if (isset($args["date"])) $dateflag = True; else $dateflag = False;

#get highlight terms from argument-array $rssHighlight= @$args["highlight"]; $rssHighlight= str_replace(" "," ", $rssHighlight); $rssHighlight= explode(" ", trim($rssHighlight));

#get filter terms from argument-array $rssFilter= @$args["filter"]; $rssFilter= str_replace(" "," ", $rssFilter); $rssFilter= explode(" ", trim($rssFilter));

#fetch rss. may be cached locally. #Refer to the documentation of magpie for details. $rss = @fetch_rss($url);

#check for errors. if ($rss->ERROR) { # return "Feed error"; #localize...     #return " Failed to load RSS feed from $url: ".$rss->ERROR." "; #localize... }

if (!is_array($rss->items)) { # return "Feed error"; #localize...     #return " Failed to load RSS feed from $url! "; #localize... }

#Bild title line #get title from argument-array $rssTitle= @$args["title"]; $rssTitle= trim($rssTitle);

if ($rssTitle !=='none') { if ($rssTitle=='') { $title= iconv($charset,$wgOutputEncoding,$rss->channel['title']); if ($rss->channel['link']) $title= "[".$rss->channel['link']." $title]"; $output = "=== $title ===\n"; }   else {     $title= "[".$rss->channel['link']." $rssTitle]"; $output="=== $title ===\n"; } } else { $output=""; #placeholder for output to insert when no title is shown, e.g. "\n\n\n" } if ($reverse) $rss->items = array_reverse($rss->items);

$description = False; foreach ($rss->items as $item) { if ($item['description']) {$description = True; break;} }

#Bild items if (!$short and $description) { #full item list

$output.=""; foreach ($rss->items as $item) {

$d_text = true; $d_title = true;

$href = trim(iconv($charset,$wgOutputEncoding,$item['link'])); $title = trim(iconv($charset,$wgOutputEncoding,$item['title']));

# More Yahoo clean-up, their feeds have line beaks in titles $title = ereg_replace("(\r\n|\n|\r)", " ", $title);

$d_title = wfRssFilter ($title, $rssFilter); $title= wfRssHighlight($title, $rssHighlight);

#bild description text if desired if ($item["description"]) { $text= trim(iconv($charset,$wgOutputEncoding,$item['description']));

#avoid pre-tags $text = ereg_replace("(\r\n|\n|\r|\t)", " ", $text);

// weird Yahoo content encoding $text= str_replace("&#60;","<", $text);

# remove HTML; coment this line out if you really want it rendered $text=strip_tags($text);

$d_text = wfRssFilter ($text, $rssFilter); $text= wfRssHighlight($text, $rssHighlight);

$display = $d_text or $d_title;

} else { $text = ""; $display = $d_title; }

# add date of item if enabled and it exists in the feed if ($dateflag AND $item['date_timestamp']) { $dateinfo = date(DATE_FORMAT, trim(iconv($charset,$wgOutputEncoding,$item['date_timestamp']))); $datedisp = " ($dateinfo) "; } else { $datedisp = ''; }       if ($display) { $output.="* [$href $title] $datedisp"; if ($text) $output.=" $text"; $output .= "\n"; }

#Cut off output when maxheads is reached: if (++$headcnt == $maxheads) break;

}   # $output.=""; } else { #short item list # $output.=""; foreach ($rss->items as $item) { $href = trim(iconv($charset,$wgOutputEncoding,$item['link'])); $title = trim(iconv($charset,$wgOutputEncoding,$item['title'])); $d_title = wfRssFilter ($title, $rssFilter); $title= wfRssHighlight($title, $rssHighlight);

if ($dateflag AND $item['date_timestamp']) { $dateinfo = date(DATE_FORMAT,$item['date_timestamp']); $datedisp = " ($dateinfo) "; } else { $datedisp = ''; }

if ($d_title ) $output.="* [$href $title] $datedisp\n";

#Cut off output when maxheads is reached: if (++$headcnt == $maxheads) break; }   # $output.=""; }

if ($DisableCache) {

global $wgVersion;

# Do not cache this wiki page. # for details see http://public.kitware.com/Wiki/User:Barre/MediaWiki/Extensions global $wgTitle, $wgDBprefix; $ts = mktime; $now = gmdate("YmdHis", $ts + 120); $ns = $wgTitle->getNamespace; $ti = wfStrencode($wgTitle->getDBkey);

$version = preg_replace("/^([1-9]).([1-9]).*/", "\\1\\2", $wgVersion); if ($version>14) $sql = "UPDATE $wgDBprefix"."page SET page_touched='$now' WHERE page_namespace=$ns AND page_title='$ti'"; else            $sql = "UPDATE $wgDBprefix"."cur SET cur_touched='$now' WHERE cur_namespace=$ns AND cur_title='$ti'";

wfQuery($sql, DB_WRITE, ""); }

$out = $parser->parse ($output, $parser->mTitle,$parser->mOptions, true, false); return $out->getText; }

function wfRssFilter ($text, $rssFilter) {

$display = true;

if (is_array($rssFilter)) { foreach($rssFilter as $term) {

if ($term) { $display = false; if (preg_match("|$term|i", $text, $a)) {  $display = true; return $display; } }   if ($display) break; } }  return $display; }

function wfRssHighlight($text, $rssHighlight) {

$i=0; $starttag = "v8x5u3t3u8h"; $endtag  = "q8n4f6n4n4x";

$color[]="coral"; $color[]="greenyellow"; $color[]="lightskyblue"; $color[]="gold"; $color[]="violet";

$count_color = count($color);

if (is_array($rssHighlight)) { foreach($rssHighlight as $term) { if ($term) { $text = preg_replace("|\b(\w*?".$term."\w*?)\b|i", "$starttag"."_".$i."\\1$endtag", $text); $i++; if ($i == $count_color) $i=0; }     }    }  # to avoid trouble should someone wants to highlight the terms "span", "style", ... for ($i=0; $i<5; $i++) { $text = preg_replace("|$starttag"."_".$i."|", "", $text); $text = preg_replace("|$endtag|", " ", $text); }

return $text; }

?>