Extension:RSS

From MediaWiki.org

Jump to: navigation, search
Manual on MediaWiki Extensions
List of MediaWiki Extensions
RSS

Release status: stable

Implementation Tag
Description Displays an RSS feed on a wiki page
Author(s) mutante, Daniel Kinzler, Rdb, Mafs, Alxndr
License No license specified
Download this page
Change Log
Example <rss>http://rss.slashdot.org/Slashdot/slashdot|charset=UTF-8|short|date|max=5</rss>

RSS extension 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. grep -v) of items based on title when in short list mode. Furthermore it only displays unique titles.

Contents

[edit] Change Log

  • original by mutante 25.03.2005
  • extended by Duesentrieb 30.04.2005
  • extended by Rdb78 07.07.2005
  • extended by Mafs 10.07.2005, 24.07.2005
  • extended by Niffler 28.02.2006
  • modified by Dzag 07.2006
  • modified by Alxndr 09.2006
  • modified by Svanslyck 02.2008, replacing all « and » with "
  • 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! —Alxndr (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? —Alxndr (t) 02:18, 16 June 2007 (UTC)
  • modified by --Wikinaut 11:17, 7 May 2008 (UTC) : changed method to disable chaching; Extension is now compatible to MediaWiki 1.12
  • modified by Cmreigrut 19:05, 19 November 2008 (UTC): added date (if specified) to short output

[edit] Installation

  1. Save the source (see below) in your /extensions directory in a file named rss.php
  2. Download and save the Magpie RSS parser into the same directory. Magpie can be gotten from SourceForge. Don't install Magpie pursuant to its installation instructions - just drop the parser into your directory.
  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: require_once("extensions/rss.php");
    (Make sure there's a semicolon (;) at the end of that line)
  5. Make sure Magpie can be found by PHP.
  6. Finally, load your wiki, and have fun with RSS feeds!

[edit] Usage

Use one section between <rss>-tags for each feed. The rss section may contain parameters separated by a pipe ("|"), just like links and templates. These parameters are supported:

  • charset=… The charset used by the feed. iconv is used to convert this.
  • short Do not show the description text for each news item.
  • date Shows date/time stamp for each news item.
  • max=x Shows x most recent headlines.
  • highlight= term1 term2 The terms separated by a space are highlighted.
  • filter= term1 term2 Show only RSS items containing at least one of the terms.
  • filterout= term1 term2 Do not show any RSS items containing any terms
  • reverse Display the RSS items in reverse order

[edit] Bugs

[edit] 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);


[edit] corrected method to disable caching (fix included)

[edit] Source

<?php
/** RSS-Feed MediaWiki extension
 *
 * @ingroup Extensions
 *
 * @author mutante, Duesentrieb, Rdb, Mafs, Alxndr, Cmreigrut
 * @copyright © mutante, Duesentrieb, Rdb, Mafs, Alxndr, Cmreigrut
 * @link http://www.mediawiki.org/wiki/Extension:RSS
 *
 * Requires: 
 *  # magpie rss parser <http://magpierss.sourceforge.net/>
 *  # iconv <http://www.gnu.org/software/libiconv/>, see also <http://www.php.net/iconv>
 *
 *  07.05.2008 compatible/checked with MediaWiki 1.12
 */
 
if( !defined( 'MEDIAWIKI' ) ) {
	die();
}
 
$wgExtensionCredits['parserhook'][] = array(
	'name' => 'RSS feed',
	'author' => array('mutante', 'Duesentrieb', 'Rdb', 'Mafs', 'Alxndr', 'Wikinaut', 'Cmreigrut'),
	'version' => '19.11.2008',
	'url' => 'http://www.mediawiki.org/wiki/Extension:RSS',
	'description' => 'Displays an RSS feed on a wiki page'
); 
 
#change this according to your magpie installation!
require_once('extensions/magpierss/rss_fetch.inc');
 
//Avoid unstubbing $wgParser too early on modern (1.12+) MW versions, as per r35980
if ( defined( 'MW_SUPPORTS_PARSERFIRSTCALLINIT' ) ) {
	$wgHooks['ParserFirstCallInit'][] = 'wfRssExtension';
} else {
	$wgExtensionFunctions[] = 'wfRssExtension';
}
 
#extension hook callback function
function wfRssExtension() { 
	global $wgParser;
 
	#install parser hook for <rss> tags
	$wgParser->setHook( 'rss', 'renderRss' );
	return true;
}
 
#parser hook callback function
function renderRss( $input ) {
	global $wgOutputEncoding;
	$DefaultEncoding = "ISO-8859-1";
	$DisableCache = true;
 
	#$input = mysql_escape_string($input);
 
	if (!$input) return ""; #if <rss>-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"])) $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));
	#echo "<!-- ".print_r($rssFilterout, TRUE)." -->\n";
 
	#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 "<div>Failed to load RSS feed from $url: ".$rss->ERROR."</div>"; #localize…
	}
 
	if (!is_array($rss->items)) {
		return "<div>Failed to load RSS feed from $url!</div>"; #localize…
	}
 
	#Bild title line    
	#$title = iconv($charset, $wgOutputEncoding, $rss->channel['title']);
	#if ($rss->channel['link']) $title = "<a href='".$rss->channel['link']."'>$title</a>";
 
	$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.="<dl>";
	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("<br>", "", $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.="<dt><a href='$href'><b>$title</b></a></dt>";
		if($date) $output.=" ($pubdate)";
		if ($text) $output.="<dd>$text <b>[<a href='$href'>?</a>]</b></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);
		$pubdate = trim(iconv($charset,$wgOutputEncoding,$item['pubdate']));
		if ($pubdate=='') {
			$pubdate = trim(iconv($charset,$wgOutputEncoding,$item['dc']['date']));
		}
		$pubdate = date("F d, Y H:i",strtotime($pubdate));
 
		if ($d_title && !in_array($title, $displayed)) {
		// Add date to ouput if specified
		$output.='<li><a href="'.$href.'" title="'.$title.'">'.$title.'</a>';
			if($date) {
				$output.=" ($pubdate)";
			}
			$output.='</li>';
 
			$displayed[] = $title;
			#Cut off output when maxheads is reached:
			if (++$headcnt == $maxheads)  break;
		}
	}
	$output.="</ul>";
	}
 
	if ($DisableCache) {
		global $wgParser;
		$wgParser->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) {
#echo "<!-- wfRssFilterout <s>>\n";
	$display = true;
	if (is_array($rssFilterout)) {
		foreach ($rssFilterout as $term) {
			if ($term) {
#echo "<!</s> $term <s>>\n";
				if (preg_match("|$term|i", $text, $a)) {
#echo "<!</s> matches $text -->\n";
					$display = false;
					return $display;
				}
			}
		}
	}
	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."|", "<span style=\"background-color:".$color[$i]."; font-weight: bold;\">", $text);
	$text = preg_replace("|$endtag|", "</span>", $text);
	}
 
return $text;
}
Personal tools