Extension:SimpleViewer.php

From Organic Design wiki
Revision as of 03:27, 17 April 2008 by Rob (talk | contribs) (mostly working but needs a tidy up)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

<?php

  1. Extension:SimpleViewer
Info.svg These are the MediaWiki extensions we're using and/or developing. Please refer to the information on the mediawiki.org wiki for installation and usage details. Extensions here which have no corresponding mediawiki article are either not ready for use or have been superseded. You can also browse our extension code in our local Subversion repository or our GitHub mirror.

Template:Php

  1. - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
  2. - Author: User:RobCategory:Extensions created with Template:Extension
  3. 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 = "

There was a problem. Please <a href='mailto:rob@mintmedia.co.nz?subject=problem with content'>tell me about it.</a>

\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; }

  1. 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; }