Difference between revisions of "Extension:SimpleRSS.php"

From Organic Design wiki
m (update)
(rm trailing ?>)
 
(2 intermediate revisions by one other user not shown)
Line 2: Line 2:
 
# Extension:SimpleRSS{{Category:Extensions|SimpleRSS}}{{php}}
 
# Extension:SimpleRSS{{Category:Extensions|SimpleRSS}}{{php}}
 
# - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
 
# - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
# - Author: [http://www.organicdesign.co.nz/nad User:Rob]{{Category:Extensions created with Template:Extension}}
+
# - Author: [http://www.organicdesign.co.nz/Rob User:Rob]{{Category:Extensions created with Template:Extension}}
 
   
 
   
 
if (!defined('MEDIAWIKI')) die('Not an entry point.');
 
if (!defined('MEDIAWIKI')) die('Not an entry point.');
Line 68: Line 68:
 
else {
 
else {
 
# Not using ajax, render the output now
 
# Not using ajax, render the output now
 
# reserved param keys - other keys are interpreted as feed = url pairs
 
$reserved = array('headtemplate', 'itemtemplate', 'foottemplate', 'itemslimit',
 
'useajax', 'useagregation', 'url');
 
 
# default values if not passed as params: maybe get from globals
 
if(!isset($argv[headtemplate])) $argv[headtemplate] = 'RSSHead';
 
if(!isset($argv[itemtemplate])) $argv[itemtemplate] = 'RSSItem';
 
if(!isset($argv[foottemplate])) $argv[foottemplate] = 'RSSFoot';
 
if(!isset($argv[itemslimit])) $argv[itemslimit] = 10;
 
  
 +
# TODO enforce required params: url template
 +
$error = "fatal error: no template provided";
 +
$error = "fatal error: no url provided";
  
# if no agregation, you must supply a url
+
# template params
if(!isset($argv[useagregation]) && !isset($argv[url]))
+
$headTemplate = "RSSHead";
$text = "SimpleRSS: fatal error: explicit ''url'' parameter is required or implicit ''feed''=http://url.com\n";
+
$itemTemplate = "RSSItem";
+
$footTemplate = "RSSFoot";
# if no url specified, ignore any reserved words and take the rest
 
# as implicit url parameters
 
foreach($argv as $key => $value) {
 
if(!in_array($key, $reserved))
 
$url[$key] = $value;
 
}
 
 
 
if(!isset($argv[url]))
 
$data = wfReadRSS($url);
 
else {
 
# url param is present
 
$data = wfReadRSS($argv[url]);
 
}
 
  
$text .= print_r($argv, true);
+
# grab each url and process
$text .= print_r($url, true);
+
$data = wfReadRSS(preg_split("/[\n\r]/", $argv[url], -1, PREG_SPLIT_NO_EMPTY));
  
 
# dump data  
 
# dump data  
Line 105: Line 85:
 
# create head template
 
# create head template
 
wfListArrayKeys($v->channel, "", $channel);
 
wfListArrayKeys($v->channel, "", $channel);
$text .= wfMakeTemplate($argv[headtemplate], $channel);
+
$text .= wfMakeTemplate($headTemplate, $channel);
  
 
# loop creating item templates
 
# loop creating item templates
for($i=0; $i<$argv[itemslimit]; $i++) {
+
foreach($v->items as $item) {
if(!isset($v->items[$i])) break;
+
wfListArrayKeys($item, "", $itemResult);
wfListArrayKeys($v->items[$i], "", $itemResult);
+
$text .= wfMakeTemplate($itemTemplate, $itemResult);
$text .= wfMakeTemplate($argv[itemtemplate], $itemResult);
 
 
}
 
}
+
 
 
# create foot template (same as head)
 
# create foot template (same as head)
 
wfListArrayKeys($v->channel, "", $channel);
 
wfListArrayKeys($v->channel, "", $channel);
$text .= wfMakeTemplate($argv[foottemplate], $channel);
+
$text .= wfMakeTemplate($footTemplate, $channel);
  
 
}
 
}
Line 161: Line 140:
  
 
function wfReadRSS($urls) {
 
function wfReadRSS($urls) {
if(is_array($urls)) {
+
$data = array();
$data = array();
+
foreach ($urls as $url) {
foreach ($urls as $key => $value) {
+
$data[] = fetch_rss($url);
$data[$key] = fetch_rss($value);
 
 
}
 
}
} else $data[] = fetch_rss($urls);
 
 
return $data;
 
return $data;
 
}
 
}
Line 183: Line 160:
 
$wgSimpleRSS = new SimpleRSS();
 
$wgSimpleRSS = new SimpleRSS();
 
}
 
}
 
 
 
?>
 

Latest revision as of 19:49, 28 December 2008

<?php

  1. Extension:SimpleRSS
Info.svg These are the MediaWiki extensions we're using and/or developing. Please refer to the information on the mediawiki.org wiki for installation and usage details. Extensions here which have no corresponding mediawiki article are either not ready for use or have been superseded. You can also browse our extension code in our local Subversion repository or our GitHub mirror.

Template:Php

  1. - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
  2. - Author: User:RobCategory:Extensions created with Template:Extension

if (!defined('MEDIAWIKI')) die('Not an entry point.');

define('SIMPLERSS_VERSION','1.0.0, 2007-05-05');

$wgSimpleRSSMagic = "rss"; $wgSimpleRSSTag = "rss"; $wgExtensionFunctions[] = 'wfSetupSimpleRSS'; $wgHooks['LanguageGetMagic'][] = 'wfSimpleRSSLanguageGetMagic';

$wgExtensionCredits['parserhook'][] = array( 'name' => 'SimpleRSS', 'author' => 'User:Rob', 'description' => 'Integration of RSS with MediaWiki', 'url' => 'http://www.organicdesign.co.nz/Extension:SimpleRSS', 'version' => SIMPLERSS_VERSION );

require_once('extensions/SimpleRSS/magpierss-0.72/rss_fetch.inc');

class SimpleRSS {

# Properties var $prop1 = 'default value'; var $prop2 = 'default value';

# Constructor function SimpleRSS() { global $wgHooks,$wgParser,$wgSimpleRSSMagic,$wgSimpleRSSTag;

# Add the parser-function $wgParser->setFunctionHook($wgSimpleRSSMagic,array($this,'magicRss'));

# Add the tagHook $wgParser->setHook($wgSimpleRSSTag,array($this,'tagRss'));

}

# Convert the <rss> tags to HTML function tagRss($text,$argv,&$parser) { $args = ;

foreach ($argv as $k => $v) $args .= "

  • $k: $v
  • \n"; return "

    tagRss():

    \n

      $args
    • Content: $text

    \n";

    }

    # Needed in some versions to prevent Special:Version from breaking function __toString() { return 'SimpleRSS'; }

    # Expand the rss-magic function magicRss(&$parser) {

    # Populate $argv with both named and numeric parameters $argv = array(); foreach (func_get_args() as $arg) if (!is_object($arg)) { if (preg_match('/^(.+?)\\s*=\\s*(.+)$/',$arg,$match)) $argv[$match[1]] = $match[2]; else $argv[] = $arg; }

    global $wgRSSUseAjax;

    if ($wgRSSUseAjax) { # Render a container which does ajax requests for content

    $text = "

    an ajax thingie

    ";

    } else { # Not using ajax, render the output now

    # TODO enforce required params: url template $error = "fatal error: no template provided"; $error = "fatal error: no url provided";

    # template params $headTemplate = "RSSHead"; $itemTemplate = "RSSItem"; $footTemplate = "RSSFoot";

    # grab each url and process $data = wfReadRSS(preg_split("/[\n\r]/", $argv[url], -1, PREG_SPLIT_NO_EMPTY));

    # dump data foreach ($data as $v) { # create head template wfListArrayKeys($v->channel, "", $channel); $text .= wfMakeTemplate($headTemplate, $channel);

    # loop creating item templates foreach($v->items as $item) { wfListArrayKeys($item, "", $itemResult); $text .= wfMakeTemplate($itemTemplate, $itemResult); }

    # create foot template (same as head) wfListArrayKeys($v->channel, "", $channel); $text .= wfMakeTemplate($footTemplate, $channel);

    }

    }

    # Return result with available parser flags return array( $text, found => true, nowiki => false, noparse => false, noargs => false, isHTML => false );

    }


    } # object end


    1. build array of key-value pairs into template syntax
    2. Template:TemplateName

    function wfMakeTemplate($template, $array) { foreach($array as $key => $value) $params .= "\n|".$key."=".$value; return "Template:".$template.$params."\n"; }


    1. build array of keys to publish (it's recursive!)
    2. WARNING because this function uses a hash to eliminate duplicate keys
    3. it no good for lists of items, only one at a time.

    function wfListArrayKeys($array, $parent="", &$result) { foreach($array as $key => $value) { if(is_array($value)) wfListArrayKeys($value, "$parent$key", $result); else $result[$parent.$key] = $value; } }

    function wfReadRSS($urls) { $data = array(); foreach ($urls as $url) { $data[] = fetch_rss($url); } return $data; }


    1. Needed in MediaWiki >1.8.0 for magic word hooks to work properly

    function wfSimpleRSSLanguageGetMagic(&$magicWords,$langCode = 0) { global $wgSimpleRSSMagic; $magicWords[$wgSimpleRSSMagic] = array(0,$wgSimpleRSSMagic); return true; }

    1. Called from $wgExtensionFunctions array when initialising extensions

    function wfSetupSimpleRSS() { global $wgSimpleRSS; $wgSimpleRSS = new SimpleRSS(); }