User:Rdb78/RSS

From Meta, a Wikimedia project coordination wiki
Jump to navigation Jump to search
Blue Glass Arrow.svg MediaWiki logo.png
This page should be moved to MediaWiki.org.
Please do not move the page by hand. It will be imported by a MediaWiki.org administrator with the full edit history. In the meantime, you may continue to edit the page as normal.

This is a slightly modified version of the RSS engine from User:Duesentrieb, which in turn is an extended version of the RSS-feed extension by Mutante

It now supports limiting the number of headlines displayed by the feed to a number passed as an argument, of the form max=x where x is the number of headlines you want.

Further features added : highlighting and filtering, see RSS - Mafs 20:42, 10 July 2005 (UTC)

<?php
 # RSS-Feed Mediawiki extension
 # 
 # original by mutante 25.03.2005
 # extended by Duesentrieb 30.04.2005
 # extended by Rdb78 07.07.2005
 #
 # 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 ress section may contain parameters
 #  separated by a pipe ("|"), just like links and templates. Two 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.
 #
 # Example: 
 #    <rss>http://slashdot.org/slashdot.rss|charset=UTF-8|short|max=5</rss>
 #
 
 
 #change this according to your magpie installation!
 require_once('magpierss-0.71.1/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 ) {
    global $wgOutputEncoding;
 
    # $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))]= True;
        else {
                list($k,$v)= explode("=",$f,2);
                $args[strtolower(trim($k))]= trim($v);
        }
    }
 
    #get charset from argument-array    
    $charset= @$args["charset"];
    if (!$charset) $charset= $wgOutputEncoding;

    #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
    $short= @$args["short"];
    
    
    #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="<h3>$title</h3>";
    
    #Bild items
    if ($short) { #short item list
        $output.="<ul>";
        foreach ($rss->items as $item) {
                $href = trim(iconv($charset,$wgOutputEncoding,$item['link']));
                $title = trim(iconv($charset,$wgOutputEncoding,$item['title']));
                
                $output.="<li><a href='$href'>$title</a></li>";	

		#Cut off output when maxheads is reached:
		if (++$headcnt == $maxheads)
			break;
        }
        $output.="</ul>";
    }
    else { #full item list
        $output.="<dl>";
        foreach ($rss->items as $item) {
                $href = trim(iconv($charset,$wgOutputEncoding,$item['link']));
                $title = trim(iconv($charset,$wgOutputEncoding,$item['title']));
                
                #bild 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);
                }
                else $text = "";
                
                $output.="<dt><a href='$href'>$title</a></dt>";
                if ($text) $output.="<dd>$text</dd>\n";

		#Cut off output when maxheads is reached:
		if (++$headcnt == $maxheads)
			break;
        }
        $output.="</dl>";
    }
    
    return $output;
    
 }
 
 ?>