Difference between revisions of "Extension:SimpleRSS.php"
m (Extension:Robs RSS extension.php moved to Extension:SimpleRSS.php: remove double up) |
(rm trailing ?>) |
||
(3 intermediate revisions by 2 users not shown) | |||
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/ | + | # - Author: [http://www.organicdesign.co.nz/Rob 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) { | |
− | $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 | |
− | |||
− | |||
− | |||
− | |||
− | + | # 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 | |
− | # | + | |
− | + | ||
− | + | # 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(); | $data = array(); | ||
Line 96: | Line 147: | ||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | # 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(); | ||
+ | } |
Latest revision as of 19:49, 28 December 2008
<?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
# 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
- 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) { $data = array(); foreach ($urls as $url) { $data[] = fetch_rss($url); } 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(); }