Extension:FeedImport

From MediaWiki.org

Jump to: navigation, search

       

Manual on MediaWiki Extensions
List of MediaWiki Extensions
Crystal Clear action run.png
FeedImport

Release status: beta

Implementation  Tag
Description This sample is used to create extension articles.
Author(s)  PhilFry;

Cogdog; Piku; Arcy; Mafs; Rdb78; Duesentrieb; Mutante.

License No license specified
Download SVN
forked from Extension:GISWiki/RSS, added template support and included the necessary changes to work with mw 1.9 from the discussion page.
Example  <rss>http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/world/rss.xml|template=BBC</rss>

check usage (experimental)

Contents

[edit] What can this extension do?

Integrates an RSS or Atom feed into a Mediawiki page. It's based on Extension:GISWiki/RSS and additionally supports the use of Mediawiki templates to render the feed items.

[edit] Installation

  1. Install Magpie RSS. (No need to reference rss_fetch.inc, this is done from within the FeedImport extension.)
  2. Copy feedimport.php into your extension directory.
  3. Edit the MAGPIE_DIR variable to point to the Magpie location in feedimport.php: define('MAGPIE_DIR', '/opt/local/lib/php/magpierss/');
  4. Reference feedimport.php from LocalSettings.php: require_once("$IP/extensions/feedimport.php");

[edit] Usage

[edit] Parameters

charset 
The charset used by the feed. iconv is used to convert this. Default: ISO-8859-1.
date_format 
A format string accepted by PHP's date() function. Default: r.
dc_creator 
filter 
Show only rss items containing at least one of the terms.
highlight 
The terms separated by a space are highlighted.
max 
Shows x most recent headlines.
nodate 
Don't display an item's date. Default: off.
reverse 
Display the rss items in reverse order.
short 
Do not show the description text for each news item.
template 
The MediaWiki template to use. The template can use the parameters title, description, creator, date and link. Default: Blogentry.
title 
Display an alternative title instead of channel name. title=none displays no channel name.

[edit] Example

[edit] Embedding the feed

<rss>http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/world/rss.xml|template=BBC</rss>

[edit] The Template

: [{{{link}}} {{{title}}}]
:: {{{description}}}
:: {{{creator}}} {{{date}}}

[edit] Changes to LocalSettings.php

require_once("$IP/extensions/feedimport.php");

[edit] Code

Download from SVN or use the following code. SVN is the official release, but as of 2007-10-14, the code below is more current.

Please add improvements to the code below.

<?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
# Included changes for Mediawiki 1.9 and added Template support by User:PhilFry 2007-08-03
# minor bug fix at line 217. added 'isset($args["date_timestamp"]) and' User:Arcy 14. 10. 2007
# 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',  '/opt/local/lib/php/magpierss/');
 
# specify magpie cache directory, make sure it is writable (chmod 0666)
define('MAGPIE_CACHE_DIR', MAGPIE_DIR . 'cache/');
 
# 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";
  $DefaultTemplate = "Blogentry";
  $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;
 
  $template = @$args["template"];
  if (!$template) $template= $DefaultTemplate;
 
  #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 = isset($args["short"]);
 
  #get reverse-flag from argument-array
  $reverse = isset($args["reverse"]);
 
  #get date-flag from argument-array
  $nodate = isset($args["nodate"]);
 
  $dc_creator = isset($args["dc_creator"]);
 
  if (isset($args["date_format"]))
  	$date_format = $args["date_format"];
  else
  	$date_format = "r";
 
  #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 (rss->error) from $url: ".$rss->ERROR."</div>"; #localize...
  }
 
  if (!is_array($rss->items)) {
     # return "Feed error"; #localize...
     return "<div>Failed to load RSS feed (not array) from $url</div>"; #localize...
  }
 
  #Build title line    
  #get title from argument-array    
 
  $rssTitle= @$args["title"];
  $rssTitle= trim($rssTitle);
 
  if ($rssTitle !=='none') {
    if ($rssTitle=='') {
        $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=""; #placeholder for output to insert when no title is shown, e.g. "\n\n\n"
  }
 
  if ($reverse) $rss->items = array_reverse($rss->items);
 
  $description = False; 
  foreach ($rss->items as $item) {
      if ($item['description']) {$description = True; break;}
  }
 
  #Bild items
    $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']));
 
      # More Yahoo clean-up, their feeds have line beaks in titles
      $title = ereg_replace("(\r\n|\n|\r)", " ", $title);
 
      $d_title = wfRssFilter ($title, $rssFilter);
      $title= wfRssHighlight($title, $rssHighlight);
 
      #bild description text if desired
      if ($item["description"]) {
        $text= trim(iconv($charset,$wgOutputEncoding,$item['description']));
 
        #avoid pre-tags
        $text = ereg_replace("(\r\n|\n|\r|\t)", " ", $text);
 
        // weird Yahoo content encoding
        $text= str_replace("&#60;","<", $text);
 
        # remove HTML; coment this line out if you really want it rendered
        $text=strip_tags($text);
 
        $d_text = wfRssFilter ($text, $rssFilter);
        $text= wfRssHighlight($text, $rssHighlight);
 
        $display = $d_text or $d_title;
 
      } else {
 
        $text = "";
        $display = $d_title;
 
      }       
 
      # add date of item if enabled and it exists in the feed
      if (!$nodate) {
      	$dateinfo = "";
        if (isset($args["date_timestamp"]) and $item['date_timestamp']) {
      		$dateinfo = date($date_format, trim(iconv($charset,$wgOutputEncoding,$item['date_timestamp'])));
      	} else if ($item['dc']['date']) {
      		$dateinfo = date($date_format, trim(iconv($charset,$wgOutputEncoding,strtotime($item['dc']['date']))));
        }
       	$datedisp = " <small>($dateinfo)</small>";
      } else {
         $datedisp = '';
      }
 
      if ($dc_creator and $item['dc']['creator']) {
      	$creator = $item['dc']['creator'];
      } else {
      	$creator = "";
      }
 
      if ($display) {
      	 $output.="{{".$template."\n";
      	 $output.="|title=$title\n";
      	 $output.="|link=$href\n";
      	 $output.="|date=$datedisp\n";
      	 if (!$short) {
	      	 $output.="|description=$text\n";
	     }
      	 $output.="|creator=$creator}}\n";
      }
 
    #Cut off output when maxheads is reached:
    if (++$headcnt == $maxheads)  break;
 
    # $output.="</dl>";
  }
  if ($DisableCache) {
        global $wgVersion;
 
        $dbr =& wfGetDB( DB_SLAVE );
 
        # 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());
 
        $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";
 
        $dbr->query($sql, __METHOD__);
  } 
  $out = $parser->parse ($output, $parser->mTitle,$parser->mOptions, true, false);
  return $out->getText();
}
 
 
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 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;
}
 
?>

[edit] See also