User:Robchurch/RSS

This is a hacked-up version of m:User:Alxndr/RSS which should work happier with newer versions of MediaWiki.


 * 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("extensions/rss.php");
 * 15)  * make sure magpie can be found by PHP.
 * 16) Usage:
 * 17)  Use one section between -tags for each feed. The rss section may contain parameters
 * 18)  separated by a pipe ("|"), just like links and templates. These parameters are supported:
 * 19)    * charset=...             The charset used by the feed. iconv is used to convert this.
 * 20)    * short                   Do not show the description text for each news item.
 * 21)    * date                    Shows date/time stamp 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)    * filterout= term1 term2  Do not show any rss items containing any terms
 * 26)    * reverse                 display the rss items in reverse order
 * 27) Example:
 * 28)    http://slashdot.org/slashdot.rss|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://slashdot.org/slashdot.rss|charset=UTF-8|short|date|max=5
 * 1)    http://slashdot.org/slashdot.rss|charset=UTF-8|short|date|max=5

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

$wgExtensionCredits['other'][] = array(       'name' => 'RSS feed extension',        'author' => 'mutante, Duesentrieb, Rdb, Mafs, Alxndr',        'version' => '09/2006',        'url' => 'm: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, $args, $parser ) { 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=" $title "; 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 [?]"; }       #Cut off output when maxheads is reached: if (++$headcnt == $maxheads) break; }      $output.=""; }  else { #short item list ## HACKY HACKY HACKY $output.=""; $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 ) $parser->disableCache;

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; }

?>