Extension:FeedImport

From MediaWiki.org

Jump to: navigation, search
Manual on MediaWiki Extensions
List of MediaWiki Extensions
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 coming soon

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

  • Install magpie
  • copy feedimport.php into your extension directory.
  • edit the MAGPIE_DIR variable accordingly in feedimport.php

[edit] Usage

[edit] Parameters

  • template: the MW template to use. The template should support the parameters title, description, dc_creator, date and link
  • nodate: don't display an item's date. default: off
  • date_format: a format string accepted by PHP's date() function

[edit] Example

[edit] Embedding the feed

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

[edit] The Template

: [{{{link}}} {{{title}}}]
:: {{{description}}}
:: {{{dc_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 guaranteed to be 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

Personal tools