How to get dynamic content RSS feeds extension into article Mediawiki
.//. This manual is for getting RSS feeds to work in MediaWiki 1.9.3 and lower. .//.
- First open notepad and put following text in:
<?php # RSS-Feed Mediawiki extension # # 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 User:Arcy 07.09.2005 # Updated for MediaWiki 1.6 by User:piku 13.06.2006 # Update for Wikicode output, by User:cogdog 14.jul.2006 # Adding Date output, by User:Arcy 30. 07. 2006 # Update by Vahrmeijer 03.03.2007 http://www.leerwiki.nl # # Requires: # * magpie rss parser <http://magpierss.sourceforge.net/> # * iconv <http://www.gnu.org/software/libiconv/>, see also <http://www.php.net/iconv> # # Installation: # * put this file (rss.php) into the extension directory of your mediawiki installation # * add the following to the end of LocalSettings.php: include("extensions/rss.php"); # * make sure magpie can be found by PHP. # # 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. # * 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. # * reverse display the rss items in reverse order. # * title=x display an alternative title instead of chanel name. # * title = none dont display any title. # * date display the date and time stamp below the title. # # Example: # <rss>http://slashdot.org/slashdot.rss|charset=UTF-8|short|max=5</rss> # # define location of magpie ) define('MAGPIE_DIR', '/fullpath/to/my/magpie/'); # specify magpie cache directory, make sure it is writable (chmod 0666) define('MAGPIE_CACHE_DIR', MAGPIE_DIR . 'cache/'); # specify output format for date using PHP date formats define ('DATE_FORMAT', "r"); # access magpie library require_once(MAGPIE_DIR . 'rss_fetch.inc'); #install extension hook $wgExtensionFunctions[] = "wfRssExtension"; #extension hook callback function function wfRssExtension() { global $wgParser; #install parser hook for <rss> tags $wgParser->setHook( "rss", "renderRss" ); } #parser hook callback function function renderRss($input, $argv, $parser = null) { if (!$parser) $parser =& $GLOBALS['wgParser']; 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<a href="[strtolower(trim($f))]" target="_blank" rel="nofollow">[strtolower(trim($f))]</a>= False; else { list($k,$v)= explode("=",$f,2); if (trim($v)==False) $args<a href="<a href="[strtolower(trim($k))]" target="_blank" rel="nofollow">[strtolower(trim($k))]</a>" target="_blank" rel="nofollow"><a href="[strtolower(trim($k))]" target="_blank" rel="nofollow">[strtolower(trim($k))]</a></a> = False; else $args<a href="<a href="[strtolower(trim($k))]" target="_blank" rel="nofollow">[strtolower(trim($k))]</a>" target="_blank" rel="nofollow"><a href="[strtolower(trim($k))]" target="_blank" rel="nofollow">[strtolower(trim($k))]</a></a>= 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 "<div>Failed to load RSS feed from $url: ".$rss->ERROR."</div>"; #localize... <p> } </p><p> if (!is_array($rss->items)) { # return "Feed error"; #localize... </p> #return "<div>Failed to load RSS feed from $url!</div>"; #localize... <p> } </p><p> #Bild title line #get title from argument-array </p><p> $rssTitle= @$args["title"]; $rssTitle= trim($rssTitle); </p><p> if ($rssTitle !=='none') { if ($rssTitle==<i>) {</i> $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="\n\n\n"; } </p><p> if ($reverse) $rss->items = array_reverse($rss->items); </p><p> $description = False; foreach ($rss->items as $item) { if ($item['description']) {$description = True; break;} } </p><p> #Bild items if (!$short and $description) { #full item list </p><p> $output.=""; foreach ($rss->items as $item) { </p><p> $d_text = true; $d_title = true; </p><p> $href = trim(iconv($charset,$wgOutputEncoding,$item['link'])); $title = trim(iconv($charset,$wgOutputEncoding,$item['title'])); </p><p> # More Yahoo clean-up, their feeds have line beaks in titles $title = ereg_replace("(\r\n|\n|\r)", " ", $title); </p><p> $d_title = wfRssFilter ($title, $rssFilter); $title= wfRssHighlight($title, $rssHighlight); </p><p> #bild description text if desired if ($item["description"]) { $text= trim(iconv($charset,$wgOutputEncoding,$item['description'])); </p><p> #avoid pre-tags $text = ereg_replace("(\r\n|\n|\r|\t)", " ", $text); </p><p> // weird Yahoo content encoding $text= str_replace("<","<", $text); </p><p> # remove HTML; coment this line out if you really want it rendered $text=strip_tags($text); </p><p> $d_text = wfRssFilter ($text, $rssFilter); $text= wfRssHighlight($text, $rssHighlight); </p><p> $display = $d_text or $d_title; </p><p> } else { </p><p> $text = ""; $display = $d_title; </p><p> } </p><p> # 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 = " <small>($dateinfo)</small>"; } else { $datedisp = <i>;</i> } </p><p> if ($display) { $output.="* [$href $title] $datedisp"; if ($text) $output.=" $text"; $output .= "\n"; } </p><p> #Cut off output when maxheads is reached: if (++$headcnt==$maxheads) break; </p><p> } # $output.="</dl>"; } else { #short item list </p> # $output.="<ul>"; 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 = " <small>($dateinfo)</small>"; } else { $datedisp = <i>;</i> } if ($d_title ) $output.="* [$href $title] $datedisp\n"; #Cut off output when maxheads is reached: if (++$headcnt==$maxheads) break; } # $output.="</ul>"; <p> } </p><p> if ($DisableCache) { global $wgVersion; </p><p> $dbr =& wfGetDB( DB_SLAVE ); </p><p> # 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 = $dbr->addQuotes($wgTitle->getDBkey()); </p><p> $version = preg_replace("/^([1-9]).([1-9]).*/", "\\1\\2", $wgVersion); $sql = "UPDATE $wgDBprefix" . "page SET page_touched='$now' WHERE page_namespace=$ns AND page_title=$ti"; </p><p> $dbr->query($sql, __METHOD__); } </p><p> $out = $parser->parse ($output, $parser->mTitle,$parser->mOptions, true, false); return $out->getText(); } </p><p>function wfRssFilter ($text, $rssFilter) { </p><p> $display = true; </p><p> if (is_array($rssFilter)) { foreach($rssFilter as $term) { </p><p> if ($term) { $display = false; if (preg_match("|$term|i", $text, $a)) { $display = true; return $display; } } if ($display) break; } } return $display; } </p><p>function wfRssHighlight($text, $rssHighlight) { </p><p> $i=0; $starttag = "v8x5u3t3u8h"; $endtag = "q8n4f6n4n4x"; </p><p> $color[]="coral"; $color[]="greenyellow"; $color[]="lightskyblue"; $color[]="gold"; $color[]="violet"; </p><p> $count_color = count($color); </p><p> 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>", $text); $text = preg_replace("|$endtag|", "</span>", $text); } </p><p> return $text; } </p><p>?> </p>
- Now save the file as RSSinputextension.php
- Upload it in the Mediawiki extensions directory
- Put inside Localsettings.php:
require_once("extensions/RSSinputextension.php");
Test the Extension by Example:
<rss>http://slashdot.org/slashdot.rss|charset=UTF-8|short|max=5</rss>