<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AAhnentafel%2Fsandbox</id>
	<title>Module:Ahnentafel/sandbox - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AAhnentafel%2Fsandbox"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Ahnentafel/sandbox&amp;action=history"/>
	<updated>2026-05-24T11:15:06Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Ahnentafel/sandbox&amp;diff=135189&amp;oldid=prev</id>
		<title>imported&gt;Frietjes at 14:20, 24 January 2019</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Ahnentafel/sandbox&amp;diff=135189&amp;oldid=prev"/>
		<updated>2019-01-24T14:20:56Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--&lt;br /&gt;
-- implements [[Template:ahnentafel]]&lt;br /&gt;
--&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- templatestyles&lt;br /&gt;
local templatestyles = &amp;#039;Ahnentafel/styles.css&amp;#039;&lt;br /&gt;
-- table of row pointers&lt;br /&gt;
local rows = {}&lt;br /&gt;
-- first and last indices in rows table&lt;br /&gt;
local rowbegin, rowend = -1,-1&lt;br /&gt;
-- tracking&lt;br /&gt;
local tcats = &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- args&lt;br /&gt;
local args = {}&lt;br /&gt;
&lt;br /&gt;
-- inner cell&lt;br /&gt;
local innerfs = &amp;#039;88%&amp;#039;&lt;br /&gt;
local innercell = nil&lt;br /&gt;
&lt;br /&gt;
-- right to left?&lt;br /&gt;
local rtl = false&lt;br /&gt;
&lt;br /&gt;
local function checkparameters(k)&lt;br /&gt;
	if (k == &amp;#039;align&amp;#039; or k == &amp;#039;collapsed&amp;#039; or k == &amp;#039;collapsible&amp;#039; or&lt;br /&gt;
		k == &amp;#039;title&amp;#039; or k == &amp;#039;float&amp;#039; or k == &amp;#039;clear&amp;#039; or k == &amp;#039;ref&amp;#039; or &lt;br /&gt;
		k == &amp;#039;headnotes&amp;#039; or k == &amp;#039;headnotes_align&amp;#039; or k == &amp;#039;rtl&amp;#039; or&lt;br /&gt;
		k == &amp;#039;footnotes&amp;#039; or k == &amp;#039;footnotes_align&amp;#039; or&lt;br /&gt;
		k == &amp;#039;width&amp;#039; or k == &amp;#039;min-width&amp;#039; or k == &amp;#039;text-align&amp;#039;) then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	if (k == &amp;#039;boxstyle&amp;#039; or k == &amp;#039;style&amp;#039; or k == &amp;#039;border&amp;#039;) then&lt;br /&gt;
		tcats = tcats .. &amp;#039;[[Category:Pages using ahnentafel with &amp;#039; .. k .. &amp;#039;]]&amp;#039;&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	if k:find(&amp;#039;^boxstyle_[1-8]$&amp;#039;) then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	if k:find(&amp;#039;^color_[1-8]$&amp;#039;) then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	if k:find(&amp;#039;^border_[1-8]$&amp;#039;) then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	if k:find(&amp;#039;^r_[1-9][0-9]*$&amp;#039;) then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	k = mw.ustring.gsub(k, &amp;#039;[^%w\-_ ]&amp;#039;, &amp;#039;?&amp;#039;)&lt;br /&gt;
	tcats = tcats .. &amp;#039;[[Category:Pages using ahnentafel with unknown parameters|&amp;#039; .. k .. &amp;#039; ]]&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function addcell(r, rspan, cspan, t, s, c)&lt;br /&gt;
	if ((r + rspan - 1) &amp;lt; rowbegin) or (r &amp;gt; rowend) then&lt;br /&gt;
		-- completely out of range; do nothing&lt;br /&gt;
		return&lt;br /&gt;
	elseif r &amp;lt; rowbegin then&lt;br /&gt;
		-- partially out of range, adjust&lt;br /&gt;
		rspan = rspan - (rowbegin - r)&lt;br /&gt;
		r = rowbegin&lt;br /&gt;
	elseif (r + rspan - 1) &amp;gt; rowend then&lt;br /&gt;
		-- partially out of range, adjust&lt;br /&gt;
		rspan = rowend + 1 - r&lt;br /&gt;
	end&lt;br /&gt;
	if rspan &amp;gt; 0 then&lt;br /&gt;
		local c = mw.html.create(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;rowspan&amp;#039;, (rspan &amp;gt; 1) and rspan or nil)&lt;br /&gt;
			:attr(&amp;#039;colspan&amp;#039;, (cspan &amp;gt; 1) and cspan or nil)&lt;br /&gt;
			:css(&amp;#039;background&amp;#039;, &amp;#039;cornsilk&amp;#039;)&lt;br /&gt;
			:cssText(s)&lt;br /&gt;
			:addClass(c)&lt;br /&gt;
			:wikitext(t)&lt;br /&gt;
		if rtl then&lt;br /&gt;
			table.insert(rows[r], 1, tostring(c))&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(rows[r], tostring(c))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function float_style()&lt;br /&gt;
	-- style for floating&lt;br /&gt;
	local align = (args[&amp;#039;align&amp;#039;] or &amp;#039;&amp;#039;):lower()&lt;br /&gt;
	if (align == &amp;#039;right&amp;#039;) then&lt;br /&gt;
		return &amp;#039;float:right;&amp;#039;&lt;br /&gt;
	elseif (align == &amp;#039;left&amp;#039;) then&lt;br /&gt;
		return &amp;#039;float:left;&amp;#039;&lt;br /&gt;
	elseif (align == &amp;#039;center&amp;#039;) then&lt;br /&gt;
		return &amp;#039;margin-left:auto; margin-right:auto;&amp;#039; &lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function add_outer_container(res)&lt;br /&gt;
	-- inner = outer (default)&lt;br /&gt;
	innercell = res&lt;br /&gt;
	&lt;br /&gt;
	local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	if args[&amp;#039;collapsed&amp;#039;] and args[&amp;#039;collapsed&amp;#039;] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		args[&amp;#039;collapsible&amp;#039;] = &amp;#039;yes&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args[&amp;#039;title&amp;#039;] and args[&amp;#039;title&amp;#039;] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		args[&amp;#039;collapsible&amp;#039;] = &amp;#039;yes&amp;#039;&lt;br /&gt;
		if yesno(args[&amp;#039;collapsed&amp;#039;] or &amp;#039;no&amp;#039;) then&lt;br /&gt;
			args[&amp;#039;collapsed&amp;#039;] = &amp;#039;yes&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			args[&amp;#039;collapsed&amp;#039;] = &amp;#039;no&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if yesno(args[&amp;#039;collapsible&amp;#039;] or &amp;#039;no&amp;#039;) then&lt;br /&gt;
		local r = res:tag(&amp;#039;table&amp;#039;)&lt;br /&gt;
		local t = args[&amp;#039;title&amp;#039;] or (&amp;#039;Ancestors of &amp;#039; .. mw.title.getCurrentTitle().text)&lt;br /&gt;
		r:addClass(&amp;#039;collapsible&amp;#039;)&lt;br /&gt;
		if yesno(args[&amp;#039;collapsed&amp;#039;] or &amp;#039;yes&amp;#039;) then&lt;br /&gt;
			r:addClass(&amp;#039;collapsed&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		local f = args[&amp;#039;float&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
		if f == &amp;#039;left&amp;#039; then&lt;br /&gt;
			r:css(&amp;#039;margin&amp;#039;, &amp;#039;0.3em 1em 0.3em 0&amp;#039;)&lt;br /&gt;
			r:css(&amp;#039;float&amp;#039;, &amp;#039;left&amp;#039;)&lt;br /&gt;
			r:css(&amp;#039;clear&amp;#039;, args[&amp;#039;clear&amp;#039;] or &amp;#039;left&amp;#039;)&lt;br /&gt;
			r:css(&amp;#039;min-width&amp;#039;, args[&amp;#039;min-width&amp;#039;] or args[&amp;#039;width&amp;#039;] or &amp;#039;33em&amp;#039;)&lt;br /&gt;
		elseif f == &amp;#039;right&amp;#039; then&lt;br /&gt;
			r:css(&amp;#039;margin&amp;#039;, &amp;#039;0.3em 0 0.3em 1em&amp;#039;)&lt;br /&gt;
			r:css(&amp;#039;float&amp;#039;, &amp;#039;right&amp;#039;)&lt;br /&gt;
			r:css(&amp;#039;clear&amp;#039;, args[&amp;#039;clear&amp;#039;] or &amp;#039;right&amp;#039;)&lt;br /&gt;
			r:css(&amp;#039;min-width&amp;#039;, args[&amp;#039;min-width&amp;#039;] or args[&amp;#039;width&amp;#039;] or &amp;#039;33em&amp;#039;)&lt;br /&gt;
		elseif f == &amp;#039;none&amp;#039; then&lt;br /&gt;
			r:css(&amp;#039;margin&amp;#039;, &amp;#039;0.3em 0&amp;#039;)&lt;br /&gt;
			r:css(&amp;#039;min-width&amp;#039;, args[&amp;#039;min-width&amp;#039;] or args[&amp;#039;width&amp;#039;] or &amp;#039;60em&amp;#039;)&lt;br /&gt;
		else&lt;br /&gt;
			r:css(&amp;#039;margin&amp;#039;, &amp;#039;0.3em auto&amp;#039;)&lt;br /&gt;
			r:css(&amp;#039;clear&amp;#039;, args[&amp;#039;clear&amp;#039;] or &amp;#039;none&amp;#039;)&lt;br /&gt;
			r:css(&amp;#039;min-width&amp;#039;, args[&amp;#039;min-width&amp;#039;] or args[&amp;#039;width&amp;#039;] or &amp;#039;60em&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		r:css(&amp;#039;width&amp;#039;, args[&amp;#039;width&amp;#039;] or &amp;#039;auto&amp;#039;)&lt;br /&gt;
		r:css(&amp;#039;font-size&amp;#039;, &amp;#039;88%&amp;#039;)&lt;br /&gt;
		r:css(&amp;#039;border&amp;#039;, &amp;#039;1px solid #aaa&amp;#039;)&lt;br /&gt;
		r:tag(&amp;#039;tr&amp;#039;):tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;padding&amp;#039;, &amp;#039;0.2em 0.3em 0.2em 4.3em&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;background&amp;#039;, &amp;#039;none&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;width&amp;#039;, args[&amp;#039;width&amp;#039;] or &amp;#039;auto&amp;#039;)&lt;br /&gt;
				:wikitext(t .. (args[&amp;#039;ref&amp;#039;] or &amp;#039;&amp;#039;))&lt;br /&gt;
		innercell = r:tag(&amp;#039;tr&amp;#039;):tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;text-align&amp;#039;, args[&amp;#039;text-align&amp;#039;] or &amp;#039;center&amp;#039;)&lt;br /&gt;
		innerfs = nil&lt;br /&gt;
		args[&amp;#039;ref&amp;#039;] = nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function add_headnotes()&lt;br /&gt;
	if args[&amp;#039;headnotes&amp;#039;] then&lt;br /&gt;
		if args[&amp;#039;headnotes_align&amp;#039;] then&lt;br /&gt;
			innercell:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;width&amp;#039;,&amp;#039;100%&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;text-align&amp;#039;,args[&amp;#039;headnotes_align&amp;#039;])&lt;br /&gt;
				:wikitext(args[&amp;#039;headnotes&amp;#039;])&lt;br /&gt;
		else&lt;br /&gt;
			innercell:wikitext(args[&amp;#039;headnotes&amp;#039;])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function add_footnotes()&lt;br /&gt;
	if args[&amp;#039;footnotes&amp;#039;] or args[&amp;#039;ref&amp;#039;] then&lt;br /&gt;
		if args[&amp;#039;footnotes_align&amp;#039;] then&lt;br /&gt;
			innercell:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;width&amp;#039;,&amp;#039;100%&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;text-align&amp;#039;,args[&amp;#039;footnotes_align&amp;#039;])&lt;br /&gt;
				:wikitext(args[&amp;#039;footnotes&amp;#039;])&lt;br /&gt;
		else&lt;br /&gt;
			innercell:wikitext(args[&amp;#039;ref&amp;#039;])		&lt;br /&gt;
			innercell:wikitext(args[&amp;#039;footnotes&amp;#039;])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function process_args()&lt;br /&gt;
	-- compute the number of levels and track unsupported parameters&lt;br /&gt;
	local maxnum = 0&lt;br /&gt;
	newargs = {}&lt;br /&gt;
	for k, v in pairs( args ) do&lt;br /&gt;
		if (k and type(k) == &amp;#039;number&amp;#039; or &lt;br /&gt;
			(type(k) == &amp;#039;string&amp;#039; and (tonumber(k) or 0) &amp;gt; 0)) then&lt;br /&gt;
			if tonumber(k) &amp;gt; maxnum then&lt;br /&gt;
				maxnum = k&lt;br /&gt;
			end&lt;br /&gt;
		elseif (k and type(k) == &amp;#039;string&amp;#039;) then&lt;br /&gt;
			if k:find(&amp;#039;^r_[1-9][0-9]*$&amp;#039;) then&lt;br /&gt;
				args[k] = nil&lt;br /&gt;
				k = mw.ustring.gsub(k, &amp;#039;^r_([1-9][0-9]*)$&amp;#039;, &amp;#039;%1&amp;#039;)&lt;br /&gt;
				k = tonumber(k)&lt;br /&gt;
				if k &amp;gt; maxnum then&lt;br /&gt;
					maxnum = k&lt;br /&gt;
				end&lt;br /&gt;
				newargs[k] = v&lt;br /&gt;
			else&lt;br /&gt;
				checkparameters(k)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for k,v in pairs(newargs) do&lt;br /&gt;
		args[k] = v&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- limit the number of levels&lt;br /&gt;
	maxnum = (maxnum &amp;gt; 1023) and 1023 or maxnum&lt;br /&gt;
	&lt;br /&gt;
	local levels = math.ceil(math.log(maxnum+1)/math.log(2))&lt;br /&gt;
	local cells  = math.pow(2, levels) - 1&lt;br /&gt;
	&lt;br /&gt;
	-- &amp;quot;fill in&amp;quot; missing boxes&lt;br /&gt;
	for k=cells,2,-1 do&lt;br /&gt;
		local j = math.floor(k/2)&lt;br /&gt;
		if args[k] and args[k] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			if args[j] == nil or args[j] == &amp;#039;&amp;#039; then&lt;br /&gt;
				args[j] = &amp;#039; &amp;#039; -- single space&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return cells, levels&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.list( frame )&lt;br /&gt;
	local colors = {&amp;#039;#fcc&amp;#039;, &amp;#039;silver&amp;#039;, &amp;#039;#ffc&amp;#039;, &amp;#039;#bfc&amp;#039;, &amp;#039;#9fe&amp;#039;, &amp;#039;#ffc&amp;#039;, &amp;#039;#bfc&amp;#039;, &amp;#039;#9fe&amp;#039;}&lt;br /&gt;
	local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
	args = getArgs(frame)&lt;br /&gt;
&lt;br /&gt;
	-- inner style&lt;br /&gt;
	local style = float_style() .. (args[&amp;#039;style&amp;#039;] or &amp;#039;&amp;#039;) &lt;br /&gt;
	&lt;br /&gt;
	-- compute number of levels and cells and add empty cells&lt;br /&gt;
	local cells, levels = process_args()&lt;br /&gt;
	&lt;br /&gt;
	-- add a collapsing outer container if required&lt;br /&gt;
	local res = mw.html.create(&amp;#039;&amp;#039;)&lt;br /&gt;
	add_outer_container(res)&lt;br /&gt;
&lt;br /&gt;
	-- add content before the table if required&lt;br /&gt;
	add_headnotes()&lt;br /&gt;
	&lt;br /&gt;
	-- build the inner div&lt;br /&gt;
	local root = innercell:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
	root:addClass(&amp;#039;treeview&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;font-size&amp;#039;, innerfs)&lt;br /&gt;
		:css(&amp;#039;text-align&amp;#039;, &amp;#039;left&amp;#039;)&lt;br /&gt;
		:cssText(style)&lt;br /&gt;
&lt;br /&gt;
	rows[1] = root:tag(&amp;#039;ul&amp;#039;):tag(&amp;#039;li&amp;#039;)&lt;br /&gt;
	crows = {}&lt;br /&gt;
	local cellnum = 0&lt;br /&gt;
	for l = 1,levels do&lt;br /&gt;
		local levelstyle = args[&amp;#039;boxstyle_&amp;#039; .. l] or &amp;#039;&amp;#039;&lt;br /&gt;
		if args[&amp;#039;boxstyle&amp;#039;] and args[&amp;#039;boxstyle&amp;#039;] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			levelstyle = args[&amp;#039;boxstyle&amp;#039;] .. &amp;#039;;&amp;#039; .. levelstyle&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local cellsk = math.pow(2,l-1)&lt;br /&gt;
		local offset = 1&lt;br /&gt;
		for k = 1,cellsk do&lt;br /&gt;
			cellnum = cellnum + 1&lt;br /&gt;
			&lt;br /&gt;
			-- cell&lt;br /&gt;
			if args[cellnum] then&lt;br /&gt;
				rows[k]&lt;br /&gt;
					:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
					:css(&amp;#039;background-color&amp;#039;, colors[l])&lt;br /&gt;
					:cssText(levelstyle)&lt;br /&gt;
					:wikitext(cellnum .. &amp;#039;. &amp;#039; .. args[cellnum])&lt;br /&gt;
				local ul&lt;br /&gt;
				if args[2*cellnum] or args[2*cellnum + 1] then&lt;br /&gt;
					ul = rows[k]:tag(&amp;#039;ul&amp;#039;)&lt;br /&gt;
				end&lt;br /&gt;
				if args[2*cellnum] then&lt;br /&gt;
					crows[2*(k-1) + 1] = ul:tag(&amp;#039;li&amp;#039;)&lt;br /&gt;
				end&lt;br /&gt;
				if args[2*cellnum + 1] then&lt;br /&gt;
					crows[2*(k-1) + 2] = ul:tag(&amp;#039;li&amp;#039;):addClass(&amp;#039;lastline&amp;#039;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		rows = crows&lt;br /&gt;
		crows = {}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- add content after the table if required&lt;br /&gt;
	add_footnotes()&lt;br /&gt;
	&lt;br /&gt;
	return tostring(res) .. tcats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.chart( frame )&lt;br /&gt;
	local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
	args = getArgs(frame)&lt;br /&gt;
&lt;br /&gt;
	-- right to left?	&lt;br /&gt;
	rtl = (args[&amp;#039;rtl&amp;#039;] and args[&amp;#039;rtl&amp;#039;] ~= &amp;#039;&amp;#039;) and true or false&lt;br /&gt;
&lt;br /&gt;
	-- inner style&lt;br /&gt;
	local style = float_style() .. (args[&amp;#039;style&amp;#039;] or &amp;#039;&amp;#039;) &lt;br /&gt;
	&lt;br /&gt;
	-- compute number of levels and cells and add empty cells&lt;br /&gt;
	local cells, levels = process_args()&lt;br /&gt;
	&lt;br /&gt;
	-- add a collapsing outer container if required&lt;br /&gt;
	local res = mw.html.create(&amp;#039;&amp;#039;)&lt;br /&gt;
	add_outer_container(res)&lt;br /&gt;
&lt;br /&gt;
	-- add content before the table if required&lt;br /&gt;
	add_headnotes()&lt;br /&gt;
	&lt;br /&gt;
	local topbranch = &amp;#039;border-top:#000 solid 1px; border-&amp;#039; .. (rtl and &amp;#039;right&amp;#039; or &amp;#039;left&amp;#039;) .. &amp;#039;:#000 solid 1px;&amp;#039;&lt;br /&gt;
	local botbranch = &amp;#039;border-bottom:#000 solid 1px; border-&amp;#039; .. (rtl and &amp;#039;right&amp;#039; or &amp;#039;left&amp;#039;) .. &amp;#039;:#000 solid 1px;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	-- compute the first and last row number&lt;br /&gt;
	rowbegin = 2*cells+1&lt;br /&gt;
	rowend   = 2*cells+2&lt;br /&gt;
	local cellnum = 0&lt;br /&gt;
	for l = 1,levels do&lt;br /&gt;
		local cellsk = math.pow(2,l-1)&lt;br /&gt;
		local offset = 1&lt;br /&gt;
		for k = 1,cellsk do&lt;br /&gt;
			cellnum = cellnum + 1&lt;br /&gt;
			offset = offset + 2*(math.pow(2,levels-l+1)-1)&lt;br /&gt;
			if args[cellnum] and args[cellnum] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
				rowbegin = (offset &amp;lt; rowbegin) and offset or rowbegin&lt;br /&gt;
				rowend = ((offset+1) &amp;gt; rowend) and (offset+1) or rowend&lt;br /&gt;
			end&lt;br /&gt;
			if args[cellnum] and args[cellnum] == &amp;#039;&amp;#039; then&lt;br /&gt;
				args[cellnum] = nil&lt;br /&gt;
			end&lt;br /&gt;
			offset = offset + 2*(math.pow(2,levels-l+1)-1) + 4&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- build the inner table&lt;br /&gt;
	local root = innercell:tag(&amp;#039;table&amp;#039;)&lt;br /&gt;
	root:css(&amp;#039;border-collapse&amp;#039;, &amp;#039;separate&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;border-spacing&amp;#039;, &amp;#039;0&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;line-height&amp;#039;, &amp;#039;130%&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;font-size&amp;#039;, innerfs)&lt;br /&gt;
		:cssText(style)&lt;br /&gt;
&lt;br /&gt;
	-- initialize the rows with 1 by 1 blank cells&lt;br /&gt;
	for k = rowbegin, (rowend+1) do&lt;br /&gt;
		rows[k] = {}&lt;br /&gt;
		table.insert(rows[k], tostring(mw.html.create(&amp;#039;td&amp;#039;):wikitext(&amp;#039; &amp;#039;)))&lt;br /&gt;
	end&lt;br /&gt;
	-- add a blank row of cells to assist with alignment&lt;br /&gt;
	for k = 1,(3*levels + 1) do&lt;br /&gt;
		table.insert(rows[rowend+1], tostring(mw.html.create(&amp;#039;td&amp;#039;):wikitext(&amp;#039; &amp;#039;)))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local cellnum = 0&lt;br /&gt;
	for l = 1,levels do&lt;br /&gt;
		local levelstyle = args[&amp;#039;boxstyle_&amp;#039; .. l] or &amp;#039;&amp;#039;&lt;br /&gt;
		if args[&amp;#039;boxstyle&amp;#039;] and args[&amp;#039;boxstyle&amp;#039;] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			levelstyle = args[&amp;#039;boxstyle&amp;#039;] .. &amp;#039;;&amp;#039; .. levelstyle&lt;br /&gt;
		end&lt;br /&gt;
		levelstyle = &amp;#039;height:0.5em; padding:0 0.2em;&amp;#039; .. levelstyle&lt;br /&gt;
		levelstyle = &amp;#039;border:&amp;#039; .. (args[&amp;#039;border_&amp;#039; .. l] or args[&amp;#039;border&amp;#039;] or &amp;#039;1&amp;#039;) .. &amp;#039;px solid black;&amp;#039; .. levelstyle&lt;br /&gt;
		&lt;br /&gt;
		local cellsk = math.pow(2,l-1)&lt;br /&gt;
		local offset = 1&lt;br /&gt;
		for k = 1,cellsk do&lt;br /&gt;
			cellnum = cellnum + 1&lt;br /&gt;
			-- top padding&lt;br /&gt;
			addcell(offset, math.pow(2,levels-l+1)-1, (l &amp;lt; levels) and 2 or 4, &amp;#039; &amp;#039;, &amp;#039;background-color:silver&amp;#039;)&lt;br /&gt;
			addcell(offset + math.pow(2,levels-l+1)-1, math.pow(2,levels-l+1)-1, (l &amp;lt; levels) and 2 or 4, &amp;#039; &amp;#039;, &amp;#039;background-color:pink&amp;#039;)&lt;br /&gt;
			-- top branch&lt;br /&gt;
			if l &amp;lt; levels then&lt;br /&gt;
				addcell(offset, math.pow(2,levels-l+1)-2, 1, &amp;#039; &amp;#039;, &amp;#039;background-color:lightblue&amp;#039;)&lt;br /&gt;
				addcell(offset + math.pow(2,levels-l+1)-2, 1, 1, &amp;#039; &amp;#039;, &amp;#039;background-color:lightblue&amp;#039;)&lt;br /&gt;
				addcell(offset + math.pow(2,levels-l+1)-1, math.pow(2,levels-l+1)-1, 1, &amp;#039; &amp;#039;,&lt;br /&gt;
					args[2*cellnum] and topbranch or nil)&lt;br /&gt;
			end&lt;br /&gt;
			offset = offset + 2*(math.pow(2,levels-l+1)-1)&lt;br /&gt;
			-- cell&lt;br /&gt;
			addcell(offset, 2, 4, args[cellnum] or &amp;#039; &amp;#039;, args[cellnum] and levelstyle or nil)&lt;br /&gt;
			if l &amp;lt; levels then&lt;br /&gt;
				addcell(offset, 2, 3 + 4*(levels - l - 1), &amp;#039; &amp;#039;, &amp;#039;background-color:yellow&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
			offset = offset + 2&lt;br /&gt;
			-- bottom padding&lt;br /&gt;
			addcell(offset + math.pow(2,levels-l+1)-1, math.pow(2,levels-l+1)-1, (l &amp;lt; levels) and 2 or 4, &amp;#039; &amp;#039;, &amp;#039;background-color:lime&amp;#039;)&lt;br /&gt;
			addcell(offset, math.pow(2,levels-l+1)-1, (l &amp;lt; levels) and 2 or 4, &amp;#039; &amp;#039;, &amp;#039;background-color:magenta&amp;#039;)&lt;br /&gt;
			-- bottom branch&lt;br /&gt;
			if l &amp;lt; levels then&lt;br /&gt;
				addcell(offset, math.pow(2,levels-l+1)-1, 1, &amp;#039; &amp;#039;, &lt;br /&gt;
					args[2*cellnum+1] and botbranch or nil)&lt;br /&gt;
				addcell(offset + math.pow(2,levels-l+1)-1, math.pow(2,levels-l+1)-1, 1, &amp;#039; &amp;#039;, &amp;#039;background-color:steelblue&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
			offset = offset + 2*(math.pow(2,levels-l+1)-1) + 2&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- finalize the inner table&lt;br /&gt;
	for k = rowbegin, (rowend+1) do&lt;br /&gt;
		root:tag(&amp;#039;tr&amp;#039;):css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;):wikitext(table.concat(rows[k], &amp;#039;&amp;#039;))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- add content after the table if required&lt;br /&gt;
	add_footnotes()&lt;br /&gt;
	&lt;br /&gt;
	return tostring(res) .. tcats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Frietjes</name></author>
	</entry>
</feed>