From OrganicDesign Wiki
<?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;
}