Difference between revisions of "Extension:Treeview3.php"

From Organic Design wiki
(use $wgJavaScriptFunctions)
(add JS in pf stage)
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.4, 2007-05-10');
+
define('TREEVIEW_VERSION','3.5.5, 2007-05-10');
  
 
if (!is_array($wgTreeViewImages)) $wgTreeViewImages = array(
 
if (!is_array($wgTreeViewImages)) $wgTreeViewImages = array(
Line 51: Line 51:
 
# 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;
 +
if (!isset($wgJavaScriptFunctions['toggleTreeviewItem'])) $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 82: Line 84:
 
# Convert each row into HTML
 
# Convert each row into HTML
 
function RowStart($text,$argv,&$parser) {
 
function RowStart($text,$argv,&$parser) {
global $wgTreeViewImages,$wgJavaScriptFunctions;
+
global $wgTreeViewImages;
 
list($id,$row) = split(',',$text);
 
list($id,$row) = split(',',$text);
  
Line 102: Line 104:
 
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($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'>"
 
return "<tr$show class='tree-row' depth='$depth' id='$node'>"

Revision as of 10:29, 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.5, 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) { global $wgJavaScriptFunctions; if (!isset($wgJavaScriptFunctions['toggleTreeviewItem'])) $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 $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 ?>