Difference between revisions of "Extension:Treeview3.php"

From Organic Design wiki
m (+sortkey)
(use $wgJavaScriptFunctions)
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.3, 2007-04-18');
+
define('TREEVIEW_VERSION','3.5.4, 2007-05-10');
  
 
if (!is_array($wgTreeViewImages)) $wgTreeViewImages = array(
 
if (!is_array($wgTreeViewImages)) $wgTreeViewImages = array(
Line 82: Line 82:
 
# Convert each row into HTML
 
# Convert each row into HTML
 
function RowStart($text,$argv,&$parser) {
 
function RowStart($text,$argv,&$parser) {
global $wgTreeViewImages,$wgOut;
+
global $wgTreeViewImages,$wgJavaScriptFunctions;
 
list($id,$row) = split(',',$text);
 
list($id,$row) = split(',',$text);
  
Line 103: Line 103:
 
else $open = "<a href='javascript:toggleTreeviewItem($node)'><img id='tree-img-$node' src='$open'/></a>";
 
else $open = "<a href='javascript:toggleTreeviewItem($node)'><img id='tree-img-$node' src='$open'/></a>";
  
$this->addJS($wgOut);
+
if (isset($wgJavaScriptFunctions['toggleTreeviewItem'])) $this->addJS();
  
 
return "<tr$show class='tree-row' depth='$depth' id='$node'>"
 
return "<tr$show class='tree-row' depth='$depth' id='$node'>"
Line 115: Line 115:
  
 
# 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(&$out) {
+
function addJS() {
if ($this->js++) return true;
+
global $wgTreeViewImages,$wgJavaScriptFunctions;
global $wgTreeViewImages;
 
 
$plus    = $wgTreeViewImages['plus'];
 
$plus    = $wgTreeViewImages['plus'];
 
$minus  = $wgTreeViewImages['minus'];
 
$minus  = $wgTreeViewImages['minus'];
Line 124: Line 123:
 
$spacer  = $wgTreeViewImages['spacer'];
 
$spacer  = $wgTreeViewImages['spacer'];
 
$doc    = $wgTreeViewImages['doc'];
 
$doc    = $wgTreeViewImages['doc'];
$out->addScript('<script type="text/javascript">
+
$wgJavaScriptFunctions['toggleTreeviewItem'] = '
 
function toggleTreeviewItem(id) {
 
function toggleTreeviewItem(id) {
 
var plus  = "'.$plus.'";
 
var plus  = "'.$plus.'";
Line 148: Line 147:
 
}
 
}
 
}
 
}
}
+
}';
</script>');
 
return true;
 
 
}
 
}
 
 
}
 
}
  
Line 167: Line 163:
 
return true;
 
return true;
 
}
 
}
 +
 +
{{AddJavaScript}}
 
?>
 
?>

Revision as of 04:24, 10 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.4, 2007-05-10');

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

$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) { $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,$wgJavaScriptFunctions; 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>";

if (isset($wgJavaScriptFunctions['toggleTreeviewItem'])) $this->addJS();

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 $wgTreeViewImages,$wgJavaScriptFunctions; $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); } } }'; } }

  1. Called from $wgExtensionFunctions array when initialising extensions

function wfSetupTreeView() { global $wgTreeView,$wgTreeViewMagic; $wgTreeView = new TreeView($wgTreeViewMagic); }

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