Difference between revisions of "Extension:Livelets.php"

From Organic Design wiki
(const desc + details)
(use {{AddJavaScript}})
Line 1: Line 1:
 
<?
 
<?
# Extension:Livelets
+
# Extension:Livelets{{#Security:*|dev}}{{#Security:view|*}}{{php}}{{Category:Extensions|Livelets}}
 
# - Allows live articles to be transcluded which update automatically on change in a non-polling, fully event-driven way
 
# - Allows live articles to be transcluded which update automatically on change in a non-polling, fully event-driven way
# - Version 0.11 (2007-04-18)
 
 
# - See http://www.mediawiki.org/wiki/Extension:Livelets for installation and usage details
 
# - See http://www.mediawiki.org/wiki/Extension:Livelets for installation and usage details
 
# - 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
 
# - Author: http://www.organicdesign.co.nz/nad
#  {{#Security:*|dev}}{{#Security:view|*}}{{php}}
 
  
define('LIVELETS_VERSION', '0.0.1, 2007-05-08');
+
define('LIVELETS_VERSION', '0.0.3, 2007-05-10');
  
 
$wgLiveletsMagic              = "live"; # the parser-function name for doing live-transclusions
 
$wgLiveletsMagic              = "live"; # the parser-function name for doing live-transclusions
Line 15: Line 13:
  
 
$wgExtensionCredits['parserhook'][] = array(
 
$wgExtensionCredits['parserhook'][] = array(
'name'   => 'Livelets',
+
'name'       => 'Livelets',
'author' => '[http://www.organicdesign.co.nz/User:Nad User:Nad]',
+
'author'     => '[http://www.organicdesign.co.nz/User:Nad User:Nad]',
 
       'description' => 'dynamic nonpolling updates of articles',
 
       'description' => 'dynamic nonpolling updates of articles',
'url'   => 'http://www.mediawiki.org/wiki/Extension:Livelets',
+
'url'       => 'http://www.mediawiki.org/wiki/Extension:Livelets',
         'version'     => LIVELETS_VERSION
+
         'version'   => LIVELETS_VERSION
 
);
 
);
  
 
class Livelets {
 
class Livelets {
  
var $version = '0.11, 2007-04-18';
+
var $version = LIVELETS_VERSION;
 
var $magic;
 
var $magic;
 
var $args;
 
var $args;
Line 42: Line 40:
  
 
# Add the livelets JavaScript functions to the output page
 
# Add the livelets JavaScript functions to the output page
if (!$live) $wgOut->addScript("<script type='text/javascript'>
+
else $wgAddJavaScriptFunctions['Livelets'] = "
  
 
// Keep record of livelets on page
 
// Keep record of livelets on page
Line 80: Line 78:
 
function livelets_DoFScommand(cmd,args) {
 
function livelets_DoFScommand(cmd,args) {
 
alert(args)
 
alert(args)
}
+
}";
 
 
</script>");
 
  
 
# Embed livelets.swf into the output page
 
# Embed livelets.swf into the output page
Line 139: Line 135:
 
die;
 
die;
 
}
 
}
 +
 +
{{AddJavaScript}}
 
?>
 
?>

Revision as of 04:35, 10 May 2007

<?

  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 ?>