Extension:RSS

This is a modified version of
 * the RSS engine from Mafs, which is a modified version of
 * the RSS engine from Rdb78, which is a modified version of
 * the RSS engine from Duesentrieb, which is a modified version of
 * the RSS-feed extension by Mutante.

It's a quick hack to support filtering-out (i.e. ) of items based on title when in short list mode. Furthermore it only displays unique titles.

Please email me with any comments; I don't check my user pages very often.

Change Log

 * This has been updated to work better on newer (1.9) MediaWiki software, with the help of User:Duesentrieb. --CryptoQuick 14:26, 24 January 2007 (UTC)
 * This appears not to be true; I have received numerous emails about it not working with 1.9+. I would love to help debug and fix the extension, but my host has not upgraded to PHP 5 and I'm thus stuck at MediaWiki 1.6.8, so that's as far as this is guaranteed to work properly. If anyone develops a fix, please post a link to it here! &#x2014;Alxndr&#x00a0;(t) 02:02, 16 June 2007 (UTC)
 * I just found this fork that purports to have a fix for the new loss of wfStrEncode. I can't test it though so can anyone else verify that it works? &#x2014;Alxndr&#x00a0;(t) 02:18, 16 June 2007 (UTC)

Installation
(Make sure there's a semicolon at the end of that line)
 * 1) Save this source in your /extensions directory
 * 2) Download and save the Magpie RSS parser into the same directory. Magpie can be gotten from here:
 * 3) Optional - Check that iconv is installed; this can be done with a simple phpinfo; script.
 * 4) Place the following text in your LocalSettings.php file: include_once("extensions/rss.php");
 * 1) Finally, load your wiki, and have fun with RSS feeds!

Version check fails for mediawiki 1.10 and greater (fix included)
The check for the right version of the mediawiki installation fails with versions > 1.9.x The variable $version is being set in line 230 and the regex is just a little off to fix it.

< $version = preg_replace("/^([1-9]).([1-9]).*/", "\\1\\2", $wgVersion); > $version = preg_replace("/^([1-9])\.([0-9]{1,2}).*/", "\\1\\2", $wgVersion);

--217.9.113.155 13:00, 22 June 2007 (UTC)

Source

 * 11)  * iconv , see also 
 * 12) Installation:
 * 13)  * put this file (rss.php) into the extension directory of your mediawiki installation
 * 14)  * add the following to the end of LocalSettings.php: include_once("extensions/rss.php");
 * 15)    (make sure there's a semicolon  at the end of that line)
 * 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)    * date                    Shows date/time stamp for each news item.
 * 23)    * max=x                   Shows x most recent headlines.
 * 24)    * highlight= term1 term2  The terms separated by a space are highlighted.
 * 25)    * filter= term1 term2     Show only rss items containing at least one of the terms.
 * 26)    * filterout= term1 term2  Do not show any rss items containing any terms
 * 27)    * reverse                 display the rss items in reverse order
 * 28) Example:
 * 29)    http://rss.slashdot.org/Slashdot/slashdot|charset=UTF-8|short|date|max=5
 * 1)    * filter= term1 term2     Show only rss items containing at least one of the terms.
 * 2)    * filterout= term1 term2  Do not show any rss items containing any terms
 * 3)    * reverse                 display the rss items in reverse order
 * 4) Example:
 * 5)    http://rss.slashdot.org/Slashdot/slashdot|charset=UTF-8|short|date|max=5
 * 1)    http://rss.slashdot.org/Slashdot/slashdot|charset=UTF-8|short|date|max=5

require_once("DatabaseFunctions.php");

if( !defined( 'MEDIAWIKI' ) ) { die; }

$wgExtensionCredits['other'][] = array(       'name' => 'RSS feed extension',        'author' => 'mutante, Duesentrieb, Rdb, Mafs, Alxndr',        'version' => '09/2006',        'url' => 'http://meta.wikimedia.org/wiki/User:Alxndr/RSS',        'description' => 'displays an RSS feed on a wiki page' );

require_once('extensions/magpierss/rss_fetch.inc');
 * 1) change this according to your magpie installation!

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

function wfRssExtension { global $wgParser; #install parser hook for tags $wgParser->setHook( "rss", "renderRss" ); } function renderRss( $input ) { global $wgOutputEncoding; $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); }  }
 * 1) extension hook callback function
 * 1) parser hook callback function

#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"])) $date = true; else $date = 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)); # filterout terms $rssFilterout= @$args["filterout"]; $rssFilterout= str_replace(" "," ", $rssFilterout); $rssFilterout= explode(" ", trim($rssFilterout)); #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 " Failed to load RSS feed from $url: ".$rss->ERROR." "; #localize... }  if (!is_array($rss->items)) { return " Failed to load RSS feed from $url! "; #localize... }
 * 1) echo "\n";

#Bild title line #$title= iconv($charset,$wgOutputEncoding,$rss->channel['title']); #if ($rss->channel['link']) $title= "channel['link']."'>$title"; $output=""; 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'])); $pubdate = trim(iconv($charset,$wgOutputEncoding,$item['pubdate'])); $pubdate = date("d.M. H:i",strtotime($pubdate)); $d_title = wfRssFilter ($title, $rssFilter); $d_title = wfRssFilterout ($title, $rssFilterout); $title= wfRssHighlight($title, $rssHighlight); #build description text if desired if ($item["description"]) { $text= trim(iconv($charset,$wgOutputEncoding,$item['description'])); #avoid pre-tags $text= str_replace("\r"," ",$text); $text= str_replace("\n"," ",$text); $text= str_replace("\t"," ",$text); #elimino gli a capo $text= str_replace(" ","",$text); $d_text = wfRssFilter ($text, $rssFilter); $d_text = wfRssFilterout ($text, $rssFilterout); $text= wfRssHighlight($text, $rssHighlight); $display = $d_text or $d_title; }                       else   { $text = ""; $display = $d_title; }                      if ($display) { $output.="$title"; if($date) $output.=" ($pubdate)"; if ($text) $output.="$text [?</a>]</dd>"; }       #Cut off output when maxheads is reached: if (++$headcnt == $maxheads) break; }      $output.="</dl>"; }  else { #short item list ## HACKY HACKY HACKY $output.="<ul>"; $displayed = array; foreach ($rss->items as $item) { $href = trim(iconv($charset,$wgOutputEncoding,$item['link'])); $title = trim(iconv($charset,$wgOutputEncoding,$item['title'])); $d_title = wfRssFilter ($title, $rssFilter) && wfRssFilterout ($title, $rssFilterout); $title = wfRssHighlight($title, $rssHighlight); if ($d_title && !in_array($title,$displayed)) {                  $output.='<li><a href="'.$href.'" title="'.$title.'">'.$title.'</a></li>'; $displayed[]=$title; #Cut off output when maxheads is reached: if (++$headcnt == $maxheads) break; }      }       $output.="</ul>"; }

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, ""); }   return $output; }

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 wfRssFilterout ($text, $rssFilterout) {       $display = true; if (is_array($rssFilterout)) {               foreach ($rssFilterout as $term) {                       if ($term) {                               if (preg_match("|$term|i", $text, $a)) {                                       $display = false; return $display; }                       }                }        }        return $display; } function wfRssHighlight($text, $rssHighlight) {
 * 1) echo "\n";
 * 1) echo "\n";
 * 1) echo "\n";

$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; }               }        } for ($i=0; $i<5; $i++) { $text = preg_replace("|$starttag"."_".$i."|", "<span style=\"background-color:".$color[$i]."; font-weight: bold;\">", $text); $text = preg_replace("|$endtag|", " ", $text); }
 * 1) to avoid trouble should someone wants to highlight the terms "span", "style", ...

return $text; }

?>