Difference between revisions of "Extension:Treeview3.php"

From Organic Design wiki
(remove perms)
(3.6.0 - change id system to guid so no conflicts with trees in ajax requests)
Line 1: Line 1:
 
<?php
 
<?php
# MediaWiki Treeview Extension{{php}}{{Category:Extensions|Treeview}}
+
# MediaWiki Treeview Extension
 
# - See http://www.mediawiki.org/wiki/Extension:Tree_view for installation and usage details
 
# - See http://www.mediawiki.org/wiki/Extension:Tree_view for installation and usage details
 
# - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
 
# - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
 
# - Author: http://www.organicdesign.co.nz/nad
 
# - Author: http://www.organicdesign.co.nz/nad
 
+
 
if (!defined('MEDIAWIKI')) die('Not an entry point.');
 
if (!defined('MEDIAWIKI')) die('Not an entry point.');
 
   
 
   
define('TREEVIEW_VERSION','3.5.7, 2007-05-15');
+
define('TREEVIEW_VERSION','3.6.0, 2007-08-30');
 
+
 
if (!is_array($wgTreeViewImages)) $wgTreeViewImages = array(
 
if (!is_array($wgTreeViewImages)) $wgTreeViewImages = array(
 
'plus'  => "$wgUploadPath/7/72/Plus.gif",
 
'plus'  => "$wgUploadPath/7/72/Plus.gif",
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
 
# Keep track of JavaScript added to page to avoid doubleups
 
if (!isset($wgJS)) $wgJS = array();
 
if (!isset($wgJS)) $wgJS = array();
 
+
 
$wgTreeViewMagic              = "tree"; # the parser-function name for trees
 
$wgTreeViewMagic              = "tree"; # the parser-function name for trees
 
$wgExtensionFunctions[]        = 'wfSetupTreeView';
 
$wgExtensionFunctions[]        = 'wfSetupTreeView';
 
$wgHooks['LanguageGetMagic'][] = 'wfTreeViewLanguageGetMagic';
 
$wgHooks['LanguageGetMagic'][] = 'wfTreeViewLanguageGetMagic';
 
+
 
$wgExtensionCredits['parserhook'][] = array(
 
$wgExtensionCredits['parserhook'][] = array(
 
'name'        => 'Treeview',
 
'name'        => 'Treeview',
Line 32: Line 32:
 
'version'    => TREEVIEW_VERSION
 
'version'    => TREEVIEW_VERSION
 
);
 
);
 
+
 
class TreeView {
 
class TreeView {
 
+
 
var $version = TREEVIEW_VERSION;
 
var $version = TREEVIEW_VERSION;
 
var $token  = '@@@';
 
var $token  = '@@@';
var $id      = 0;
+
var $id      = 1;
 
var $js      = 0;
 
var $js      = 0;
 
var $info;
 
var $info;
 
var $args;
 
var $args;
 
+
 
# Constructor
 
# Constructor
 
function TreeView($magic) {
 
function TreeView($magic) {
Line 51: Line 51:
 
$wgParser->setHook('TreeViewRowEnd',array($this,'RowEnd'));
 
$wgParser->setHook('TreeViewRowEnd',array($this,'RowEnd'));
 
}
 
}
 
+
 
# 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) {
$this->addJS();
 
 
$args = array();
 
$args = array();
 
foreach (func_get_args() as $arg) if (!is_object($arg)) {
 
foreach (func_get_args() as $arg) if (!is_object($arg)) {
Line 63: Line 62:
 
$token = $this->token;
 
$token = $this->token;
 
$ver = $this->version;
 
$ver = $this->version;
$id = $this->id++;
+
$id = uniqid();
 
if (count($parser->mTemplatePath)) $tree = "*O$token\n$text\n*C$token";
 
if (count($parser->mTemplatePath)) $tree = "*O$token\n$text\n*C$token";
 
elseif (preg_match_all("/^(\\*+)(.$token)? *(.*?) *$/m",$text,$match)) {
 
elseif (preg_match_all("/^(\\*+)(.$token)? *(.*?) *$/m",$text,$match)) {
Line 79: Line 78:
 
$ld = $indent;
 
$ld = $indent;
 
}
 
}
$tree = "<table class='tree-view' id='tree-view-$id' title='Extension:Treeview (ver $ver)'>\n$tree</table>";
+
$tree = "<table class='tree-view' id='tv$id' title='Extension:Treeview (ver $ver)'>\n$tree</table>";
 
}
 
}
 
return $tree;
 
return $tree;
 
}
 
}
 
+
 
# Convert each row into HTML
 
# Convert each row into HTML
 
function RowStart($text,$argv,&$parser) {
 
function RowStart($text,$argv,&$parser) {
 
global $wgTreeViewImages;
 
global $wgTreeViewImages;
 
list($id,$row) = split(',',$text);
 
list($id,$row) = split(',',$text);
 
+
 
$args    = $this->args[$id];
 
$args    = $this->args[$id];
 
$info    = $this->info[$id];
 
$info    = $this->info[$id];
$node    = $id*1000+$row;
 
 
$depth  = $info[$row];
 
$depth  = $info[$row];
 
$next    = isset($info[$row+1])      ? $info[$row+1] : 0;
 
$next    = isset($info[$row+1])      ? $info[$row+1] : 0;
Line 101: Line 99:
 
$doc    = isset($args['doc'])        ? $args['doc']        : $wgTreeViewImages['doc'];
 
$doc    = isset($args['doc'])        ? $args['doc']        : $wgTreeViewImages['doc'];
 
$default = isset($args['openlevels']) ? $args['openlevels'] : 0;
 
$default = isset($args['openlevels']) ? $args['openlevels'] : 0;
 
+
 
$show = $depth > $default ? ' style="display:none"' : '';
 
$show = $depth > $default ? ' style="display:none"' : '';
 
if ($depth >= $default) { $open = $plus; $icon = $closed; } else { $open = $minus; $icon = $opened; }
 
if ($depth >= $default) { $open = $plus; $icon = $closed; } else { $open = $minus; $icon = $opened; }
 
if ($depth >= $next) { $open = ''; $icon = $doc; }
 
if ($depth >= $next) { $open = ''; $icon = $doc; }
else $open = "<a href='javascript:toggleTreeviewItem($node)'><img id='tree-img-$node' src='$open'/></a>";
+
else $open = "<a href='javascript:toggleTreeviewItem(\"$id\",$row)'><img id='tvi$id$row' src='$open'/></a>";
 
+
return "<tr$show class='tree-row' depth='$depth' id='$node'>"
+
return "<tr$show class='tree-row' depth='$depth' id='tvr$id$row'>"
 
. "<td valign='bottom'><img src='$spacer' width='".($depth*16)."' height='1'/>$open"
 
. "<td valign='bottom'><img src='$spacer' width='".($depth*16)."' height='1'/>$open"
. "&nbsp;<img id='tree-fld-$node' src='$icon'/>&nbsp;";
+
. "&nbsp;<img id='tvf$id$row' src='$icon'/>&nbsp;";
 
}
 
}
 
+
 
function RowEnd($text,$argv,&$parser) {
 
function RowEnd($text,$argv,&$parser) {
 
return "</td></tr>\n";
 
return "</td></tr>\n";
 
}
 
}
 
+
 
# 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() {
Line 128: Line 126:
 
$doc    = $wgTreeViewImages['doc'];
 
$doc    = $wgTreeViewImages['doc'];
 
$wgOut->addScript('<script type="'.$wgJsMimeType.'">
 
$wgOut->addScript('<script type="'.$wgJsMimeType.'">
function toggleTreeviewItem(id) {
+
function toggleTreeviewItem(id,row) {
 
var plus  = "'.$plus.'";
 
var plus  = "'.$plus.'";
 
var minus  = "'.$minus.'";
 
var minus  = "'.$minus.'";
Line 134: Line 132:
 
var closed = "'.$closed.'";
 
var closed = "'.$closed.'";
 
var doc    = "'.$doc.'";
 
var doc    = "'.$doc.'";
var item  = document.getElementById(id);
+
var item  = document.getElementById("tvr"+id+row);
var next  = document.getElementById(id+1);
+
var next  = document.getElementById("tvr"+id+(row+1));
 
var depth  = 0+item.getAttribute("depth");
 
var depth  = 0+item.getAttribute("depth");
 
var close  = next.style.display != "none";
 
var close  = next.style.display != "none";
var img    = document.getElementById("tree-img-"+id);
+
var img    = document.getElementById("tvi"+id+row);
var fld    = document.getElementById("tree-fld-"+id);
+
var fld    = document.getElementById("tvf"+id+row);
 
fld.setAttribute("src",close ? closed : opened);
 
fld.setAttribute("src",close ? closed : opened);
 
img.setAttribute("src",close ? plus : minus);
 
img.setAttribute("src",close ? plus : minus);
while ((item = document.getElementById(++id)) && (0+item.getAttribute("depth") > depth)) {
+
while ((item = document.getElementById("tvr"+id+(++row))) && (0+item.getAttribute("depth") > depth)) {
 
if (close) item.style.display = "none";
 
if (close) item.style.display = "none";
 
else if (depth == item.getAttribute("depth")-1) {
 
else if (depth == item.getAttribute("depth")-1) {
 
item.style.display = "";
 
item.style.display = "";
if (img = document.getElementById("tree-img-"+id)) img.setAttribute("src",plus);
+
if (img = document.getElementById("tvi"+id+row)) img.setAttribute("src",plus);
if (fld = document.getElementById("tree-fld-"+id))
+
if (fld = document.getElementById("tvf"+id+row))
 
if (fld.getAttribute("src") == opened) fld.setAttribute("src",closed);
 
if (fld.getAttribute("src") == opened) fld.setAttribute("src",closed);
 
}
 
}
Line 154: Line 152:
 
}
 
}
 
}
 
}
 
+
 
# Called from $wgExtensionFunctions array when initialising extensions
 
# Called from $wgExtensionFunctions array when initialising extensions
 
function wfSetupTreeView() {
 
function wfSetupTreeView() {
 
global $wgTreeView,$wgTreeViewMagic,$wgVersion;
 
global $wgTreeView,$wgTreeViewMagic,$wgVersion;
 
$wgTreeView = new TreeView($wgTreeViewMagic);
 
$wgTreeView = new TreeView($wgTreeViewMagic);
$wgTreeView->addJS(); # addScript doesn't seem to work from within parser
+
$wgTreeView->addJS(); # Make code unconditional for now due to parser caching
 
}
 
}
 
+
 
# Needed in MediaWiki >1.8.0 for magic word hooks to work properly
 
# Needed in MediaWiki >1.8.0 for magic word hooks to work properly
 
function wfTreeViewLanguageGetMagic(&$magicWords,$langCode = 0) {
 
function wfTreeViewLanguageGetMagic(&$magicWords,$langCode = 0) {

Revision as of 22:09, 29 August 2007

<?php

  1. MediaWiki Treeview Extension
  2. - See http://www.mediawiki.org/wiki/Extension:Tree_view for installation and usage details
  3. - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
  4. - Author: http://www.organicdesign.co.nz/nad

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

define('TREEVIEW_VERSION','3.6.0, 2007-08-30');

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 = 1; 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 = uniqid(); 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]; $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(\"$id\",$row)'><img id='tvi$id$row' src='$open'/></a>";

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

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

. " <img id='tvf$id$row' 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,$wgJsMimeType; 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']; $wgOut->addScript('<script type="'.$wgJsMimeType.'"> function toggleTreeviewItem(id,row) { var plus = "'.$plus.'"; var minus = "'.$minus.'"; var opened = "'.$opened.'"; var closed = "'.$closed.'"; var doc = "'.$doc.'"; var item = document.getElementById("tvr"+id+row); var next = document.getElementById("tvr"+id+(row+1)); var depth = 0+item.getAttribute("depth"); var close = next.style.display != "none"; var img = document.getElementById("tvi"+id+row); var fld = document.getElementById("tvf"+id+row); fld.setAttribute("src",close ? closed : opened); img.setAttribute("src",close ? plus : minus); while ((item = document.getElementById("tvr"+id+(++row))) && (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("tvi"+id+row)) img.setAttribute("src",plus); if (fld = document.getElementById("tvf"+id+row)) 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); $wgTreeView->addJS(); # Make code unconditional for now due to parser caching }

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