Extension:Livelets.php

From Organic Design wiki
Revision as of 04:35, 10 May 2007 by Nad (talk | contribs) (use {{AddJavaScript}})

<?

  1. Extension:Livelets{{#Security:*|dev}}{{#Security:view|*}}Template:Php
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.
  1. - Allows live articles to be transcluded which update automatically on change in a non-polling, fully event-driven way
  2. - See http://www.mediawiki.org/wiki/Extension:Livelets for installation and usage details
  3. - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
  4. - Author: http://www.organicdesign.co.nz/nad

define('LIVELETS_VERSION', '0.0.3, 2007-05-10');

$wgLiveletsMagic = "live"; # the parser-function name for doing live-transclusions $wgExtensionFunctions[] = 'wfSetupLivelets'; $wgHooks['LanguageGetMagic'][] = 'wfLiveletsLanguageGetMagic';

$wgExtensionCredits['parserhook'][] = array( 'name' => 'Livelets', 'author' => 'User:Nad',

      'description' => 'dynamic nonpolling updates of articles',

'url' => 'http://www.mediawiki.org/wiki/Extension:Livelets',

       'version'    => LIVELETS_VERSION

);

class Livelets {

var $version = LIVELETS_VERSION; var $magic; var $args; var $id = 0;

# Constructor function Livelets($magic) { global $wgParser,$wgHooks,$wgOut,$wgScript,$wgLiveletsPath; $live = array_key_exists('live',$_REQUEST); $this->magic = $magic; $this->args = array(); $wgParser->setFunctionHook($magic,array($this,'functionHook')); $wgParser->setHook($magic,array($this,'tagHook'));

# If the query string contains "live" return naken and die if ($live) $wgHooks['OutputPageBeforeHTML'][] = 'wfLiveletsNakedArticle';

# Add the livelets JavaScript functions to the output page else $wgAddJavaScriptFunctions['Livelets'] = "

// Keep record of livelets on page var livelets = new Array();

// Request an URL function liveletRequest(id) { livelet = document.getElementById(id) livelets.push(livelet); livelet.id = id livelet.url = '$wgScript?title=' + livelet.getAttribute('title') + '&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) } else alert('Your browser does not support XMLHTTP!') }

// Update the livelet content when loaded function stateChange() { for (var i = 0; i < livelets.length; i++) { var livelet = livelets[i]; var xmlhttp = livelet.xmlhttp if (xmlhttp.readyState == 4) { if (xmlhttp.status == 200) livelet.innerHTML = xmlhttp.responseText else alert('Problem retrieving XML data!') xmlhttp.readyState = 0; } } }

// Trap fscommands from the SWF movie function livelets_DoFScommand(cmd,args) { alert(args) }";

# Embed livelets.swf into the output page $swf = "$wgLiveletsPath/livelets.swf"; if (0 && !$live) $wgOut->addHTML("<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' codebase='http://active.macromedia.com/flash2/cabs/swflash.cab#version=4,0,0,0' id='livelets' width=100 height=100> <param name='movie' value='$swf'> <embed swliveconnect='true' name='livelets' src='$swf' width=100 height=100 type='application/x-shockwave-flash' pluginspage='http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash'> </embed></object>"); }

# 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,$wgLiveletsPath; $args = $this->args[$id]; $title = $args[0];

$html = "

<img src='$wgLiveletsPath/wait.gif'/>

";

$html .= "<script type='text/javascript'>liveletRequest('$id')</script>"; return $html; }

}

  1. Called from $wgExtensionFunctions array when initialising extensions

function wfSetupLivelets() { global $wgLivelets,$wgLiveletsMagic,$wgScriptPath,$wgLiveletsPath; $wgLivelets = new Livelets($wgLiveletsMagic); if ($wgLiveletsPath == ) $wgLiveletsPath = "$wgScriptPath/extensions/livelets"; }

  1. 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; }

  1. Output the naked page and die

function wfLiveletsNakedArticle(&$out,&$text) { while(@ob_end_clean()); $out->sendCacheControl(); if (in_array('Content-Encoding: gzip',headers_list())) $text = gzencode($text); echo($text); die; }

Template:AddJavaScript ?>