Extension:RSS
From MediaWiki.org
|
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)
- 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
- Save the source (see below) in your /extensions directory in a file named rss.php
- 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.
- Optional - Check that iconv is installed; this can be done with a simple phpinfo(); script.
- 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) - Make sure Magpie can be found by PHP.
- 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)
- --Wikinaut 11:16, 7 May 2008 (UTC)
[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; }

