|
|
(61 intermediate revisions by 2 users not shown) |
Line 1: |
Line 1: |
− | <?
| + | {{svn|http://svn.wikimedia.org/viewvc/mediawiki/trunk/extensions/Livelets}} |
− | # Extension:Livelets
| |
− | # - Allows live articles to be transcluded which update automatically on change in a non-polling, fully event-driven way
| |
− | # - Version 0.1 (2007-03-30)
| |
− | # - See http://www.mediawiki.org/wiki/Extension:Livelets for installation and usage details
| |
− | # - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
| |
− | # - Author: http://www.organicdesign.co.nz/nad
| |
| | | |
− | $wgLiveletsMagic = "live"; # the parser-function name for doing live-transclusions
| + | == Notes == |
− | $wgExtensionFunctions[] = 'wfSetupLivelets';
| + | Add dev notes here, e.g. regarding the SWF live updates |
− | $wgHooks['LanguageGetMagic'][] = 'wfLiveletsLanguageGetMagic';
| |
− | $wgHooks['UnknownAction'][] = 'wfLiveletsActionHandler';
| |
− | | |
− | class Livelets {
| |
− | | |
− | var $version = '0.1, 2007-03-30';
| |
− | var $magic;
| |
− | var $args;
| |
− | var $id = 0;
| |
− | | |
− | # Constructor
| |
− | function Livelets($magic) {
| |
− | global $wgParser,$wgHooks,$wgOut,$wgScript;
| |
− | $this->magic = $magic;
| |
− | $this->args = array();
| |
− | $wgParser->setFunctionHook($magic,array($this,'functionHook'));
| |
− | $wgParser->setHook($magic,array($this,'tagHook'));
| |
− | $wgOut->addScript("<script type='text/javascript'>
| |
− | | |
− | // Request an URL
| |
− | function liveletRequest(livelet) {
| |
− | livelet.url = '$wgScript?title=' + livelet.getAttribute('title') + '&action=live'
| |
− | livelet.xmlhttp = null
| |
− | if (window.XMLHttpRequest) livelet.xmlhttp = new XMLHttpRequest()
| |
− | else if (window.ActiveXObject) livelet.xmlhttp = new ActiveXObject('Microsoft.XMLHTTP')
| |
− | if (livelet.xmlhttp != null) {
| |
− | livelet.xmlhttp.onreadystatechange = stateChange
| |
− | livelet.xmlhttp.open('GET',livelet.url,true)
| |
− | livelet.xmlhttp.send(null)
| |
− | livelet.xmlhttp.livelet = livelet
| |
− | alert(livelet.url + ' requested')
| |
− | }
| |
− | else alert('Your browser does not support XMLHTTP!')
| |
− | }
| |
− | | |
− | // Update the livelet content when loaded
| |
− | function stateChange() {
| |
− | if (this.readyState == 4) {
| |
− | if (this.status == 200) {
| |
− | //alert(this.livelet.innerHTML)
| |
− | alert(this.responseText + 'recvd')
| |
− | //this.livelet.innerHTML = this.responseText
| |
− | }
| |
− | else alert('Problem retrieving XML data!')
| |
− | }
| |
− | }
| |
− | </script>");
| |
− | }
| |
− | | |
− | # Remove live container content, store its parameters and convert it to $magic tags
| |
− | function functionHook(&$parser) {
| |
− | $magic = $this->magic;
| |
− | $id = 'livelet'.$this->id++;
| |
− | $args = array();
| |
− | foreach (func_get_args() as $arg) if (!is_object($arg)) {
| |
− | if (preg_match('/^(.+?)=(.+)$/',$arg,$match)) $args[$match[1]] = $match[2]; else $args[] = $arg;
| |
− | }
| |
− | $this->args[$id] = $args;
| |
− | return "<$magic>$id</$magic>";
| |
− | }
| |
− | | |
− | # Convert the $magic tags to client-side javascript request code from its stored parameters
| |
− | function tagHook($id,$argv,&$parser) {
| |
− | global $wgScript;
| |
− | $args = $this->args[$id];
| |
− | $title = $args[0];
| |
− | $html = "<div class='livelet' id='$id' title='$title'>livelet#$id=$title</div>";
| |
− | $html .= "<script type='text/javascript'>liveletRequest(document.getElementById('$id'))</script>";
| |
− | return $html;
| |
− | }
| |
− | | |
− | }
| |
− | | |
− | # Called from $wgExtensionFunctions array when initialising extensions
| |
− | function wfSetupLivelets() {
| |
− | global $wgLivelets,$wgLiveletsMagic;
| |
− | $wgLivelets = new Livelets($wgLiveletsMagic);
| |
− | }
| |
− | | |
− | # Needed in MediaWiki >1.8.0 for magic word hooks to work properly
| |
− | function wfLiveletsLanguageGetMagic(&$magicWords,$langCode = 0) {
| |
− | global $wgLiveletsMagic;
| |
− | $magicWords[$wgLiveletsMagic] = array(0,$wgLiveletsMagic);
| |
− | return true;
| |
− | }
| |
− | | |
− | # Return naked if live action requested
| |
− | function wfLiveletsActionHandler($action,$title) {
| |
− | global $wgHooks;
| |
− | if ($action == 'live') $wgHooks['ParserAfterTidy'][] = 'wfLiveletsNakedArticle';
| |
− | return true;
| |
− | }
| |
− | | |
− | # Output the naked page and die
| |
− | function wfLiveletsNakedArticle(&$parser,&$text) {
| |
− | while(@ob_end_clean());
| |
− | echo($text);
| |
− | die;
| |
− | }
| |
− | ?>
| |