<?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</id>
	<title>Module:Ahnentafel - 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"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Ahnentafel&amp;action=history"/>
	<updated>2026-04-09T13:24:17Z</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&amp;diff=135187&amp;oldid=prev</id>
		<title>imported&gt;Frietjes: use templatestyles, which should reduce the size of the html, still more css that could be migrated to styles.css</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Ahnentafel&amp;diff=135187&amp;oldid=prev"/>
		<updated>2018-10-22T21:41:56Z</updated>

		<summary type="html">&lt;p&gt;use templatestyles, which should reduce the size of the html, still more css that could be migrated to styles.css&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;
-- 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;
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 &lt;br /&gt;
		k == &amp;#039;footnotes&amp;#039; or k == &amp;#039;footnotes_align&amp;#039; or k == &amp;#039;rtl&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;^border_[1-8]$&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;
		rows[r]:tag(&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;
			:cssText(s)&lt;br /&gt;
			:addClass(c)&lt;br /&gt;
			:wikitext(t)&lt;br /&gt;
	end&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;
	local args = getArgs(frame)&lt;br /&gt;
	local align = (args[&amp;#039;align&amp;#039;] or &amp;#039;&amp;#039;):lower()&lt;br /&gt;
	local style = args[&amp;#039;style&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local topbranch = &amp;#039;ahnentafel-t&amp;#039;&lt;br /&gt;
	local botbranch = &amp;#039;ahnentafel-b&amp;#039;&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;
	-- style for floating&lt;br /&gt;
	if (align == &amp;#039;right&amp;#039;) then&lt;br /&gt;
		style = &amp;#039;float:right;&amp;#039; .. style&lt;br /&gt;
	elseif (align == &amp;#039;left&amp;#039;) then&lt;br /&gt;
		style = &amp;#039;float:left;&amp;#039; .. style&lt;br /&gt;
	elseif (align == &amp;#039;center&amp;#039;) then&lt;br /&gt;
		style = &amp;#039;margin-left:auto; margin-right:auto;&amp;#039; .. style&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- compute the number of levels and track unsupported parameters&lt;br /&gt;
	local maxnum = 0&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;
		else&lt;br /&gt;
			if (k and type(k) == &amp;#039;string&amp;#039;) then&lt;br /&gt;
				checkparameters(k)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- limit the number of levels&lt;br /&gt;
	maxnum = (maxnum &amp;gt; 511) and 511 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;
	-- 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;
	-- add a collapsing outer container if required&lt;br /&gt;
	local res = mw.html.create(&amp;#039;&amp;#039;)&lt;br /&gt;
	local innercell = res&lt;br /&gt;
	local innerfs = &amp;#039;88%&amp;#039;&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;
&lt;br /&gt;
	-- add content before the table if required&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;
&lt;br /&gt;
	-- build the inner table&lt;br /&gt;
	local root = innercell:tag(&amp;#039;table&amp;#039;)&lt;br /&gt;
	root:addClass(&amp;#039;ahnentafel&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] = root:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
		rows[k]:tag(&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;
		rows[rowend+1]:tag(&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, 2*(math.pow(2,levels-l+1)-1), (l &amp;lt; levels) and 2 or 4, &amp;#039; &amp;#039;, nil, nil)&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)-1, 1, &amp;#039; &amp;#039;, nil, 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;, nil,&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, 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;, nil, nil)&lt;br /&gt;
			end&lt;br /&gt;
			offset = offset + 2&lt;br /&gt;
			-- bottom padding&lt;br /&gt;
			addcell(offset, 2*(math.pow(2,levels-l+1)-1), (l &amp;lt; levels) and 2 or 4, &amp;#039; &amp;#039;, nil, nil)&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;, nil,&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;, nil, nil)&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;
	-- add content after the table if required&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;
	&lt;br /&gt;
	return frame:extensionTag{ name = &amp;#039;templatestyles&amp;#039;, args = { src = templatestyles} } &lt;br /&gt;
		.. &amp;#039;&amp;lt;div class=&amp;quot;noresize&amp;quot;&amp;gt;&amp;#039; .. tostring(res) .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039; .. 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>