Extension:Treeview4.php
<?php
- MediaWiki Treeview ExtensionTemplate:Php
- - See http://www.mediawiki.org/wiki/Extension:Tree_view for installation and usage details
- - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
- - Author: http://www.organicdesign.co.nz/nad
if (!defined('MEDIAWIKI')) die('Not an entry point.');
define('TREEVIEW4_VERSION','4.0.0, 2007-09-06');
- Set any unset images to default titles
if (!is_array($wgTreeViewImages)) $wgTreeViewImages = array(); if (!isset($wgTreeViewImages['plus'])) $wgTreeViewImages['plus'] = 'Plus.gif'; if (!isset($wgTreeViewImages['minus'])) $wgTreeViewImages['minus'] = 'Minus.gif'; if (!isset($wgTreeViewImages['opened'])) $wgTreeViewImages['opened'] = 'Folder_opn_sml_yel.gif'; if (!isset($wgTreeViewImages['closed'])) $wgTreeViewImages['closed'] = 'Folder_sml_yel.gif'; if (!isset($wgTreeViewImages['doc'])) $wgTreeViewImages['doc'] = 'Doc-icon.gif'; if (!isset($wgTreeViewImages['spacer'])) $wgTreeViewImages['spacer'] = 'Blank.gif';
- Keep track of JavaScript added to page to avoid doubleups
if (!isset($wgJS)) $wgJS = array();
$wgTreeView4Magic = "tree4"; # the parser-function name for trees $wgExtensionFunctions[] = 'wfSetupTreeView4'; $wgHooks['LanguageGetMagic'][] = 'wfTreeView4LanguageGetMagic';
$wgExtensionCredits['parserhook'][] = array( 'name' => 'Treeview4', 'author' => 'User:Nad', 'url' => 'http://www.mediawiki.org/wiki/Extension:Treeview', 'description' => 'Allows dynamic tree-views to be made with bullet-list syntax', 'version' => TREEVIEW4_VERSION );
class TreeView4 {
var $version = TREEVIEW4_VERSION; var $width = 16; var $uniq = array(); var $js = 0;
# Constructor function TreeView4($magic) { global $wgParser,$wgHooks,$wgTreeViewImages;
# Set hooks $wgParser->setFunctionHook($magic,array($this,'Tree'));
# Convert image titles to file paths and obtain pixel width of items foreach ($wgTreeViewImages as $k => $v) { $title = Title::newFromText($v,NS_IMAGE); $image = Image::newFromTitle($title); if ($image && $image->exists()) { $wgTreeViewImages[$k] = $image->getURL(); if ($k == 'plus') $this->width = $image->getWidth(); } } }
# Restructure recursive trees to single root trees surrounded by $magic tags function Tree(&$parser) { global $wgParser; $id = uniqid(); $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 = preg_replace( '/.(UNIQ.+?-treeview4(.+?)-.+?-QINU)/e', '$this->uniq["$2"] ? preg_replace("/^\\*/m","+*",$this->uniq["$2"]) : "$1"', $args[0] ); $this->uniq[$id] = $text; $wgParser->setHook("treeview4$id",array($this,'treeview')); return "<treeview4$id>$text</treeview4$id>"; }
function treeview($text,$argv,&$parser) {
return "
$text
";
}
# 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['TreeView4'])) return; $wgJS['TreeView4'] = 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>'); } }
- Called from $wgExtensionFunctions array when initialising extensions
function wfSetupTreeView4() { global $wgTreeView4,$wgTreeView4Magic; $wgTreeView4 = new TreeView4($wgTreeView4Magic); $wgTreeView4->addJS(); # Make code unconditional for now due to parser caching }
- Needed in MediaWiki >1.8.0 for magic word hooks to work properly
function wfTreeView4LanguageGetMagic(&$magicWords,$langCode = 0) { global $wgTreeView4Magic; $magicWords[$wgTreeView4Magic] = array(0,$wgTreeView4Magic); return true; } ?>