Extension talk:Livelets.php

From Organic Design wiki
Revision as of 23:31, 22 September 2010 by Jack (talk | contribs) (Delay has been added)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

<?php /**

* Extension:Livelets - Allows articles to be transcluded which load after the main page content and can update dynamically with Ajax
*
* @package MediaWiki
* @subpackage Extensions
* @author Aran Dunkley, Jack Henderson
* @licence GNU General Public Licence 2.0 or later
* Started: 2007-10-06
*     1.0: 2010-08-25
*/

define( 'LIVELETS_VERSION', '1.0.5, 2010-09-23' );

  1. the parser-function name for doing live-transclusions

$wgLiveletsMagic = 'live';

  1. Settings for the event-driven live method

$wgLiveletsUseSWF = false; # Set this to true to use SWF to make livelets fully event-driven (no polling for change) $wgLiveletsSwfBg = '#ffffff'; # The background colour of the embedded SWF $wgLiveletsPort = '1729'; # The port that Livelets.pl can be reached on (using $wgServer:$wgLiveletsPort) $wgLiveletsDelay = '0'; # Default livelet display delay of 0 (immediate). Set $wgLiveletsDelay in Localsettings after this extension is included, to some number of milliseconds (1000 = 1 sec)

$wgExtensionCredits['parserhook'][] = array( 'path' => __FILE__, 'name' => 'Livelets', 'author' => 'Aran Dunkley, Jack Henderson', 'descriptionmsg' => 'livelets-desc', 'url' => 'http://www.mediawiki.org/wiki/Extension:Livelets', 'version' => LIVELETS_VERSION ); $dir = dirname( __FILE__ ); $wgExtensionMessagesFiles['Livelets'] = "$dir/Livelets.i18n.php";

class Livelets {

var $container_id = 0; var $request_id = 0;

function __construct() { global $wgHooks, $wgExtensionFunctions;

# Activate the parser-function $wgHooks['LanguageGetMagic'][] = $this;

# Call the setup method at extension setup time $wgExtensionFunctions[] = array( $this, 'setup' );

# Bypass ajax dispatcher if this is a livelet ajax request if( array_key_exists( 'action', $_GET ) && $_GET['action'] == 'ajax' && $_GET['rs'] == 'livelets' ) {

# Extract the data from the ajax request list( $title, $this->request_id ) = $_GET['rsargs'];

# Adjust the request so that it bypasses the ajax dispatcher and executes with action=render $_GET = $_REQUEST = array( 'title' => $title, 'action' => 'render' );

# Add a hook to replace the wikitext with just the requested livelet's content $wgHooks['ArticleAfterFetchContent'][] = $this; } }


# Called at extension setup time function setup() { global $wgOut, $wgParser, $wgLiveletsMagic, $wgLiveletsUseSwf;

# Activate the parser-function $wgParser->setFunctionHook( $wgLiveletsMagic, array( $this, 'renderContainer' ) );

# Embed the SWF if enabled (SWF must be requested from Livelets.pl) if ( $wgLiveletsUseSwf ) { global $wgServer, $wgLiveletsPort, $wgLiveletsSwfBg; $swf = "$wgServer:$wgLiveletsPort/Livelets.swf"; $wgOut->addHTML("<object type=\"application/x-shockwave-flash\" data=\"$swf\" width=\"1\" height=\"1\"> <param name=\"movie\" value=\"$swf\" /><param name=\"bgcolor\" value=\"$wgLiveletsSwfBg\"/></object>"); }

}


# Render livelet container function renderContainer( &$parser ) { global $wgTitle, $wgJsMimeType, $wgLiveletsDefaultContent, $wgLiveletsDelay;

# Ensure the livelets are all numbered so they can be referred to by the ajax request $id = $this->container_id++;

# Increment the delay by the correct amount so livelets appear one after the other $wgLiveletsDelayInc = $wgLiveletsDelay + ( $wgLiveletsDelay * $id );

# Render a container with a 'livelet-loading' div that will be replaced

$loading = "

"; $html = "

$loading

";

# Construct an ajax call to collect the content for this container. $title = $wgTitle->getPrefixedText();

# Call the ajax, applying the delay for each livelet call $script = "var liveletsUpdate = 0; clearTimeout( liveletsUpdate ); liveletsUpdate = setTimeout( \"sajax_do_call('livelets',['$title','$id'],document.getElementById('livelet-$id'))\", $wgLiveletsDelayInc )"; $html .= "<script type='$wgJsMimeType'>$script</script>";

return array( $html, 'isHTML' => true, 'noparse' => true ); }


# This early hook called from the Ajax bypass whereby the parser has yet to process wikitext function onArticleAfterFetchContent( &$article, &$content ) { global $wgLiveletsMagic;

# Replace the wikitext with just the content of the requested livelet foreach( $this->examineBraces( $content ) as $brace ) { if ( $brace['NAME'] == "#$wgLiveletsMagic:" && --$this->request_id < 0 ) { $len = strlen( $wgLiveletsMagic ); $content = substr( $content, $brace['OFFSET'] + $len + 4, $brace['LENGTH'] - $len - 6 ); break; } }

return true; }


# Extract recursive braces belonging to templates and parserfunctions function examineBraces( &$content ) { $braces = array(); $depths = array(); $depth = 1; $index = 0; while( preg_match( '/\\{\\{\\s*([#a-z0-9_]*:?)|\\}\\}/is', $content, $match, PREG_OFFSET_CAPTURE, $index ) ) { $index = $match[0][1] + 2; if( $match[0][0] == '}}' ) { $brace =& $braces[$depths[$depth-1]]; $brace['LENGTH'] = $match[0][1] - $brace['OFFSET'] + 2; $brace['DEPTH'] = $depth--; } else { $depths[$depth++] = count( $braces ); $braces[] = array( 'NAME' => $match[1][0], 'OFFSET' => $match[0][1] ); } } return $braces; }


# Set up magic word function onLanguageGetMagic( &$magicWords, $langCode = 0 ) { global $wgLiveletsMagic; $magicWords[$wgLiveletsMagic] = array( $langCode, $wgLiveletsMagic ); return true; } }

  1. Instantiate a global instance of the extension

$wgLivelets = new Livelets();