Difference between revisions of "Extension:Treeview4.php"

From Organic Design wiki
m
(4.0.2 - cannot obtain next depth for last row)
Line 4: Line 4:
 
# - 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('TREEVIEW4_VERSION','4.0.1, 2007-09-07');
+
define('TREEVIEW4_VERSION','4.0.2, 2007-09-07');
 
+
 
# Set any unset images to default titles
 
# Set any unset images to default titles
 
if (!is_array($wgTreeViewImages)) $wgTreeViewImages = array();
 
if (!is_array($wgTreeViewImages)) $wgTreeViewImages = array();
Line 17: Line 17:
 
if (!isset($wgTreeViewImages['doc']))    $wgTreeViewImages['doc']    = 'Doc-icon.gif';
 
if (!isset($wgTreeViewImages['doc']))    $wgTreeViewImages['doc']    = 'Doc-icon.gif';
 
if (!isset($wgTreeViewImages['spacer'])) $wgTreeViewImages['spacer'] = 'Blank.gif';
 
if (!isset($wgTreeViewImages['spacer'])) $wgTreeViewImages['spacer'] = '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();
 
+
 
$wgTreeView4Magic              = "tree"; # the parser-function name for trees
 
$wgTreeView4Magic              = "tree"; # the parser-function name for trees
 
$wgExtensionFunctions[]        = 'wfSetupTreeView4';
 
$wgExtensionFunctions[]        = 'wfSetupTreeView4';
 
$wgHooks['LanguageGetMagic'][] = 'wfTreeView4LanguageGetMagic';
 
$wgHooks['LanguageGetMagic'][] = 'wfTreeView4LanguageGetMagic';
 
+
 
$wgExtensionCredits['parserhook'][] = array(
 
$wgExtensionCredits['parserhook'][] = array(
 
'name'        => 'Treeview4',
 
'name'        => 'Treeview4',
Line 32: Line 32:
 
'version'    => TREEVIEW4_VERSION
 
'version'    => TREEVIEW4_VERSION
 
);
 
);
 
+
 
class TreeView4 {
 
class TreeView4 {
 
+
 
var $version  = TREEVIEW4_VERSION;
 
var $version  = TREEVIEW4_VERSION;
 
var $width    = 16;
 
var $width    = 16;
 
var $uniq    = array();
 
var $uniq    = array();
 
var $js      = 0;
 
var $js      = 0;
 
+
 
# Constructor
 
# Constructor
 
function TreeView4($magic) {
 
function TreeView4($magic) {
Line 57: Line 57:
 
}
 
}
 
}
 
}
 
+
 
# Restructure recursive trees into a single bullet list surrounded by internal treeview4 tags
 
# Restructure recursive trees into a single bullet list surrounded by internal treeview4 tags
 
function Tree(&$parser) {
 
function Tree(&$parser) {
Line 67: Line 67:
 
}
 
}
  
# The treeview voodoo
+
# Back magic
 
$text = $this->uniq[$id] = preg_replace(
 
$text = $this->uniq[$id] = preg_replace(
 
'/^\\*(\\**)\\s*(.UNIQ.+?-treeview4(.+?)-.+?-QINU)/me',
 
'/^\\*(\\**)\\s*(.UNIQ.+?-treeview4(.+?)-.+?-QINU)/me',
Line 74: Line 74:
 
);
 
);
  
# And a touch of black magic too
+
# And a little more voodoo here
 
$wgParser->setHook("treeview4$id",array($this,'treeview'));
 
$wgParser->setHook("treeview4$id",array($this,'treeview'));
 
return "<treeview4$id $args>$text</treeview4$id>";
 
return "<treeview4$id $args>$text</treeview4$id>";
Line 82: Line 82:
 
function treeview($text,$argv,&$parser) {
 
function treeview($text,$argv,&$parser) {
 
global $wgTreeViewImages;
 
global $wgTreeViewImages;
 
+
 
$id      = $argv['id'];
 
$id      = $argv['id'];
 
$ver    = $this->version;
 
$ver    = $this->version;
Line 95: Line 95:
 
$rows    = array();
 
$rows    = array();
 
  $tree    = '';
 
  $tree    = '';
 
+
 
# Protect the asterisk structure and wiki-parse the bullet tree
 
# Protect the asterisk structure and wiki-parse the bullet tree
 
$text = preg_replace_callback(
 
$text = preg_replace_callback(
"/^(\\*+)\\s*(.+)\\s*$/m",
+
"/^(\\*+)(.*?)$/m",
create_function('$m','return "@@@".strlen($m[1])."@$m[2]@@@";'),
+
create_function('$m','return "@@@".strlen($m[1])."@$m[2]%%%\n";'),
 
$text
 
$text
 
);
 
);
Line 106: Line 106:
  
 
# Convert the processed text into a tree table
 
# Convert the processed text into a tree table
if (preg_match_all('/@@@([0-9]+)@(.+?)@@@/',$text,$rows,PREG_SET_ORDER)) {
+
if (preg_match_all('/@@@([0-9]+)@(.+?)%%%/',$text,$rows,PREG_SET_ORDER)) {
 
foreach ($rows as $i => $row) {
 
foreach ($rows as $i => $row) {
 
list(,$depth,$item) = $row;
 
list(,$depth,$item) = $row;
$next = $i < count($rows) ? $rows[$i+1][1] : 0;
+
$next = $i < count($rows)-1 ? $rows[$i+1][1] : 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; }
Line 123: Line 123:
 
return $tree;
 
return $tree;
 
}
 
}
 
+
 
# 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 162: Line 162:
 
}
 
}
 
}
 
}
 
+
 
# Called from $wgExtensionFunctions array when initialising extensions
 
# Called from $wgExtensionFunctions array when initialising extensions
 
function wfSetupTreeView4() {
 
function wfSetupTreeView4() {
Line 169: Line 169:
 
$wgTreeView4->addJS(); # Make code unconditional for now due to parser caching
 
$wgTreeView4->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 wfTreeView4LanguageGetMagic(&$magicWords,$langCode = 0) {
 
function wfTreeView4LanguageGetMagic(&$magicWords,$langCode = 0) {

Revision as of 11:17, 7 September 2007

<?php

  1. MediaWiki Treeview ExtensionTemplate: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('TREEVIEW4_VERSION','4.0.2, 2007-09-07');

  1. 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';

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

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

$wgTreeView4Magic = "tree"; # 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 into a single bullet list surrounded by internal treeview4 tags function Tree(&$parser) { global $wgParser; $id = uniqid(); $args = "id='$id'"; foreach (func_get_args() as $arg) if (!is_object($arg)) { if (preg_match('/^(.+?=.+)$/',$arg,$m)) $args .= " $arg"; else $text = $arg; }

# Back magic $text = $this->uniq[$id] = preg_replace( '/^\\*(\\**)\\s*(.UNIQ.+?-treeview4(.+?)-.+?-QINU)/me', '$this->uniq["$3"] ? preg_replace("/^(\\*+)/m","$1\$1",$this->uniq["$3"]) : "$1$2"', $text );

# And a little more voodoo here $wgParser->setHook("treeview4$id",array($this,'treeview')); return "<treeview4$id $args>$text</treeview4$id>"; }

# Convert a bullet list into a treeview function treeview($text,$argv,&$parser) { global $wgTreeViewImages;

$id = $argv['id']; $ver = $this->version; $width = $this->width; $plus = $wgTreeViewImages['plus']; $minus = $wgTreeViewImages['minus']; $opened = $wgTreeViewImages['opened']; $closed = $wgTreeViewImages['closed']; $spacer = $wgTreeViewImages['spacer']; $doc = $wgTreeViewImages['doc']; $default = isset($argv['openlevels']) ? $argv['openlevels']+1 : 1; $rows = array();

		$tree    = ;

# Protect the asterisk structure and wiki-parse the bullet tree $text = preg_replace_callback( "/^(\\*+)(.*?)$/m", create_function('$m','return "@@@".strlen($m[1])."@$m[2]%%%\n";'), $text ); $out = $parser->parse($text,$parser->mTitle,$parser->mOptions,false,false); $text = $out->getText();

# Convert the processed text into a tree table if (preg_match_all('/@@@([0-9]+)@(.+?)%%%/',$text,$rows,PREG_SET_ORDER)) { foreach ($rows as $i => $row) { list(,$depth,$item) = $row; $next = $i < count($rows)-1 ? $rows[$i+1][1] : 0; $show = $depth > $default ? ' style="display:none"' : ; if ($depth >= $default) { $open = $plus; $icon = $closed; } else { $open = $minus; $icon = $opened; } if ($depth >= $next) { $open = "<img src='$spacer' width='$width'/>"; $icon = $doc; } else $open = "<a href='javascript:toggleTreeviewItem(\"$id\",$i)'><img id='tvi$id$i' src='$open'/></a>"; $tree .= "<tr$show class='tree-row' depth='$depth' id='tvr$id$i'>"

. "<img src='$spacer' width='".($depth*$width)."' height='1'/>$open" . " <img id='tvf$id$i' src='$icon'/> $item\n"; } } $tree = "

\n$tree

";

return $tree; }

# 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>'); } }

  1. 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 }

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