Personal tools

Extension:SimpleViewer.php

From OrganicDesign Wiki

Jump to: navigation, search
<?php
# Extension:SimpleViewer
# - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
# - Author: [http://www.organicdesign.co.nz/User:Rob User:Rob]
#
 
if (!defined('MEDIAWIKI')) die('Not an entry point.');
 
define('SIMPLEVIEWER_VERSION','0.0.1');
 
$egSimpleViewerMagic            = "simpleviewer";
$egSimpleViewEnableHook         = true;
$wgExtensionFunctions[]        	= 'efSetupSimpleViewer';
$wgHooks['ParserBeforeStrip'][] = 'efSimpleViewer';
$wgHooks['LanguageGetMagic'][]  = 'efSimpleViewerLanguageGetMagic';
 
$wgSimpleViewerUrlMagic         = "magic_magic";
 
$wgExtensionCredits['parserhook'][] = array(
	'name'        => 'SimpleViewer',
	'author'      => '[http://www.organicdesign.co.nz/User:Rob User:Rob]',
	'description' => 'Mediawiki integration with SimpleViewer from [http://www.airtightinteractive.com/simpleviewer Airtight interactive]',
	'url'         => 'http://www.organicdesign.co.nz/Extension:SimpleViewer.php',
	'version'     => SIMPLEVIEWER_VERSION
	);
 
 
class SimpleViewer {
 
	# Constructor
	function __construct() {
		global $wgHooks,$wgParser,$egSimpleViewerMagic,$egSimpleViewerTag;
 
		# Add the parser-function
		$wgParser->setFunctionHook($egSimpleViewerMagic,array($this,'magicSimpleviewer'));
 
		}
 
	# Expand the simpleviewer-magic
	function magicSimpleviewer(&$parser) {
		global $egSimpleViewerMagic, $wgOut, $wgScriptPath, $wgParser, $wgCanonicalNamespaceNames, $wgSimpleViewerUrlMagic;
		# Populate $argv with both named and numeric parameters
		$argv = array();
		foreach (func_get_args() as $arg) if (!is_object($arg)) {
			if (preg_match('/^(.+?)\\s*=\\s*(.+)$/',$arg,$match)) $argv[$match[1]] = $match[2]; else $argv[] = $arg;
			}
 
        # list of keys that the parser funtion will accept
        # src is not included here because it is not passed on to the javascript
        # format: key => regexp validation, default value
        $passparams = array(
            'maxImageWidth'         => array('/(\d+)/', 600 ),
            'maxImageHeight'        => array('/(\d+)/', 600),
            'textColor'             => array('/(0x\d{6})/i', '0xffffff'),
            'frameColor'            => array('/(0x\d{6})/i', '0xaaaaaa'), 
            'frameWidth'            => array('/(\d+)/', 2),
            'stagePadding'          => array('/(\d+)/', 40),
            'thumbnailColumns'      => array('/(\d+)/', 3),
            'thumbnailRows'         => array('/(\d+)/', 3),
            'navPosition'           => array('/(left|right)/', 'left'),
            'title'                 => array('/(.*)/', ''),
            'enableRightClickOpen'  => array('/(true|false)/i', 'true')
            );
 
 
		/*foreach($argv as $key => $value) {
		  if(array_key_exists($key, $passparams)) {
		      if(preg_match($passparams[$key][0], $v, $match) != 0) {
    		      $variables .= "fo.addVariable('$key', '".$match[1][0]."'); ";
		          }
		      }
        }*/
 
 
		$title = Title::newFromText($argv['src']);
		if(!$title->exists())
			return array("==SimpleViewer==\n\n''src'' parameter: No such article exists\n\nCreate it: [[".$argv['src']."]]",
			'found' => true,
			'nowiki' => false,
			'noparse' => false,
			'noargs' => false,
			'isHTML' => false );
 
		$ns = $title->getNsText();
		$db = $title->getDBkey();
		$urlsafe = $ns.$wgSimpleViewerUrlMagic.$db;
 
        # construct wikitext with <gallery> tags for use where flash is not available
        # get title
        # get article
        /* eg html gallery
        <gallery widths="250px" heights="250px" perrow="3">
Image:Speak,-memory,-an-autobiography.jpg|[[:Image:Speak,-memory,-an-autobiography.jpg]]
        */
 
        # add the javascript and build the embed code
		$script = "<div id='flashcontent'>There was a problem. Please <a href='mailto:rob@mintmedia.co.nz?subject=problem with content'>tell me about it.</a></div>\n<script type='text/javascript'>var fo = new SWFObject('$wgScriptPath/extensions/SimpleViewer/simpleviewer/viewer.swf?a', 'viewer', '100%', '500px', '7', '#000000'); fo.addVariable('preloaderColor', '0xaaaaaa'); fo.addVariable('xmlDataPath', '$wgScriptPath/index.php/SpecialSimpleViewer/$urlsafe'); ".$variables."fo.write('flashcontent');</script>";
 
		# Return result with available parser flags
		return array(
			$script,
			'noparse' => true,
			'isHTML'  => true
			);
 
		}
 
	# Needed in some versions to prevent Special:Version from breaking
	function __toString() { return 'SimpleViewer'; }
 	}
 
function efSetupSimpleViewer() {
    global $wgOut, $wgScriptPath;
   	$wgOut->addScript("<script type=\"text/javascript\" src=\"$wgScriptPath/extensions/SimpleViewer/simpleviewer/swfobject.js\"></script>");
   	}
 
function efSimpleViewer( &$parser ) {
	global $egSimpleViewer, $wgSimpleViewerUrlMagic, $wgOut, $wgCanonicalNamespaceNames, $wgScriptPath, $wgServer, $egSimpleViewEnableHook;
	if (!$egSimpleViewEnableHook) return true;
	# add script in all cases,client caches external js file so not too bad for efficiency
 
	$egSimpleViewer = new SimpleViewer();
 
    #print($_REQUEST['title']);
 
    if(preg_match("#^SpecialSimpleViewer/#", $_REQUEST['title'])) {
 
		header('Content-Type: text/xml');
 
		$wgOut->disable();
		wfResetOutputBuffers();
 
		# is this an image request?
		$m = preg_match_all("#SpecialSimpleViewer/images/(\d+)/(.+)#i", $_REQUEST['title'], $matches, PREG_SET_ORDER);
		$size = $matches[0][1];
		$file = $matches[0][2];
 
		# if the url is of the form Special:SpecialSimpleViewer/images/200/foo.jpg
		# then send a redirect to get thumb.php to do the resizing
		if($m > 0) {
		  header("Location: $wgScriptPath/thumb.php?f=$file&width=$size");
		  return false;
		  }
 
 
		# if we got this far it's not an image and we should output an XML file
 
		# params:
		# src = article name containing a list of images for the gallery, article may also contain a DPL query
 
		preg_match_all("#SpecialSimpleViewer/(.+)$#", $_REQUEST['title'], $matches, PREG_SET_ORDER);
		#print_r($matches);
		$t = str_replace($wgSimpleViewerUrlMagic, ':', $matches[0][1]);
		#print($t);
 
		# get article content
		$title    = Title::newFromText($t);
		# if the image article does not exist exit
		if(!$title) {
			print "title not valid";
			return false;
		}
 
		$article  = new Article($title);
		$content = $article->getContent();
		$egSimpleViewEnableHook = false;
 
		$wikitext = $parser->preprocess( $content, $title, $parser->getOptions() );
 
		# make a list of image names excluding the namespace (Image:)
		$ns_image = $wgCanonicalNamespaceNames[NS_IMAGE];
		#print_r($wikitext);
 
		preg_match_all("/\[\[:?".$ns_image.":(.+?)(\||\]\])/mi", $wikitext, $image);
		if(count($image[1]) == 0 )
    		preg_match_all("/\*\s*".$ns_image.":(.+?)\s*$/mi", $wikitext, $image);
 
		# standard header, other options to add later		
		print("<?xml version='1.0' encoding='UTF-8'?>
	<simpleviewerGallery maxImageWidth='600' maxImageHeight='600' textColor='0xffffff' frameColor='0xaaaaaa' frameWidth='2' stagePadding='40' thumbnailColumns='3' thumbnailRows='3' navPosition='left' title='' enableRightClickOpen='true' backgroundImagePath='' imagePath='$wgScriptPath/index.php/SpecialSimpleViewer/images/500/' thumbPath='$wgScriptPath/index.php/SpecialSimpleViewer/images/100/'>");
		# simpleviewer requires a TRAILING / on the imagePath and thumbPath params
 
 
		# loop and generate <image> containers
		foreach($image[1] as $i) {
			#$html = htmlentities(file_get_contents("$wgServer$wgScriptPath/index.php/$ns_image:$i?action=render"));
			$title    = Title::newFromText($i, NS_IMAGE);
			$article  = new Article($title);
			$html = htmlentities($parser->parse($article->getContent(), $title, $parser->getOptions(),true,false )->getText());
 
			print("<image><filename>$i</filename><caption>$html</caption></image>\n");
		}
		$egSimpleViewEnableHook = true;
 
		# close document        
		print("</simpleviewerGallery>");
		return false;
    }
 
	return true;
}
 
# Needed in MediaWiki >1.8.0 for magic word hooks to work properly
function efSimpleViewerLanguageGetMagic(&$magicWords,$langCode = 0) {
	global $egSimpleViewerMagic;
	$magicWords[$egSimpleViewerMagic] = array(0,$egSimpleViewerMagic);
	return true;
	}

The GNU Project Debian Linux Ubuntu Linux Wikipedia online encycopedia MediaWiki