Difference between revisions of "Extension:SimpleViewer.php"
(update - still need to fix url magic) |
m (update works) |
||
Line 10: | Line 10: | ||
$egSimpleViewerMagic = "simpleviewer"; | $egSimpleViewerMagic = "simpleviewer"; | ||
+ | #$wgHooks['ParserBeforeStrip'][] = 'efSetupSimpleViewer'; | ||
$wgExtensionFunctions[] = 'efSetupSimpleViewer'; | $wgExtensionFunctions[] = 'efSetupSimpleViewer'; | ||
#$wgExtensionFunctions[] = 'wfSetupSpecialSimpleViewer'; | #$wgExtensionFunctions[] = 'wfSetupSpecialSimpleViewer'; | ||
− | $wgSimpleViewerUrlMagic = | + | $wgSimpleViewerUrlMagic = "magic_magic"; |
$wgHooks['LanguageGetMagic'][] = 'efSimpleViewerLanguageGetMagic'; | $wgHooks['LanguageGetMagic'][] = 'efSimpleViewerLanguageGetMagic'; | ||
Line 61: | Line 62: | ||
} | } | ||
+ | # list of keys that the parser funtion will accept | ||
+ | # src is not included here because it is not passed on to the javascript | ||
+ | $passparams = array('maxImageWidth', 'maxImageHeight', 'textColor', 'textColor', | ||
+ | 'frameWidth', 'stagePadding', 'thumbnailColumns', 'thumbnailRows', | ||
+ | 'navPosition', 'title', 'enableRightClickOpen'); | ||
+ | |||
+ | /*foreach($argv as $key => $value) { | ||
+ | if(in_array($key, $passparams)) | ||
+ | $variables .= "fo.addVariable('$key', '$value'); "; | ||
+ | } | ||
+ | */ | ||
/* @params | /* @params | ||
src - page containing a bullet list of images | src - page containing a bullet list of images | ||
Line 68: | Line 80: | ||
maxImageHeight - height of your largest image in pixels. Used to determine the best layout for your gallery. | maxImageHeight - height of your largest image in pixels. Used to determine the best layout for your gallery. | ||
textColor - Color of title and caption text (hexidecimal color value e.g 0xff00ff). | textColor - Color of title and caption text (hexidecimal color value e.g 0xff00ff). | ||
− | + | textColor - Color of image frame, navigation buttons and thumbnail frame (hexidecimal color value e.g 0xff00ff). | |
frameWidth - Width of image frame in pixels. | frameWidth - Width of image frame in pixels. | ||
stagePadding - Distance between image and thumbnails and around gallery edge in pixels. | stagePadding - Distance between image and thumbnails and around gallery edge in pixels. | ||
Line 83: | Line 95: | ||
$db = $title->getDBkey(); | $db = $title->getDBkey(); | ||
$urlsafe = $ns.$wgSimpleViewerUrlMagic.$db; | $urlsafe = $ns.$wgSimpleViewerUrlMagic.$db; | ||
+ | |||
+ | #$wgParser->disableCache(); | ||
+ | #$wgOut->setHeaders(); | ||
+ | |||
# add the javascript and build the embed code | # add the javascript and build the embed code | ||
$wgOut->addScript("<script type=\"text/javascript\" src=\"$wgScriptPath/extensions/SimpleViewer/simpleviewer/swfobject.js\"></script>"); | $wgOut->addScript("<script type=\"text/javascript\" src=\"$wgScriptPath/extensions/SimpleViewer/simpleviewer/swfobject.js\"></script>"); | ||
− | $script = "<div id='flashcontent'> | + | $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> |
− | <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'); fo.write('flashcontent');</script>"; | + | <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>"; |
# /research/extensions/SimpleViewer/simpleviewer/Special:Test.xml | # /research/extensions/SimpleViewer/simpleviewer/Special:Test.xml | ||
Line 135: | Line 151: | ||
# Called from $wgExtensionFunctions array when initialising extensions | # Called from $wgExtensionFunctions array when initialising extensions | ||
function efSetupSimpleViewer() { | function efSetupSimpleViewer() { | ||
− | global $egSimpleViewer, $wgSimpleViewerUrlMagic; | + | global $egSimpleViewer, $wgSimpleViewerUrlMagic, $wgOut, $wgCanonicalNamespaceNames, $wgParser, $wgScriptPath; |
+ | |||
+ | |||
$egSimpleViewer = new SimpleViewer(); | $egSimpleViewer = new SimpleViewer(); | ||
− | + | ||
− | + | #print($_REQUEST['title']); | |
− | + | ||
+ | if(preg_match("#^SpecialSimpleViewer/#", $_REQUEST['title'])) { | ||
+ | |||
+ | # 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"); | ||
+ | exit; | ||
+ | } | ||
− | + | # Redirect can make things a bit slower so may provide the image directly in future | |
− | + | ||
− | + | # if we got this far it's not an image and we should output an XML file | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | $wgParser->disableCache(); | |
− | + | $wgOut->setHeaders(); | |
− | |||
− | + | header('Content-Type: text/xml'); | |
− | + | # 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 "does not exist"; | |
− | + | $wgOut->disable(); | |
− | + | wfResetOutputBuffers(); | |
− | + | return; | |
− | + | } | |
− | + | $article = new Article($title); | |
− | + | $wikitext = $article->getContent(); | |
− | + | ||
− | + | # parse the wikitext to expand templates and parser functions | |
+ | #$wgParser = new Parser(); | ||
+ | |||
+ | #$wikitext = $wgParser->preprocess($wikitext, $title,new ParserOptions()); | ||
− | + | #print($wikitext); | |
+ | |||
+ | # need some heiristics here to handle a few reasonable image-article-list formats | ||
+ | # we accept the default output format of DPL for now | ||
+ | |||
+ | # $wikitext = <UL><LI>[[:Image:Industrial-design-a-to-z.jpg|Image:Industrial-design-a-to-z.jpg]]</LI><LI> etc | ||
+ | |||
+ | # make a list of image names excluding the namespace (Image:) | ||
+ | $ns_image = $wgCanonicalNamespaceNames[NS_IMAGE]; | ||
+ | preg_match_all("|".$ns_image.":(.+?)$|mi", $wikitext, $image); | ||
+ | #print_r($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("http://mintmedia.co.nz/$wgScriptPath/index.php/$ns_image:$i?action=render")); | ||
+ | #$title = Title::newFromText($i, NS_IMAGE); | ||
+ | #$article = new Article($title); | ||
+ | #$wikitext = htmlentities($article->getContent()); | ||
+ | /*$replace = | ||
+ | array("/\[\[\.+?|(.+?)\]\]/" => "$1", | ||
+ | |||
+ | ); | ||
+ | foreach($replace as $key => $value) | ||
+ | $wikitext = preg_replace($key, $value, $wikitext);*/ | ||
+ | |||
+ | print("<image><filename>$i</filename><caption>$html</caption></image>\n"); | ||
+ | } | ||
− | + | # close document | |
− | + | print("</simpleviewerGallery>"); | |
− | + | die(); | |
− | + | } | |
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
function wfSetupSpecialSimpleViewer() { | function wfSetupSpecialSimpleViewer() { |
Revision as of 09:32, 2 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";
- $wgHooks['ParserBeforeStrip'][] = 'efSetupSimpleViewer';
$wgExtensionFunctions[] = 'efSetupSimpleViewer';
- $wgExtensionFunctions[] = 'wfSetupSpecialSimpleViewer';
$wgSimpleViewerUrlMagic = "magic_magic";
$wgHooks['LanguageGetMagic'][] = 'efSimpleViewerLanguageGetMagic';
$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 );
$wgExtensionCredits['specialpage'][] = array( 'name' => 'Special:SimpleViewer', 'author' => 'User:Rob', 'description' => 'Mediawiki integration with SimpleViewer from Airtight interactive.', 'url' => 'http://www.organicdesign.co.nz/Extension:SimpleViewer.php', 'version' => SIMPLEVIEWER_VERSION );
require_once "$IP/includes/SpecialPage.php";
class SimpleViewer {
# Properties var $prop1 = 'default value'; var $prop2 = 'default value';
# Constructor function __construct() { global $wgHooks,$wgParser,$egSimpleViewerMagic,$egSimpleViewerTag;
# Add the parser-function $wgParser->setFunctionHook($egSimpleViewerMagic,array($this,'magicSimpleviewer'));
# Add the tagHook $wgParser->setHook($egSimpleViewerTag,array($this,'tagSimpleviewer'));
}
# 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 $passparams = array('maxImageWidth', 'maxImageHeight', 'textColor', 'textColor', 'frameWidth', 'stagePadding', 'thumbnailColumns', 'thumbnailRows', 'navPosition', 'title', 'enableRightClickOpen');
/*foreach($argv as $key => $value) {
if(in_array($key, $passparams))
$variables .= "fo.addVariable('$key', '$value'); ";
} */ /* @params src - page containing a bullet list of images :: what follows are taken directly from the SimpleViewer docs maxImageWidth - width of your largest image in pixels. Used to determine the best layout for your gallery. maxImageHeight - height of your largest image in pixels. Used to determine the best layout for your gallery. textColor - Color of title and caption text (hexidecimal color value e.g 0xff00ff). textColor - Color of image frame, navigation buttons and thumbnail frame (hexidecimal color value e.g 0xff00ff). frameWidth - Width of image frame in pixels. stagePadding - Distance between image and thumbnails and around gallery edge in pixels. thumbnailColumns - number of thumbnail rows. (To disable thumbnails completely set this value to 0.) thumbnailRows - number of thumbnail columns. (To disable thumbnails completely set this value to 0.) navPosition - Position of thumbnails relative to image. Can be "top", "bottom","left" or "right". title - Text to display as gallery Title enableRightClickOpen - Whether to display a 'Open In new Window...' dialog when right-clicking on an image. Can be "true" or "false" backgroundImagePath (optional) - Relative or absolute path to a JPG or SWF to load as the */
$title = Title::newFromText($argv['src']); $ns = $title->getNsText(); $db = $title->getDBkey(); $urlsafe = $ns.$wgSimpleViewerUrlMagic.$db;
#$wgParser->disableCache();
#$wgOut->setHeaders();
# add the javascript and build the embed code
$wgOut->addScript("<script type=\"text/javascript\" src=\"$wgScriptPath/extensions/SimpleViewer/simpleviewer/swfobject.js\"></script>");
$script = "
<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>";
- /research/extensions/SimpleViewer/simpleviewer/Special:Test.xml
- /research/index.php/Special:SpecialSimpleViewer/Mint_Media:Gallery
- $wgScriptPath/index.php/Special:SpecialSimpleViewer/$urlsafe
- /research/index.php/Special:SpecialSimpleViewer?src=Mint_Media:Gallery
- $script = $wikitext;
# 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'; }
}
class SpecialSpecialSimpleViewer extends SpecialPage {
# Constructor function __construct() { SpecialPage::SpecialPage( 'SpecialSimpleViewer', # name as seen in links etc '*', # user rights required false, # listed in special:specialpages false, # function called by execute() - defaults to wfSpecial{$name} false, # file included by execute() - defaults to Special{$name}.php, only used if no function false # includable ); }
# Override SpecialPage::execute() # - $param is from the URL, eg Special:SpecialSimpleViewer/param function execute($param) {
}
}
- Called from $wgExtensionFunctions array when initialising extensions
function efSetupSimpleViewer() { global $egSimpleViewer, $wgSimpleViewerUrlMagic, $wgOut, $wgCanonicalNamespaceNames, $wgParser, $wgScriptPath;
$egSimpleViewer = new SimpleViewer();
#print($_REQUEST['title']); if(preg_match("#^SpecialSimpleViewer/#", $_REQUEST['title'])) { # 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"); exit; }
# Redirect can make things a bit slower so may provide the image directly in future # if we got this far it's not an image and we should output an XML file
$wgParser->disableCache(); $wgOut->setHeaders();
header('Content-Type: text/xml'); # 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 "does not exist"; $wgOut->disable(); wfResetOutputBuffers(); return; }
$article = new Article($title); $wikitext = $article->getContent(); # parse the wikitext to expand templates and parser functions #$wgParser = new Parser(); #$wikitext = $wgParser->preprocess($wikitext, $title,new ParserOptions());
#print($wikitext); # need some heiristics here to handle a few reasonable image-article-list formats # we accept the default output format of DPL for now
# $wikitext =
- Image:Industrial-design-a-to-z.jpg
- etc
# make a list of image names excluding the namespace (Image:) $ns_image = $wgCanonicalNamespaceNames[NS_IMAGE]; preg_match_all("|".$ns_image.":(.+?)$|mi", $wikitext, $image); #print_r($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("http://mintmedia.co.nz/$wgScriptPath/index.php/$ns_image:$i?action=render")); #$title = Title::newFromText($i, NS_IMAGE); #$article = new Article($title); #$wikitext = htmlentities($article->getContent()); /*$replace = array("/\[\[\.+?|(.+?)\]\]/" => "$1", ); foreach($replace as $key => $value) $wikitext = preg_replace($key, $value, $wikitext);*/ print("<image><filename>$i</filename>$html</image>\n"); }
# close document print("</simpleviewerGallery>"); die(); }
}
function wfSetupSpecialSimpleViewer() { global $wgLanguageCode,$wgMessageCache;
# Add the messages used by the specialpage if ($wgLanguageCode == 'en') { $wgMessageCache->addMessages(array( 'specialsimpleviewer' => 'SimpleGallery', # The friendly page title 'exampleMessage' => "Example message: $1", )); }
# Add the specialpage to the environment SpecialPage::addPage(new SpecialSpecialSimpleViewer()); }
- 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; }