Difference between revisions of "Extension:SimpleViewer.php"
m (update works) |
(mostly working but needs a tidy up) |
||
(6 intermediate revisions by 2 users not shown) | |||
Line 10: | Line 10: | ||
$egSimpleViewerMagic = "simpleviewer"; | $egSimpleViewerMagic = "simpleviewer"; | ||
− | + | $egSimpleViewEnableHook = true; | |
$wgExtensionFunctions[] = 'efSetupSimpleViewer'; | $wgExtensionFunctions[] = 'efSetupSimpleViewer'; | ||
− | + | $wgHooks['ParserBeforeStrip'][] = 'efSimpleViewer'; | |
+ | $wgHooks['LanguageGetMagic'][] = 'efSimpleViewerLanguageGetMagic'; | ||
+ | |||
$wgSimpleViewerUrlMagic = "magic_magic"; | $wgSimpleViewerUrlMagic = "magic_magic"; | ||
− | |||
− | |||
$wgExtensionCredits['parserhook'][] = array( | $wgExtensionCredits['parserhook'][] = array( | ||
Line 25: | Line 25: | ||
); | ); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
class SimpleViewer { | class SimpleViewer { | ||
− | |||
− | |||
− | |||
− | |||
# Constructor | # Constructor | ||
Line 47: | Line 34: | ||
# Add the parser-function | # Add the parser-function | ||
$wgParser->setFunctionHook($egSimpleViewerMagic,array($this,'magicSimpleviewer')); | $wgParser->setFunctionHook($egSimpleViewerMagic,array($this,'magicSimpleviewer')); | ||
− | + | ||
− | |||
− | |||
− | |||
} | } | ||
Line 64: | Line 48: | ||
# list of keys that the parser funtion will accept | # list of keys that the parser funtion will accept | ||
# src is not included here because it is not passed on to the javascript | # src is not included here because it is not passed on to the javascript | ||
− | $passparams = array('maxImageWidth', 'maxImageHeight', 'textColor', ' | + | # format: key => regexp validation, default value |
− | 'frameWidth', 'stagePadding', 'thumbnailColumns', 'thumbnailRows', | + | $passparams = array( |
− | 'navPosition', 'title', 'enableRightClickOpen'); | + | '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) { | /*foreach($argv as $key => $value) { | ||
− | if( | + | if(array_key_exists($key, $passparams)) { |
− | $variables .= "fo.addVariable('$key', '$ | + | if(preg_match($passparams[$key][0], $v, $match) != 0) { |
− | + | $variables .= "fo.addVariable('$key', '".$match[1][0]."'); "; | |
− | */ | + | } |
− | + | } | |
− | + | }*/ | |
− | + | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
$title = Title::newFromText($argv['src']); | $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(); | $ns = $title->getNsText(); | ||
$db = $title->getDBkey(); | $db = $title->getDBkey(); | ||
$urlsafe = $ns.$wgSimpleViewerUrlMagic.$db; | $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 | # 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>"; | |
− | $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> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
# Return result with available parser flags | # Return result with available parser flags | ||
return array( | return array( | ||
Line 126: | Line 110: | ||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
function efSetupSimpleViewer() { | 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(); | $egSimpleViewer = new SimpleViewer(); | ||
Line 160: | Line 126: | ||
if(preg_match("#^SpecialSimpleViewer/#", $_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 | # Needed in MediaWiki >1.8.0 for magic word hooks to work properly |
Latest revision as of 03:27, 17 April 2008
<?php
- Extension:SimpleViewer
- - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
- - Author: User:RobCategory:Extensions created with Template:Extension
- Template:Php
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' => 'User:Rob', 'description' => 'Mediawiki integration with SimpleViewer from 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\nsrc 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|File:Speak,-memory,-an-autobiography.jpg
*/
# add the javascript and build the embed code
$script = "
\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>$html</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; }