Difference between revisions of "Extension:SimpleViewer.php"

From Organic Design wiki
(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        = '__x__';
+
$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).
         frameColor - Color of image frame, navigation buttons and thumbnail frame (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'>SimpleViewer requires Macromedia Flash. <a href='http://www.macromedia.com/go/getflashplayer/'>Get Macromedia Flash.</a> If you have Flash installed, <a href='index.html?detectflash=false'>click to view gallery</a>.</div>
+
$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();
 
+
       
        global $wgOut, $wgCanonicalNamespaceNames, $wgParser, $wgScriptPath;
+
    #print($_REQUEST['title']);
#$wgParser->disableCache();
+
   
 +
    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
        print($_REQUEST['title']);
+
    # 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(preg_match("#^SpecialSimpleViewer/#", $_REQUEST['title'])) {
+
   
+
    # if we got this far it's not an image and we should output an XML file
# 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
+
    $wgParser->disableCache();
       
+
    $wgOut->setHeaders();
        # if we got this far it's not an image and we should output an XML file
 
  
header('Content-Type: text/html');
+
    header('Content-Type: text/xml');
        print "hello";
+
    # params:
        # params:
+
    # src = article name containing a list of images for the gallery, article may also contain a DPL query
        # 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);
        preg_match_all("#SpecialSimpleViewer/(.+)$#", $_REQUEST['title'], $matches, PREG_SET_ORDER);
+
    #print_r($matches);
        #print_r($matches);
+
    $t = str_replace($wgSimpleViewerUrlMagic, ':', $matches[0][1]);
        $t = str_replace($wgSimpleViewerUrlMagic, ':', $matches[0][1]);
+
    #print($t);
        print($_REQUEST['title']);
 
  
# get article content
+
    # get article content
        $title    = Title::newFromText($t);
+
    $title    = Title::newFromText($t);
        # if the image article does not exist exit
+
    # if the image article does not exist exit
if(!$title) {
+
    if(!$title) {
print "does not exist";
+
    print "does not exist";
            $wgOut->disable();
+
        $wgOut->disable();
            wfResetOutputBuffers();
+
        wfResetOutputBuffers();
            return;
+
        return;
        }
+
    }
  
  
        $article  = new Article($title);
+
    $article  = new Article($title);
        $wikitext = $article->getContent();
+
    $wikitext = $article->getContent();
        # parse the wikitext to expand templates and parser functions
+
   
        $wgParser = new Parser();
+
    # parse the wikitext to expand templates and parser functions
 +
    #$wgParser = new Parser();
 +
   
 +
    #$wikitext = $wgParser->preprocess($wikitext, $title,new ParserOptions());
  
$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);
  
        print $wikitext;
+
   
       
+
    # standard header, other options to add later
        # need some heiristics here to handle a few reasonable image-article-list formats
+
    print("<?xml version='1.0' encoding='UTF-8'?>
        # we accept the default output format of DPL for now
+
<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
# $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.":([a-z-_.]+?)\]|i", $wikitext, $image);
 
  
       
 
        # standard header, other options to add later
 
print("<?xml version='1.0' encoding='UTF-8'?>
 
<simpleviewerGallery maxImageWidth='600' maxImageHeight='600' textColor='0x000000' frameColor='0x000000' frameWidth='2' stagePadding='40' thumbnailColumns='3' thumbnailRows='3' navPosition='left' title='title of gallery' enableRightClickOpen='true' backgroundImagePath='' imagePath='$wgScriptPath/index.php/SpecialSpecialSimpleViewer/images/500/' thumbPath='$wgScriptPath/index.php/SpecialSpecialSimpleViewer/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");
 +
    }
  
        # loop and generate <image> containers
+
    # close document       
        foreach($image[1] as $i) {
+
    print("</simpleviewerGallery>");
            print("<image><filename>$i</filename><caption>Arles old town.</caption></image>\n");
+
    die();
        }
+
    }
  
        # close document       
+
}
        print("</simpleviewerGallery>");
 
 
 
        $wgOut->disable();
 
        wfResetOutputBuffers();
 
        }
 
   
 
}
 
  
 
function wfSetupSpecialSimpleViewer() {
 
function wfSetupSpecialSimpleViewer() {

Revision as of 09:32, 2 April 2008

<?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";

  1. $wgHooks['ParserBeforeStrip'][] = 'efSetupSimpleViewer';

$wgExtensionFunctions[] = 'efSetupSimpleViewer';

  1. $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 = "

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

<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>";

  1. /research/extensions/SimpleViewer/simpleviewer/Special:Test.xml
  1. /research/index.php/Special:SpecialSimpleViewer/Mint_Media:Gallery
  1. $wgScriptPath/index.php/Special:SpecialSimpleViewer/$urlsafe
  2. /research/index.php/Special:SpecialSimpleViewer?src=Mint_Media:Gallery
  1. $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) {

}

}


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

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