Difference between revisions of "Extension:SimpleRSS.php"
m (Extension:Robs RSS extension.php moved to Extension:SimpleRSS.php: remove double up) |
m (update) |
||
Line 1: | Line 1: | ||
<?php | <?php | ||
− | # Extension: | + | # 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/nad User:Rob]{{Category: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' => '[http://www.organicdesign.co.nz/nad 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 .= "<li><b>$k:</b> <i>$v</i></li>\n"; | ||
+ | return "<h3>tagRss():</h3>\n<ul>$args<li>Content:</b> $text</ul>\n"; | ||
+ | } | ||
+ | |||
+ | # Needed in some versions to prevent Special:Version from breaking | ||
+ | function __toString() { return 'SimpleRSS'; } | ||
+ | |||
+ | # Expand the rss-magic | ||
+ | function magicRss(&$parser) { | ||
− | if (! | + | # 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 = "<div id=foo> an ajax thingie </div>"; | |
− | $ | + | } |
− | + | else { | |
− | + | # 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; | ||
− | |||
− | # | + | # if no agregation, you must supply a url |
− | # | + | if(!isset($argv[useagregation]) && !isset($argv[url])) |
− | # | + | $text = "SimpleRSS: fatal error: explicit ''url'' parameter is required or implicit ''feed''=http://url.com\n"; |
+ | |||
+ | # 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); | ||
+ | $text .= print_r($url, true); | ||
− | # | + | # dump data |
− | + | foreach ($data as $v) { | |
− | + | # create head template | |
− | + | wfListArrayKeys($v->channel, "", $channel); | |
− | + | $text .= wfMakeTemplate($argv[headtemplate], $channel); | |
− | |||
− | # | + | # loop creating item templates |
− | + | for($i=0; $i<$argv[itemslimit]; $i++) { | |
− | + | if(!isset($v->items[$i])) break; | |
− | + | wfListArrayKeys($v->items[$i], "", $itemResult); | |
− | + | $text .= wfMakeTemplate($argv[itemtemplate], $itemResult); | |
+ | } | ||
+ | |||
+ | # create foot template (same as head) | ||
+ | wfListArrayKeys($v->channel, "", $channel); | ||
+ | $text .= wfMakeTemplate($argv[foottemplate], $channel); | ||
− | + | } | |
− | + | ||
− | |||
} | } | ||
− | + | ||
− | # | + | # Return result with available parser flags |
− | $ | + | return array( |
+ | $text, | ||
+ | found => true, | ||
+ | nowiki => false, | ||
+ | noparse => false, | ||
+ | noargs => false, | ||
+ | isHTML => false | ||
+ | ); | ||
+ | |||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | } # object end | |
− | # | + | |
− | + | ||
− | + | # build array of key-value pairs into template syntax | |
− | return $ | + | # {{TemplateName|title=foo|link=http://foo.com|description=Hello!}} |
− | + | function wfMakeTemplate($template, $array) { | |
+ | foreach($array as $key => $value) | ||
+ | $params .= "\n|".$key."=".$value; | ||
+ | return "{{".$template.$params."}}\n"; | ||
+ | } | ||
+ | |||
− | function | + | # build array of keys to publish (it's recursive!) |
+ | # WARNING because this function uses a hash to eliminate duplicate keys | ||
+ | # it no good for lists of items, only one at a time. | ||
+ | function wfListArrayKeys($array, $parent="", &$result) { | ||
foreach($array as $key => $value) { | foreach($array as $key => $value) { | ||
− | |||
if(is_array($value)) | if(is_array($value)) | ||
− | + | wfListArrayKeys($value, "$parent$key", $result); | |
+ | else | ||
+ | $result[$parent.$key] = $value; | ||
} | } | ||
− | |||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
function wfReadRSS($urls) { | function wfReadRSS($urls) { | ||
− | $data = array(); | + | if(is_array($urls)) { |
− | + | $data = array(); | |
− | + | foreach ($urls as $key => $value) { | |
+ | $data[$key] = fetch_rss($value); | ||
} | } | ||
+ | } else $data[] = fetch_rss($urls); | ||
return $data; | return $data; | ||
} | } | ||
− | + | ||
− | + | # 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; | |
− | + | } | |
− | + | ||
− | + | # Called from $wgExtensionFunctions array when initialising extensions | |
− | + | function wfSetupSimpleRSS() { | |
− | + | global $wgSimpleRSS; | |
− | + | $wgSimpleRSS = new SimpleRSS(); | |
+ | } | ||
+ | |||
?> | ?> |
Revision as of 20:33, 18 October 2007
<?php
- Extension:SimpleRSS
- - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
- - 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 .= "
\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 = "
";
} else { # 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;
# if no agregation, you must supply a url
if(!isset($argv[useagregation]) && !isset($argv[url]))
$text = "SimpleRSS: fatal error: explicit url parameter is required or implicit feed=http://url.com\n";
# 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); $text .= print_r($url, true);
# dump data foreach ($data as $v) { # create head template wfListArrayKeys($v->channel, "", $channel); $text .= wfMakeTemplate($argv[headtemplate], $channel);
# loop creating item templates for($i=0; $i<$argv[itemslimit]; $i++) { if(!isset($v->items[$i])) break; wfListArrayKeys($v->items[$i], "", $itemResult); $text .= wfMakeTemplate($argv[itemtemplate], $itemResult); }
# create foot template (same as head) wfListArrayKeys($v->channel, "", $channel); $text .= wfMakeTemplate($argv[foottemplate], $channel);
}
}
# Return result with available parser flags return array( $text, found => true, nowiki => false, noparse => false, noargs => false, isHTML => false );
}
} # object end
- build array of key-value pairs into template syntax
- Template:TemplateName
function wfMakeTemplate($template, $array) { foreach($array as $key => $value) $params .= "\n|".$key."=".$value; return "Template:".$template.$params."\n"; }
- build array of keys to publish (it's recursive!)
- WARNING because this function uses a hash to eliminate duplicate keys
- 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) { if(is_array($urls)) { $data = array(); foreach ($urls as $key => $value) { $data[$key] = fetch_rss($value); } } else $data[] = fetch_rss($urls); return $data; }
- 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; }
- Called from $wgExtensionFunctions array when initialising extensions
function wfSetupSimpleRSS() { global $wgSimpleRSS; $wgSimpleRSS = new SimpleRSS(); }
?>