Personal tools


Extension:Flashlets.php

From OrganicDesign

Jump to: navigation, search
<?php
# Flashlets Extension
# - Allows ActionScript code to render in the page a SWF using the MTASC (http://www.mtasc.org) SWF compiler
# - Version 1.02 (2007-05-05)
# - See http://www.mediawiki.org/wiki/Extension:Flashlets for installation and usage details
# - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
# - Author: http://www.organicdesign.co.nz/nad
 
define('FLASHLETS_VERSION','1.0.4, 2007-09-04');
 
$wgFlashletsMagic		   = "swf";							# The tag name for embedding a SWF
$wgFlashletsMTASC		   = dirname(__FILE__)."/mtasc/mtasc"; # Command used to launch the MTASC executable
$wgFlashletsCP			  = dirname(__FILE__)."/mtasc/std";   # Directory containing the MTASC class headers
$wgFlashletsPath			= $wgUploadPath;					# The client-side path to the directory containing the SWF's
$wgFlashletsDirectory	   = $wgUploadDirectory;			   # The server-side path to the directory containing the SWF's
$wgFlashletsExpandTemplates = true;							 # Expand mediawiki templates before compiling
$wgExtensionFunctions[]	 = 'wfSetupFlashlets';
 
$wgExtensionCredits['parserhook'][] = array(
		'name'		=> 'Flashlets',
		'description' => 'Actionscript rendering of SWF movies',
		'url'		 => 'http://www.mediawiki.org/wiki/Extension:Flashlets',
		'author'	  => '[http://www.organicdesign.co.nz/nad User:Nad]',
		'version'	 => FLASHLETS_VERSION
);
 
 
class Flashlets {
 
	var $version = FLASHLETS_VERSION;
	var $expire  = 100;				   # Number of minutes a generated SWF lives for without being accessed
	var $container;					   # Location if the SWF container needed by the compiler
 
	# Constructor
	function Flashlets() {
		global $IP,$wgParser,$wgFlashletsMagic;
		$this->container = dirname(__FILE__).'/container.swf';
		$wgParser->setHook($wgFlashletsMagic,array($this,'tagHook'));
	}
 
	# Convert the $magic tags to client-side javascript request code from its stored parameters
	function tagHook($actionscript,$argv,&$parser) {
		global $wgFlashletsMTASC,$wgFlashletsCP,$wgFlashletsDirectory,$wgFlashletsPath,$wgFlashletsExpandTemplates;
 
		# convert args to command-line switches
		$width   = isset($argv['width'])   ? intval($argv['width'])  : 300;
		$height  = isset($argv['height'])  ? intval($argv['height']) : 200;
		$fps	 = isset($argv['fps'])	 ? intval($argv['fps'])	: 25;
		$bgcolor = isset($argv['bgcolor']) ? $argv['bgcolor']		: '#ffffff';
		$caption = isset($argv['caption']) ? $argv['caption']		: false;
		$ver	 = isset($argv['ver'])	 ? $argv['ver']			: 6;
		$quality = isset($argv['quality']) ? $argv['quality']		:'high';
 
				if (isset($argv['src'])) {
						$swf = $argv['src'];
			$html = "\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">
				<tr><td><object type=\"application/x-shockwave-flash\" data=\"$swf\" width=\"$width\" height=\"$height\">
					<param name=\"movie\" value=\"$swf\" />
					<param name=\"bgcolor\" value=\"$bgcolor\"/>
					<param name=\"quality\" value=\"$quality\"/>
				</object></td></tr>\n";
			if ($caption) $html .= "\n<tr><td align=\"center\"><a href=\"$swf\">$caption</a></td></tr>\n";
						$html .= "</table>";
						return $html;
				}
 
				if ($wgFlashletsMTASC == '') return "\n<br><b>SWF compiling is disabled!</b>";
 
/*
		# delete swf's older than cache-expiry
		$expiry = $now - $this->expire;
		if ($handle = opendir($wgFlashletsDirectory)) {
			while (false !== ($file = readdir($handle))) {
				if ($file != "." && $file != "..") {
					$stat = stat($file);
					#if ($stat[8] < $expire) unlink($file);
					}
				}
			}
		closedir($handle);
*/
		# expand templates before compiling
		if ($wgFlashletsExpandTemplates) $actionscript = $parser->replaceVariables($actionscript);
 
		# create swf filename unique to the actionscript content and parameters
		$swf = md5("$actionscript$ver$width$height$fps");
		$file = "$wgFlashletsDirectory/$swf";
		$path = "$wgFlashletsPath/$swf.swf";
 
		# Compile the SWF if it doesn't already exist
		if (!file_exists("$file.swf")) {
 
			# Write the actionscript to a file for MTASC to compile from
			if ($handle = fopen("$file.as", 'w+')) {
				fwrite($handle,$actionscript);
				fclose($handle);
				$cont = $this->container;
				$sh = "$wgFlashletsMTASC -cp $wgFlashletsCP -swf $cont -out $file.swf -main -version $ver -header $width:$height:$fps $file.as 2>&1";
				$html = shell_exec($sh);
				unlink("$file.as");
			} else $html = "Could not open '$file.as' for writing!";
 
		}
 
		# If the SWF exists, return the HTMLcode to request and embed the SWF otherwise return error information
		if (file_exists("$file.swf")) {
			$html = "\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">
				<tr><td><object type=\"application/x-shockwave-flash\" data=\"$path\" width=\"$width\" height=\"$height\">
					<param name=\"movie\" value=\"$path\" />
					<param name=\"bgcolor\" value=\"$bgcolor\"/>
					<param name=\"quality\" value=\"$quality\"/>
				</object></td></tr>\n";
			if ($caption) $html .= "\n<tr><td align=\"center\"><a href=\"$wgFlashletsPath/$swf.swf\">$caption</a></td></tr>\n";
			$html .= "</table>";
		} else $html = "\n<br><b>Error compiling SWF: </b><pre>$html</pre>\n";
 
		return $html;
	}
 
}
 
# Called from $wgExtensionFunctions array when initialising extensions
function wfSetupFlashlets() {
	global $wgFlashlets;
	$wgFlashlets = new Flashlets();
}