<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://castrella.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ANavbox_with_columns</id>
	<title>Module:Navbox with columns - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://castrella.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ANavbox_with_columns"/>
	<link rel="alternate" type="text/html" href="https://castrella.com/w/index.php?title=Module:Navbox_with_columns&amp;action=history"/>
	<updated>2026-05-02T13:22:45Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://castrella.com/w/index.php?title=Module:Navbox_with_columns&amp;diff=658&amp;oldid=prev</id>
		<title>Bibbleskit: 1 revision imported: template stuff</title>
		<link rel="alternate" type="text/html" href="https://castrella.com/w/index.php?title=Module:Navbox_with_columns&amp;diff=658&amp;oldid=prev"/>
		<updated>2024-12-30T22:22:56Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported: template stuff&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 15:22, 30 December 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Bibbleskit</name></author>
	</entry>
	<entry>
		<id>https://castrella.com/w/index.php?title=Module:Navbox_with_columns&amp;diff=657&amp;oldid=prev</id>
		<title>Template&gt;Ahecht: Remove code that omitted colspan in the final column (the browser can deal with it). Fix column sorting</title>
		<link rel="alternate" type="text/html" href="https://castrella.com/w/index.php?title=Module:Navbox_with_columns&amp;diff=657&amp;oldid=prev"/>
		<updated>2024-09-21T23:29:23Z</updated>

		<summary type="html">&lt;p&gt;Remove code that omitted colspan in the final column (the browser can deal with it). Fix column sorting&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
local parentCfg = mw.loadData(&amp;#039;Module:Navbox/configuration&amp;#039;)&lt;br /&gt;
local thisCfg = mw.loadData(&amp;#039;Module:Navbox with columns/configuration&amp;#039;)&lt;br /&gt;
local cfg = {}&lt;br /&gt;
for k, v in pairs(thisCfg) do&lt;br /&gt;
	if type(v) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		cfg[k] = {}&lt;br /&gt;
		if type(parentCfg[k]) == &amp;#039;table&amp;#039; then&lt;br /&gt;
			for kk, vv in pairs(parentCfg[k]) do cfg[k][kk] = vv end&lt;br /&gt;
		end&lt;br /&gt;
		for kk, vv in pairs(v) do cfg[k][kk] = vv end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
local inArray = require(&amp;quot;Module:TableTools&amp;quot;).inArray&lt;br /&gt;
local getArgs -- lazily initialized&lt;br /&gt;
&lt;br /&gt;
-- helper functions&lt;br /&gt;
local andnum = function(s, n) return string.format(cfg.arg[s..&amp;#039;_and_num&amp;#039;], n) end&lt;br /&gt;
	&lt;br /&gt;
local isblank = function(v) return (v or &amp;#039;&amp;#039;) == &amp;#039;&amp;#039; end&lt;br /&gt;
&lt;br /&gt;
local function concatstrings(s)&lt;br /&gt;
	local r = table.concat(s, &amp;#039;&amp;#039;)&lt;br /&gt;
	if r:match(&amp;#039;^%s*$&amp;#039;) then return nil end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
local function concatstyles(s)&lt;br /&gt;
	local r = &amp;#039;&amp;#039;&lt;br /&gt;
	for _, v in ipairs(s) do&lt;br /&gt;
		v = mw.text.trim(v, &amp;quot;%s;&amp;quot;)&lt;br /&gt;
		if not isblank(v) then r = r .. v .. &amp;#039;;&amp;#039; end&lt;br /&gt;
	end&lt;br /&gt;
	if isblank(r) then return nil end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
local function getSubgroup(args, listnum, listText, prefix)&lt;br /&gt;
	local subArgs = {&lt;br /&gt;
		[cfg.arg.border] = cfg.keyword.border_subgroup,&lt;br /&gt;
		[cfg.arg.navbar] = cfg.keyword.navbar_plain&lt;br /&gt;
	}&lt;br /&gt;
	local hasSubArgs = false&lt;br /&gt;
	local subgroups = prefix and {prefix} or cfg.keyword.subgroups&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		k = tostring(k)&lt;br /&gt;
		for _, w in ipairs(subgroups) do&lt;br /&gt;
			w = w .. listnum .. &amp;quot;_&amp;quot;&lt;br /&gt;
			if (#k &amp;gt; #w) and (k:sub(1, #w) == w) then&lt;br /&gt;
				subArgs[k:sub(#w + 1)] = v&lt;br /&gt;
				hasSubArgs = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return hasSubArgs and p._navbox(subArgs) or listText&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Main functions&lt;br /&gt;
p._navbox = require(&amp;#039;Module:Navbox&amp;#039;)._navbox&lt;br /&gt;
&lt;br /&gt;
function p._withColumns(pargs)&lt;br /&gt;
	-- table for args passed to navbox&lt;br /&gt;
	local targs = {}&lt;br /&gt;
	&lt;br /&gt;
	-- tables of column numbers&lt;br /&gt;
	local colheadernums = {}&lt;br /&gt;
	local colnums = {}&lt;br /&gt;
	local colfooternums = {}&lt;br /&gt;
	&lt;br /&gt;
	-- process args&lt;br /&gt;
	local passthrough = {&lt;br /&gt;
		[cfg.arg.above]=true,[cfg.arg.aboveclass]=true,[cfg.arg.abovestyle]=true,&lt;br /&gt;
		[cfg.arg.basestyle]=true,&lt;br /&gt;
		[cfg.arg.below]=true,[cfg.arg.belowclass]=true,[cfg.arg.belowstyle]=true,&lt;br /&gt;
		[cfg.arg.bodyclass]=true,&lt;br /&gt;
		[cfg.arg.evenstyle]=true,&lt;br /&gt;
		[cfg.arg.groupclass]=true,[cfg.arg.groupstyle]=true,&lt;br /&gt;
		[cfg.arg.image]=true,[cfg.arg.imageclass]=true,[cfg.arg.imagestyle]=true,&lt;br /&gt;
		[cfg.arg.imageleft]=true,[cfg.arg.imageleftstyle]=true,&lt;br /&gt;
		[cfg.arg.listclass]=true,[cfg.arg.liststyle]=true,&lt;br /&gt;
		[cfg.arg.name]=true,&lt;br /&gt;
		[cfg.arg.navbar]=true,&lt;br /&gt;
		[cfg.arg.oddstyle]=true,&lt;br /&gt;
		[cfg.arg.state]=true,&lt;br /&gt;
		[cfg.arg.title]=true,[cfg.arg.titleclass]=true,[cfg.arg.titlestyle]=true,&lt;br /&gt;
	}&lt;br /&gt;
	for k,v in pairs(pargs) do&lt;br /&gt;
		if passthrough[k] then&lt;br /&gt;
			targs[k] = v&lt;br /&gt;
		elseif type(k) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			if k:match(cfg.pattern.listnum) then&lt;br /&gt;
				local n = k:match(cfg.pattern.listnum)&lt;br /&gt;
				targs[andnum(&amp;#039;liststyle&amp;#039;, n + 2)] = pargs[andnum(&amp;#039;liststyle&amp;#039;, n)]&lt;br /&gt;
				targs[andnum(&amp;#039;group&amp;#039;, n + 2)] = pargs[andnum(&amp;#039;group&amp;#039;, n)]&lt;br /&gt;
				targs[andnum(&amp;#039;groupstyle&amp;#039;, n + 2)] = pargs[andnum(&amp;#039;groupstyle&amp;#039;, n)]&lt;br /&gt;
				if v and inArray(cfg.keyword.subgroups, v) then&lt;br /&gt;
					targs[andnum(&amp;#039;list&amp;#039;, n + 2)] = getSubgroup(pargs, n, v)&lt;br /&gt;
				else&lt;br /&gt;
					targs[andnum(&amp;#039;list&amp;#039;, n + 2)] = v&lt;br /&gt;
				end&lt;br /&gt;
			elseif (k:match(cfg.pattern.colheadernum) and v ~= &amp;#039;&amp;#039;) then&lt;br /&gt;
				table.insert(colheadernums, tonumber(k:match(cfg.pattern.colheadernum)))&lt;br /&gt;
			elseif (k:match(cfg.pattern.colnum) and v ~= &amp;#039;&amp;#039;) then&lt;br /&gt;
				table.insert(colnums,  tonumber(k:match(cfg.pattern.colnum)))&lt;br /&gt;
			elseif (k:match(cfg.pattern.colfooternum) and v ~= &amp;#039;&amp;#039;) then&lt;br /&gt;
				table.insert(colfooternums,  tonumber(k:match(cfg.pattern.colfooternum)))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(colheadernums)&lt;br /&gt;
	table.sort(colnums)&lt;br /&gt;
	table.sort(colfooternums)&lt;br /&gt;
		&lt;br /&gt;
	-- HTML table for list1&lt;br /&gt;
	local coltable = mw.html.create( &amp;#039;table&amp;#039; ):attr(&amp;#039;class&amp;#039;, &amp;#039;navbox-columns-table&amp;#039;)&lt;br /&gt;
	local row, col&lt;br /&gt;
	&lt;br /&gt;
	local tablestyle = ( (#colheadernums &amp;gt; 0) or (not isblank(pargs[cfg.arg.fullwidth])) )&lt;br /&gt;
		and &amp;#039;width:100%&amp;#039;&lt;br /&gt;
		or &amp;#039;width:auto; margin-left:auto; margin-right:auto&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	coltable:attr(&amp;#039;style&amp;#039;, concatstyles({&lt;br /&gt;
		&amp;#039;border-spacing: 0px; text-align:left&amp;#039;,&lt;br /&gt;
		tablestyle,&lt;br /&gt;
		pargs[cfg.arg.coltablestyle] or &amp;#039;&amp;#039;&lt;br /&gt;
	}))&lt;br /&gt;
	&lt;br /&gt;
	--- Header row ---&lt;br /&gt;
	if (#colheadernums &amp;gt; 0) then&lt;br /&gt;
		row = coltable:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
		for k, n in ipairs(colheadernums) do&lt;br /&gt;
			col = row:tag(&amp;#039;td&amp;#039;):attr(&amp;#039;class&amp;#039;, &amp;#039;navbox-abovebelow&amp;#039;)&lt;br /&gt;
			col:attr(&amp;#039;style&amp;#039;, concatstyles({&lt;br /&gt;
				(k &amp;gt; 1) and &amp;#039;border-left:2px solid #fdfdfd&amp;#039; or &amp;#039;&amp;#039;,&lt;br /&gt;
				&amp;#039;font-weight:bold&amp;#039;,&lt;br /&gt;
				pargs[cfg.arg.colheaderstyle] or &amp;#039;&amp;#039;,&lt;br /&gt;
				pargs[andnum(&amp;#039;colheaderstyle&amp;#039;, n)] or &amp;#039;&amp;#039;&lt;br /&gt;
			}))&lt;br /&gt;
			if tonumber(pargs[andnum(&amp;#039;colheadercolspan&amp;#039;, n)]) then&lt;br /&gt;
				col:attr(&amp;#039;colspan&amp;#039;, pargs[andnum(&amp;#039;colheadercolspan&amp;#039;, n)])&lt;br /&gt;
			end&lt;br /&gt;
			col:wikitext(pargs[andnum(&amp;#039;colheader&amp;#039;, n)])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--- Main columns ---&lt;br /&gt;
	row = coltable:tag(&amp;#039;tr&amp;#039;):attr(&amp;#039;style&amp;#039;, &amp;#039;vertical-align:top&amp;#039;)&lt;br /&gt;
	for k, n in ipairs(colnums) do&lt;br /&gt;
		if k == 1 and isblank(pargs[andnum(&amp;#039;colheader&amp;#039;, 1)])&lt;br /&gt;
				and isblank(pargs[andnum(&amp;#039;colfooter&amp;#039;, 1)])&lt;br /&gt;
				and isblank(pargs[cfg.arg.fullwidth]) then&lt;br /&gt;
			local nopad = inArray(&lt;br /&gt;
				{&amp;#039;off&amp;#039;, &amp;#039;0&amp;#039;, &amp;#039;0em&amp;#039;, &amp;#039;0px&amp;#039;},&lt;br /&gt;
				mw.ustring.gsub(pargs[cfg.arg.padding] or &amp;#039;&amp;#039;, &amp;#039;[;%%]&amp;#039;, &amp;#039;&amp;#039;))&lt;br /&gt;
			if not nopad then&lt;br /&gt;
				row:tag(&amp;#039;td&amp;#039;):wikitext(&amp;#039;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;#039;)&lt;br /&gt;
					:attr(&amp;#039;style&amp;#039;, &amp;#039;width:&amp;#039;..(pargs[cfg.arg.padding] or &amp;#039;5em&amp;#039;)..&amp;#039;;&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		col = row:tag(&amp;#039;td&amp;#039;):attr(&amp;#039;class&amp;#039;, &amp;#039;navbox-list&amp;#039;)&lt;br /&gt;
		col:attr(&amp;#039;style&amp;#039;, concatstyles({&lt;br /&gt;
			(k &amp;gt; 1) and &amp;#039;border-left:2px solid #fdfdfd&amp;#039; or &amp;#039;&amp;#039;,&lt;br /&gt;
			&amp;#039;padding:0px&amp;#039;,&lt;br /&gt;
			pargs[cfg.arg.colstyle] or &amp;#039;&amp;#039;,&lt;br /&gt;
			((n%2 == 0) and pargs[cfg.arg.evencolstyle] or pargs[cfg.arg.oddcolstyle]) or &amp;#039;&amp;#039;,&lt;br /&gt;
			pargs[andnum(&amp;#039;colstyle&amp;#039;, n)] or &amp;#039;&amp;#039;,&lt;br /&gt;
			&amp;#039;width:&amp;#039; .. (pargs[andnum(&amp;#039;colwidth&amp;#039;, n)] or pargs[cfg.arg.colwidth] or &amp;#039;10em&amp;#039;)&lt;br /&gt;
		}))&lt;br /&gt;
		local wt = pargs[andnum(&amp;#039;col&amp;#039;, n)]&lt;br /&gt;
		if wt and inArray(cfg.keyword.subgroups, wt) then&lt;br /&gt;
			local prefix = mw.ustring.gsub(cfg.arg.col_and_num,&amp;quot;%%d&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
			wt = getSubgroup(pargs, n, wt, prefix)&lt;br /&gt;
		end&lt;br /&gt;
		col:tag(&amp;#039;div&amp;#039;):newline():wikitext(wt):newline()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--- Footer row ---&lt;br /&gt;
	if (#colfooternums &amp;gt; 0) then&lt;br /&gt;
		row = coltable:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
		for k, n in ipairs(colfooternums) do&lt;br /&gt;
			col = row:tag(&amp;#039;td&amp;#039;):attr(&amp;#039;class&amp;#039;, &amp;#039;navbox-abovebelow&amp;#039;)&lt;br /&gt;
			col:attr(&amp;#039;style&amp;#039;, concatstyles({&lt;br /&gt;
				(k &amp;gt; 1) and &amp;#039;border-left:2px solid #fdfdfd&amp;#039; or &amp;#039;&amp;#039;,&lt;br /&gt;
				&amp;#039;font-weight:bold&amp;#039;,&lt;br /&gt;
				pargs[cfg.arg.colfooterstyle] or &amp;#039;&amp;#039;,&lt;br /&gt;
				pargs[andnum(&amp;#039;colfooterstyle&amp;#039;, n)] or &amp;#039;&amp;#039;&lt;br /&gt;
			}))&lt;br /&gt;
			if tonumber(pargs[andnum(&amp;#039;colfootercolspan&amp;#039;, n)]) then&lt;br /&gt;
				col:attr(&amp;#039;colspan&amp;#039;, pargs[andnum(&amp;#039;colfootercolspan&amp;#039;, n)])&lt;br /&gt;
			end&lt;br /&gt;
			col:wikitext(pargs[andnum(&amp;#039;colfooter&amp;#039;, n)])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- assign table to list1&lt;br /&gt;
	targs[andnum(&amp;#039;list&amp;#039;, 1)] = tostring(coltable)&lt;br /&gt;
	if isblank(pargs[andnum(&amp;#039;colheader&amp;#039;, 1)]) &lt;br /&gt;
			and isblank(pargs[andnum(&amp;#039;col&amp;#039;, 1)])&lt;br /&gt;
			and isblank(pargs[andnum(&amp;#039;colfooter&amp;#039;, 1)]) then&lt;br /&gt;
		targs[andnum(&amp;#039;list&amp;#039;, 1)] = targs[andnum(&amp;#039;list&amp;#039;, 1)] ..&lt;br /&gt;
			&amp;#039;[[&amp;#039; .. cfg.pattern.without_first_col .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Other parameters&lt;br /&gt;
	targs[cfg.arg.border] = pargs[cfg.arg.border] or pargs[1]&lt;br /&gt;
	targs[cfg.arg.evenodd] = (not isblank(pargs[cfg.arg.evenodd])) and pargs[cfg.arg.evenodd] or nil&lt;br /&gt;
	targs[cfg.arg.list1padding] = &amp;#039;0px&amp;#039;&lt;br /&gt;
	targs[andnum(&amp;#039;liststyle&amp;#039;, 1)] = &amp;#039;background:transparent;color:inherit;&amp;#039;&lt;br /&gt;
	targs[cfg.arg.style] = concatstyles({pargs[cfg.arg.style], pargs[cfg.arg.bodystyle]})&lt;br /&gt;
	targs[cfg.arg.tracking] = &amp;#039;no&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	return p._navbox(targs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Template entry points&lt;br /&gt;
function p.navbox (frame, boxtype)&lt;br /&gt;
	local function readArgs(args, prefix)&lt;br /&gt;
		-- Read the arguments in the order they&amp;#039;ll be output in, to make references&lt;br /&gt;
		-- number in the right order.&lt;br /&gt;
		local _&lt;br /&gt;
		_ = args[prefix .. cfg.arg.title]&lt;br /&gt;
		_ = args[prefix .. cfg.arg.above]&lt;br /&gt;
		-- Limit this to 20 as covering &amp;#039;most&amp;#039; cases (that&amp;#039;s a SWAG) and because&lt;br /&gt;
		-- iterator approach won&amp;#039;t work here&lt;br /&gt;
		for i = 1, 20 do&lt;br /&gt;
			_ = args[prefix .. andnum(&amp;#039;group&amp;#039;, i)]&lt;br /&gt;
			if inArray(cfg.keyword.subgroups, args[prefix .. andnum(&amp;#039;list&amp;#039;, i)]) then&lt;br /&gt;
				for _, v in ipairs(cfg.keyword.subgroups) do&lt;br /&gt;
					readArgs(args, prefix .. v .. i .. &amp;quot;_&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		_ = args[prefix .. cfg.arg.below]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not getArgs then&lt;br /&gt;
		getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
	end&lt;br /&gt;
	local args = getArgs(frame, {wrappers = {cfg.pattern[boxtype or &amp;#039;navbox&amp;#039;]}})&lt;br /&gt;
	readArgs(args, &amp;quot;&amp;quot;)&lt;br /&gt;
	return p[&amp;#039;_&amp;#039;..(boxtype or &amp;#039;navbox&amp;#039;)](args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&amp;#039;with columns&amp;#039;] = function (frame)&lt;br /&gt;
	return p.navbox(frame, &amp;#039;withColumns&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local q = {}&lt;br /&gt;
q._navbox = p._withColumns&lt;br /&gt;
q.navbox = p[&amp;#039;with columns&amp;#039;]&lt;br /&gt;
return q&lt;/div&gt;</summary>
		<author><name>Template&gt;Ahecht</name></author>
	</entry>
</feed>