Extension:Javascript Slideshow/slideshow.php

From mediawiki.org
Revision as of 00:32, 26 March 2012 by Yaron Koren (talk | contribs) (New version, 0.3 (overhaul for MW 1.17+, ResourceLoader and jQuery))
<?php
# This extension will show the contents of a single <div> inside of it, and will
# rotate through the remaining divs as specified
# To activate the extension, include it from your LocalSettings.php
# with: include("extensions/Slideshow/slideshow.php");
#
#
if( !defined( 'MEDIAWIKI' ) ) {
	die();
}

$wgExtensionFunctions[] = "wfSlideshowExtension";
$wgHooks['LanguageGetMagic'][] = 'wfSlideshowExtensionMagic';
$wgHooks['MakeGlobalVariablesScript'][] = 'wfSlideshowSetGlobalJSVariables';

$wgExtensionCredits['other'][] = array(
	'name' => 'Javascript Slideshow',
	'author' => array( 'Chris Reigrut', 'Yaron Koren' ),
	'version' => '0.3',
	'url' => 'http://www.mediawiki.org/wiki/Extension:Javascript_Slideshow',
	'description' => 'Create a slideshow from multiple included div elements'
);

$slideshowIP = dirname( __FILE__ );

$slideshowResourceTemplate = array(
	'localBasePath' => $slideshowIP,
	'remoteExtPath' => 'Slideshow',
);

$wgResourceModules += array(
	'ext.slideshow.main' => $slideshowResourceTemplate + array(
		'scripts' => array(
			'slideshow.js',
		),
	),
);

function wfSlideshowExtension() {
	global $wgOut, $wgParser;

	$wgOut->addModules( 'ext.slideshow.main' );
	$wgParser->setHook( "slideshow", "renderSlideshowTag" );
	$wgParser->setFunctionHook( "slideshow", "renderSlideshowParserFunction" );
}

function wfSlideshowExtensionMagic( &$magicWords, $langCode ) {
	$magicWords['slideshow'] = array( 0, 'slideshow' );
	return true;
}

function explode_assoc($glue1, $glue2, $array) {
	$array2 = explode($glue2, $array);
	foreach($array2 as $val) {
		$pos = strpos($val,$glue1);
		$key = substr($val,0,$pos);
		$array3[$key] = trim(substr($val,$pos+1,strlen($val)));
	}
	return $array3;
}

function renderSlideshowParserFunction( &$parser, $input = '', $options = '' ) {
	$parser->disableCache();
	return renderSlideshow( $input, explode_assoc( '=', ' ', $options ) );
}

# The callback function for converting the input text to HTML output
function renderSlideshowTag( $input, $argv, $parser, $frame ) {
	$wikitext = renderSlideshow( $input, $argv );
	$parser->disableCache();
	return $parser->recursiveTagParse( $wikitext, $frame );
}

function renderSlideshow( $wikitext, $options ) {
	$isValid = true;
	$validSequences = array( 'forward', 'backward', 'random' );
	$validTransitions = array( 'cut', 'fade', 'blindDown' );

	$output = '';

	$id = ( isset( $options['id'] ) ) ? $options['id'] : 'slideshow_' . rand();
	$refresh = ( isset( $options['refresh'] ) ) ? $options['refresh'] : '1000';

	$sequence = ( isset( $options['sequence'] ) ) ? $options['sequence'] : 'forward';
	if ( ! in_array( $sequence, $validSequences ) ) {
		$output .= "Invalid sequence $sequence (may be one of: " . implode(',', $validSequences) . "). ";
		$isValid = false;
	}

	$transition = (isset($options['transition'])) ? $options['transition'] : 'cut';
	if ( ! in_array( $transition, $validTransitions ) ) {
		$output .= "Invalid transition $transition (may be one of: " . implode(',', $validTransitions) . "). ";
		$isValid = false;
	}

	if ($isValid) {
		global $wgSlideshowRefresh, $wgSlideshowSequence, $wgSlideshowTransition;
		$wgSlideshowRefresh = $refresh;
		$wgSlideshowSequence = $sequence;
		$wgSlideshowTransition = $transition;
		$output .= "<div id='$id' class='slideshow'>$wikitext</div> ";
		$output .= "<div id='$id-spacer' class='slideshowspacer'></div>";
	}

	return $output;
}

// @TODO - this use of global variables means that two slideshows on the
// same page can't have different settings, which is a bug.
function wfSlideshowSetGlobalJSVariables( &$vars ) {
	global $wgSlideshowRefresh, $wgSlideshowSequence, $wgSlideshowTransition;
	$vars['wgSlideshowRefresh'] = $wgSlideshowRefresh;
	$vars['wgSlideshowSequence'] = $wgSlideshowSequence;
	$vars['wgSlideshowTransition'] = $wgSlideshowTransition;
	return true;
}