Difference between revisions of "Extension:Treeview3.php"

From Organic Design wiki
m
(Add JS unconditionally for MW ver < 1.9.0)
Line 7: Line 7:
 
if (!defined('MEDIAWIKI')) die('Not an entry point.');
 
if (!defined('MEDIAWIKI')) die('Not an entry point.');
 
   
 
   
define('TREEVIEW_VERSION','3.5.6, 2007-05-11');
+
define('TREEVIEW_VERSION','3.5.7, 2007-05-15');
  
 
if (!is_array($wgTreeViewImages)) $wgTreeViewImages = array(
 
if (!is_array($wgTreeViewImages)) $wgTreeViewImages = array(
Line 17: Line 17:
 
'spacer' => "$wgUploadPath/c/c0/Blank.gif"
 
'spacer' => "$wgUploadPath/c/c0/Blank.gif"
 
);
 
);
 +
 +
# Keep track of JavaScript added to page to avoid doubleups
 +
if (!isset($wgJS)) $wgJS = array();
  
 
$wgTreeViewMagic              = "tree"; # the parser-function name for trees
 
$wgTreeViewMagic              = "tree"; # the parser-function name for trees
Line 51: Line 54:
 
# Restructure recursive trees to single root trees surrounded by $magic tags
 
# Restructure recursive trees to single root trees surrounded by $magic tags
 
function Tree(&$parser) {
 
function Tree(&$parser) {
global $wgJavaScriptFunctions;
 
 
$this->addJS();
 
$this->addJS();
 
$args = array();
 
$args = array();
Line 116: Line 118:
 
# Add the javascript to the output object if not added yet and there is at least one tree
 
# Add the javascript to the output object if not added yet and there is at least one tree
 
function addJS() {
 
function addJS() {
global $wgTreeViewImages,$wgJavaScriptFunctions;
+
global $wgOut,$wgTreeViewImages,$wgJS;
                if (isset($wgJavaScriptFunctions['toggleTreeviewItem'])) return;
+
if (isset($wgJS['TreeView'])) return;
 +
$wgJS['TreeView'] = true;
 
$plus    = $wgTreeViewImages['plus'];
 
$plus    = $wgTreeViewImages['plus'];
 
$minus  = $wgTreeViewImages['minus'];
 
$minus  = $wgTreeViewImages['minus'];
Line 148: Line 151:
 
}
 
}
 
}
 
}
}';
+
}</script>');
 
}
 
}
 
}
 
}
Line 154: Line 157:
 
# Called from $wgExtensionFunctions array when initialising extensions
 
# Called from $wgExtensionFunctions array when initialising extensions
 
function wfSetupTreeView() {
 
function wfSetupTreeView() {
global $wgTreeView,$wgTreeViewMagic;
+
global $wgTreeView,$wgTreeViewMagic,$wgVersion;
 
$wgTreeView = new TreeView($wgTreeViewMagic);
 
$wgTreeView = new TreeView($wgTreeViewMagic);
 +
if (version_compare($wgVersion,'1.9.0')<0) $wgTreeView->addJS();
 
}
 
}
  

Revision as of 00:26, 15 May 2007

<?php

  1. MediaWiki Treeview Extension{{#Security:*|dev}}{{#Security:view|*}}Template:Php
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.
  1. - See http://www.mediawiki.org/wiki/Extension:Tree_view for installation and usage details
  2. - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
  3. - Author: http://www.organicdesign.co.nz/nad

if (!defined('MEDIAWIKI')) die('Not an entry point.');

define('TREEVIEW_VERSION','3.5.7, 2007-05-15');

if (!is_array($wgTreeViewImages)) $wgTreeViewImages = array( 'plus' => "$wgUploadPath/7/72/Plus.gif", 'minus' => "$wgUploadPath/a/a0/Minus.gif", 'opened' => "$wgUploadPath/4/46/Folder_opn_sml_yel.gif", 'closed' => "$wgUploadPath/6/6e/Folder_sml_yel.gif", 'doc' => "$wgUploadPath/e/e3/Doc-icon.gif", 'spacer' => "$wgUploadPath/c/c0/Blank.gif" );

  1. Keep track of JavaScript added to page to avoid doubleups

if (!isset($wgJS)) $wgJS = array();

$wgTreeViewMagic = "tree"; # the parser-function name for trees $wgExtensionFunctions[] = 'wfSetupTreeView'; $wgHooks['LanguageGetMagic'][] = 'wfTreeViewLanguageGetMagic';

$wgExtensionCredits['parserhook'][] = array( 'name' => 'Treeview', 'author' => 'User:Nad', 'url' => 'http://www.mediawiki.org/wiki/Extension:Treeview', 'description' => 'Allows dynamic tree-views to be made with bullet-list syntax', 'version' => TREEVIEW_VERSION );

class TreeView {

var $version = TREEVIEW_VERSION; var $token = '@@@'; var $id = 0; var $js = 0; var $info; var $args;

# Constructor function TreeView($magic) { global $wgParser,$wgHooks; $this->info = array(); $this->args = array(); $wgParser->setFunctionHook($magic,array($this,'Tree')); $wgParser->setHook('TreeViewRowStart',array($this,'RowStart')); $wgParser->setHook('TreeViewRowEnd',array($this,'RowEnd')); }

# Restructure recursive trees to single root trees surrounded by $magic tags function Tree(&$parser) { $this->addJS(); $args = array(); foreach (func_get_args() as $arg) if (!is_object($arg)) { if (preg_match('/^(.+?)=(.+)$/',$arg,$match)) $args[$match[1]] = $match[2]; else $args[] = $arg; } $text = $args[0]; $tree = ; $token = $this->token; $ver = $this->version; $id = $this->id++; if (count($parser->mTemplatePath)) $tree = "*O$token\n$text\n*C$token"; elseif (preg_match_all("/^(\\*+)(.$token)? *(.*?) *$/m",$text,$match)) { $this->args[$id] = $args; $this->info[$id] = array(); $nest = array(); $ld = ; $row = -1; foreach ($match[1] as $i => $indent) { if ($sub = $match[2][$i]) $sub == "O$token" ? $nest[] = substr($ld,0,-1) : array_pop($nest); elseif ($item = $match[3][$i]) { $this->info[$id][++$row] = strlen($indent.join(,$nest))-1; $tree .= "<TreeViewRowStart>$id,$row</TreeViewRowStart>$item<TreeViewRowEnd/>\n"; } $ld = $indent; }

$tree = "

\n$tree

";

} return $tree; }

# Convert each row into HTML function RowStart($text,$argv,&$parser) { global $wgTreeViewImages; list($id,$row) = split(',',$text);

$args = $this->args[$id]; $info = $this->info[$id]; $node = $id*1000+$row; $depth = $info[$row]; $next = isset($info[$row+1])  ? $info[$row+1] : 0; $plus = isset($args['plus'])  ? $args['plus']  : $wgTreeViewImages['plus']; $minus = isset($args['minus'])  ? $args['minus']  : $wgTreeViewImages['minus']; $opened = isset($args['opened'])  ? $args['opened']  : $wgTreeViewImages['opened']; $closed = isset($args['closed'])  ? $args['closed']  : $wgTreeViewImages['closed']; $spacer = isset($args['spacer'])  ? $args['spacer']  : $wgTreeViewImages['spacer']; $doc = isset($args['doc'])  ? $args['doc']  : $wgTreeViewImages['doc']; $default = isset($args['openlevels']) ? $args['openlevels'] : 0;

$show = $depth > $default ? ' style="display:none"' : ; if ($depth >= $default) { $open = $plus; $icon = $closed; } else { $open = $minus; $icon = $opened; } if ($depth >= $next) { $open = ; $icon = $doc; } else $open = "<a href='javascript:toggleTreeviewItem($node)'><img id='tree-img-$node' src='$open'/></a>";

return "<tr$show class='tree-row' depth='$depth' id='$node'>"

. "<img src='$spacer' width='".($depth*16)."' height='1'/>$open"

. " <img id='tree-fld-$node' src='$icon'/> "; }

function RowEnd($text,$argv,&$parser) {

return "\n"; } # Add the javascript to the output object if not added yet and there is at least one tree function addJS() { global $wgOut,$wgTreeViewImages,$wgJS; if (isset($wgJS['TreeView'])) return; $wgJS['TreeView'] = true; $plus = $wgTreeViewImages['plus']; $minus = $wgTreeViewImages['minus']; $opened = $wgTreeViewImages['opened']; $closed = $wgTreeViewImages['closed']; $spacer = $wgTreeViewImages['spacer']; $doc = $wgTreeViewImages['doc']; $wgJavaScriptFunctions['toggleTreeviewItem'] = ' function toggleTreeviewItem(id) { var plus = "'.$plus.'"; var minus = "'.$minus.'"; var opened = "'.$opened.'"; var closed = "'.$closed.'"; var doc = "'.$doc.'"; var item = document.getElementById(id); var next = document.getElementById(id+1); var depth = 0+item.getAttribute("depth"); var close = next.style.display != "none"; var img = document.getElementById("tree-img-"+id); var fld = document.getElementById("tree-fld-"+id); fld.setAttribute("src",close ? closed : opened); img.setAttribute("src",close ? plus : minus); while ((item = document.getElementById(++id)) && (0+item.getAttribute("depth") > depth)) { if (close) item.style.display = "none"; else if (depth == item.getAttribute("depth")-1) { item.style.display = ""; if (img = document.getElementById("tree-img-"+id)) img.setAttribute("src",plus); if (fld = document.getElementById("tree-fld-"+id)) if (fld.getAttribute("src") == opened) fld.setAttribute("src",closed); } } }</script>'); } }

  1. Called from $wgExtensionFunctions array when initialising extensions

function wfSetupTreeView() { global $wgTreeView,$wgTreeViewMagic,$wgVersion; $wgTreeView = new TreeView($wgTreeViewMagic); if (version_compare($wgVersion,'1.9.0')<0) $wgTreeView->addJS(); }

  1. Needed in MediaWiki >1.8.0 for magic word hooks to work properly

function wfTreeViewLanguageGetMagic(&$magicWords,$langCode = 0) { global $wgTreeViewMagic; $magicWords[$wgTreeViewMagic] = array(0,$wgTreeViewMagic); return true; } Template:AddJavaScript ?>