<?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%3ASandbox%2F%CE%A7%2FInfoboxMaker</id>
	<title>Module:Sandbox/Χ/InfoboxMaker - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2F%CE%A7%2FInfoboxMaker"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/%CE%A7/InfoboxMaker&amp;action=history"/>
	<updated>2026-08-03T10:01:04Z</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:Sandbox/%CE%A7/InfoboxMaker&amp;diff=146660&amp;oldid=prev</id>
		<title>imported&gt;Χ at 09:40, 17 September 2018</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/%CE%A7/InfoboxMaker&amp;diff=146660&amp;oldid=prev"/>
		<updated>2018-09-17T09:40:20Z</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;local ga = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local tt = require(&amp;#039;Module:TableTools&amp;#039;)&lt;br /&gt;
local ib = require(&amp;#039;Module:Infobox&amp;#039;).infobox&lt;br /&gt;
local ii = require(&amp;#039;Module:InfoboxImage&amp;#039;).InfoboxImage&lt;br /&gt;
&lt;br /&gt;
local origArgs			-- Args received from the the initalizing module.&lt;br /&gt;
local ibArgs     = {}	-- Args sent to Module:Infobox&lt;br /&gt;
local categories = {}	-- Categories appended to the Infobox&lt;br /&gt;
local counter = {&lt;br /&gt;
	row = 1,&lt;br /&gt;
	subheader = 1,&lt;br /&gt;
	image = 1,&lt;br /&gt;
}&lt;br /&gt;
local params = {&lt;br /&gt;
	global = {&lt;br /&gt;
		&amp;#039;child&amp;#039;,		-- properties&lt;br /&gt;
		&amp;#039;subbox&amp;#039;,&lt;br /&gt;
		&amp;#039;name&amp;#039;,&lt;br /&gt;
		&amp;#039;italic title&amp;#039;,&lt;br /&gt;
		&amp;#039;decat&amp;#039;,&lt;br /&gt;
		&amp;#039;bodyclass&amp;#039;,	-- classes&lt;br /&gt;
		&amp;#039;titleclass&amp;#039;,&lt;br /&gt;
		&amp;#039;aboveclass&amp;#039;,&lt;br /&gt;
		&amp;#039;subheaderclass&amp;#039;,&lt;br /&gt;
		&amp;#039;imageclass&amp;#039;,&lt;br /&gt;
		&amp;#039;headerclass&amp;#039;,&lt;br /&gt;
		&amp;#039;belowclass&amp;#039;,&lt;br /&gt;
		&amp;#039;bodystyle&amp;#039;,	-- styles&lt;br /&gt;
		&amp;#039;titlestyle&amp;#039;,&lt;br /&gt;
		&amp;#039;abovestyle&amp;#039;,&lt;br /&gt;
		&amp;#039;subheaderstyle&amp;#039;,&lt;br /&gt;
		&amp;#039;captionstyle&amp;#039;,&lt;br /&gt;
		&amp;#039;imagestyle&amp;#039;,&lt;br /&gt;
		&amp;#039;headerstyle&amp;#039;,&lt;br /&gt;
		&amp;#039;labelstyle&amp;#039;,&lt;br /&gt;
		&amp;#039;datastyle&amp;#039;,&lt;br /&gt;
		&amp;#039;belowstyle&amp;#039;,&lt;br /&gt;
	},&lt;br /&gt;
	row = {&lt;br /&gt;
		&amp;#039;header&amp;#039;,&lt;br /&gt;
		&amp;#039;label&amp;#039;,&lt;br /&gt;
		&amp;#039;data&amp;#039;,&lt;br /&gt;
		&amp;#039;class&amp;#039;,&lt;br /&gt;
		&amp;#039;rowclass&amp;#039;,&lt;br /&gt;
		&amp;#039;rowstyle&amp;#039;,&lt;br /&gt;
		&amp;#039;rowcellstyle&amp;#039;,&lt;br /&gt;
		&amp;#039;dataid&amp;#039;,&lt;br /&gt;
		&amp;#039;labelid&amp;#039;,&lt;br /&gt;
		&amp;#039;headerid&amp;#039;,&lt;br /&gt;
		&amp;#039;rowid&amp;#039;,&lt;br /&gt;
	},&lt;br /&gt;
	subheader = {&lt;br /&gt;
		&amp;#039;subheader&amp;#039;,&lt;br /&gt;
		&amp;#039;subheaderrowclass&amp;#039;,&lt;br /&gt;
		&amp;#039;subheaderstyle&amp;#039;,&lt;br /&gt;
	},&lt;br /&gt;
	image = {&lt;br /&gt;
		&amp;#039;image&amp;#039;,&lt;br /&gt;
		&amp;#039;size&amp;#039;,&lt;br /&gt;
		&amp;#039;maxsize&amp;#039;,&lt;br /&gt;
		&amp;#039;sizedefault&amp;#039;,&lt;br /&gt;
		&amp;#039;alt&amp;#039;,&lt;br /&gt;
		&amp;#039;border&amp;#039;,&lt;br /&gt;
		&amp;#039;suppressplaceholder&amp;#039;,&lt;br /&gt;
		&amp;#039;imagerowclass&amp;#039;,&lt;br /&gt;
		&amp;#039;caption&amp;#039;,&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local functions = {&lt;br /&gt;
	[&amp;#039;or&amp;#039;] =	function (x)&lt;br /&gt;
					if type(x) ~= table then return x end&lt;br /&gt;
					for _, v in pairs(x) do&lt;br /&gt;
						if not isEmpty(v) then return v end&lt;br /&gt;
					end&lt;br /&gt;
				end,&lt;br /&gt;
	[&amp;#039;ul&amp;#039;] =	function (x)&lt;br /&gt;
					if type(x) ~= table then return x end&lt;br /&gt;
					local l = mw.html.create(&amp;#039;ul&amp;#039;)&lt;br /&gt;
					for _, v in pairs(x) do&lt;br /&gt;
						if not isEmpty(v) then l:tag(&amp;#039;li&amp;#039;):wikitext(v) end&lt;br /&gt;
					end&lt;br /&gt;
					return l&lt;br /&gt;
				end,&lt;br /&gt;
	[&amp;#039;ol&amp;#039;] =	function (x)&lt;br /&gt;
					if type(x) ~= table then return x end&lt;br /&gt;
					local l = mw.html.create(&amp;#039;ol&amp;#039;)&lt;br /&gt;
					for _, v in pairs(x) do&lt;br /&gt;
						if not isEmpty(v) then l:tag(&amp;#039;li&amp;#039;):wikitext(v) end&lt;br /&gt;
					end&lt;br /&gt;
					return l&lt;br /&gt;
				end,&lt;br /&gt;
	___ =		function (x) return type(x) == &amp;#039;table&amp;#039; and x[1] or x end&lt;br /&gt;
}&lt;br /&gt;
setmetatable(functions, {__index = function (t) return t.___ end})&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
------------------------------- Helper functions -------------------------------&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- Checks whether x is nil, empty or false&lt;br /&gt;
--]]&lt;br /&gt;
local function isEmpty(x)&lt;br /&gt;
	return x == nil or x == &amp;#039;&amp;#039; or x == false or (type(x) == &amp;#039;table&amp;#039; and tt.size(x) == 0)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- Transforms x into a table&lt;br /&gt;
--]]&lt;br /&gt;
function totable(x)&lt;br /&gt;
	return type(x) == &amp;#039;table&amp;#039; and x or {x}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- Replaces one or multiple arguments with their associated value in origArgs.&lt;br /&gt;
-- There is an optional &amp;quot;n&amp;quot; suffix, intended to be a number.&lt;br /&gt;
--]]&lt;br /&gt;
local function argToVal(args, n)&lt;br /&gt;
	n = n and tostring(n) or &amp;quot;&amp;quot;&lt;br /&gt;
	if type(args) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		if n == &amp;#039;1&amp;#039; then&lt;br /&gt;
			for i, v in pairs(args) do&lt;br /&gt;
				args[i] = origArgs[v .. &amp;#039;1&amp;#039;] or origArgs[v]&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			for i, v in pairs(args) do&lt;br /&gt;
				args[i] = origArgst[v .. n]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	elseif type(args) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		if n == &amp;#039;1&amp;#039; then&lt;br /&gt;
			args = origArgs[args .. &amp;#039;1&amp;#039;] or origArgs[args]&lt;br /&gt;
		else&lt;br /&gt;
			args = origArgs[args .. n]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- Used to build &amp;quot;repeated&amp;quot; things.&lt;br /&gt;
-- Filters out values and arguments using their indices.&lt;br /&gt;
--]]&lt;br /&gt;
function filter(args, params, valIndex, argIndex)&lt;br /&gt;
	local newArgs = {}&lt;br /&gt;
	for _, param in ipairs(params) do&lt;br /&gt;
		local paramArg = args[param .. &amp;quot;Arg&amp;quot;]&lt;br /&gt;
		local paramVal = args[param]&lt;br /&gt;
		local default&lt;br /&gt;
		if type(paramVal) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
			default = paramVal&lt;br /&gt;
			paramVal = {}&lt;br /&gt;
		end&lt;br /&gt;
		newArgs[param] = paramVal[valIndex] or argToVal(paramArg, argIndex) or default&lt;br /&gt;
		newArgs[param .. &amp;quot;Func&amp;quot;] = args[param .. &amp;quot;Func&amp;quot;]&lt;br /&gt;
	end&lt;br /&gt;
	return newArgs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- Sets up unique elements like title, above, below, etc.&lt;br /&gt;
--]]&lt;br /&gt;
local function uniqueElement(prefix, args)&lt;br /&gt;
	if type(args) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
		ibArgs[prefix] = args or ibArgs[prefix]&lt;br /&gt;
	else&lt;br /&gt;
		ibArgs[prefix]            = args[prefix] or ibArgs[prefix]&lt;br /&gt;
		ibArgs[prefix .. &amp;#039;class&amp;#039;] = args.class or args[prefix .. &amp;#039;class&amp;#039;] or ibArgs[prefix .. &amp;#039;class&amp;#039;]&lt;br /&gt;
		ibArgs[prefix .. &amp;#039;style&amp;#039;] = args.style or args[prefix .. &amp;#039;style&amp;#039;] or ibArgs[prefix .. &amp;#039;style&amp;#039;]&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- Sets up incremental elements like images, subheader, and data rows&lt;br /&gt;
-- Optional n parameter.&lt;br /&gt;
--]]&lt;br /&gt;
function addElement(elem, args, n)&lt;br /&gt;
	local i&lt;br /&gt;
	if n == nil then&lt;br /&gt;
		i = tostring(counter[elem])&lt;br /&gt;
		counter[elem] = counter[elem] + 1&lt;br /&gt;
	else&lt;br /&gt;
		i = tostring(n)&lt;br /&gt;
	end&lt;br /&gt;
	for _, param in ipairs(params[elem]) do&lt;br /&gt;
		local func  = args[param .. &amp;quot;Func&amp;quot;]&lt;br /&gt;
		if type(func) ~= &amp;#039;function&amp;#039; then func = functions[func] end&lt;br /&gt;
		local value = args[param] or argToVal(args[param .. &amp;quot;Arg&amp;quot;])&lt;br /&gt;
		ibArgs[param .. i] = pcall(function () func(value) end) and func(value) or value&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
------------------------------- Member functions -------------------------------&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.initialize(args)&lt;br /&gt;
	-- Modules using InfoboxMaker must first initialize it with a set of args.&lt;br /&gt;
	origArgs = args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- Global styling and class assignments&lt;br /&gt;
--]]&lt;br /&gt;
function p.setup(args)&lt;br /&gt;
	for _, param in ipairs(params.global) do&lt;br /&gt;
		ibArgs[param] = args[param]&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.title(args)&lt;br /&gt;
	uniqueElement(&amp;#039;title&amp;#039;, args)&lt;br /&gt;
end&lt;br /&gt;
function p.above(args)&lt;br /&gt;
	uniqueElement(&amp;#039;above&amp;#039;, args)&lt;br /&gt;
end&lt;br /&gt;
function p.below(args)&lt;br /&gt;
	uniqueElement(&amp;#039;below&amp;#039;, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
--  Adds a single subheader&lt;br /&gt;
--]]&lt;br /&gt;
function p.addSubheader(args)&lt;br /&gt;
	uniqueElement(&amp;#039;subheader&amp;#039;, {class=args.class or args.subheaderclass})&lt;br /&gt;
	addElement(&amp;#039;subheader&amp;#039;, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
--  Adds a single image and caption&lt;br /&gt;
--]]&lt;br /&gt;
function p.addImage(args)&lt;br /&gt;
	uniqueElement(&amp;#039;image&amp;#039;, {&lt;br /&gt;
		class=args.class or args.imageclass,&lt;br /&gt;
		style=args.style or args.imagestyle,&lt;br /&gt;
	})&lt;br /&gt;
	local imgArgs = {}&lt;br /&gt;
	local i = tostring(counter.image)&lt;br /&gt;
	counter.image = counter.image + 1&lt;br /&gt;
	for _, param in ipairs(params.image) do&lt;br /&gt;
		local func  = args[param .. &amp;quot;Func&amp;quot;]&lt;br /&gt;
		if type(func) ~= &amp;#039;function&amp;#039; then func = functions[func] end&lt;br /&gt;
		local value = args[param] or argToVal(args[param .. &amp;quot;Arg&amp;quot;])&lt;br /&gt;
		imgArgs[param] = pcall(function () func(value) end) and func(value) or value&lt;br /&gt;
	end&lt;br /&gt;
	ibArgs[&amp;#039;image&amp;#039; .. i]         = ii{args=imgArgs}&lt;br /&gt;
	ibArgs[&amp;#039;imagerowclass&amp;#039; .. i] = imgArgs.imagerowclass&lt;br /&gt;
	ibArgs[&amp;#039;caption&amp;#039; .. i]       = imgArgs.caption&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
--  Adds a single category&lt;br /&gt;
--]]&lt;br /&gt;
function p.addCategory(catArgs)&lt;br /&gt;
	local name = catArgs.name or &amp;quot;&amp;quot;&lt;br /&gt;
	local key  = catArgs.key  or &amp;quot;&amp;quot;&lt;br /&gt;
	if not isEmpty(name) then&lt;br /&gt;
		if isEmpty(key) then&lt;br /&gt;
			table.insert(categories, &amp;quot;[[Category:&amp;quot; .. name .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(categories, &amp;quot;[[Category:&amp;quot; .. name .. &amp;quot;|&amp;quot; .. key .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
--  Adds a single row&lt;br /&gt;
--]]&lt;br /&gt;
function p.addRow(rowArgs, n)&lt;br /&gt;
	local i&lt;br /&gt;
	if n == nil then&lt;br /&gt;
		i = tostring(counter.row)&lt;br /&gt;
		counter.row = counter.row + 1&lt;br /&gt;
	else&lt;br /&gt;
		i = tostring(n)&lt;br /&gt;
	end&lt;br /&gt;
	for _, param in ipairs(params.row) do&lt;br /&gt;
		local func  = rowArgs[param .. &amp;quot;Func&amp;quot;]&lt;br /&gt;
		if type(func) ~= &amp;#039;function&amp;#039; then func = functions[func] end&lt;br /&gt;
		local value = rowArgs[param] or argToVal(rowArgs[param .. &amp;quot;Arg&amp;quot;])&lt;br /&gt;
		ibArgs[param .. i] = pcall(function () func(value) end) and func(value) or value&lt;br /&gt;
	end&lt;br /&gt;
	if ibArgs[&amp;quot;header&amp;quot; .. i] or ibArgs[&amp;quot;data&amp;quot; .. i] then&lt;br /&gt;
		return true&lt;br /&gt;
	else&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
--  Adds multiple rows. Useful for numbered parameters.&lt;br /&gt;
--]]&lt;br /&gt;
function p.addRepeatedRow(rowArgs)&lt;br /&gt;
	local added = false&lt;br /&gt;
	-- First, determine how many rows will be needed&lt;br /&gt;
	local n = {}&lt;br /&gt;
	local m = 0&lt;br /&gt;
	for _, param in ipairs(params.row) do&lt;br /&gt;
		-- Number of paramArgs&lt;br /&gt;
		local paramArg = totable(rowArgs[param .. &amp;quot;Arg&amp;quot;])&lt;br /&gt;
		for _, prefix in pairs(paramArg) do&lt;br /&gt;
			for _, v in ipairs(tt.affixNums(origArgs, prefix)) do&lt;br /&gt;
				table.insert(n, v)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- Number of paramVals&lt;br /&gt;
		local paramVal = totable(rowArgs[param])&lt;br /&gt;
		m = math.max(m, #paramVal)&lt;br /&gt;
	end&lt;br /&gt;
	if isEmpty(n) then&lt;br /&gt;
		for i=1,m do table.insert(n, i) end&lt;br /&gt;
	else&lt;br /&gt;
		n = tt.removeDuplicates(n)&lt;br /&gt;
		table.sort(n)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Second, actually generate the rows&lt;br /&gt;
	if not isEmpty(n) then&lt;br /&gt;
		for i, j in ipairs(n) do&lt;br /&gt;
			local newRowArgs = filter(rowArgs, params.row, i, j)&lt;br /&gt;
			added = p.addRow(newRowArgs) or added&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return added&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
--  Adds a set of rows. The &amp;quot;first&amp;quot; row is added only if the rest is not empty.&lt;br /&gt;
--  Individual rows can actually be sections, repeated rows, or single rows.&lt;br /&gt;
--  First row must be a single row.&lt;br /&gt;
--]]&lt;br /&gt;
function p.addSection(sectionArgs)&lt;br /&gt;
	local rows  = sectionArgs.rows or {}&lt;br /&gt;
	local first = sectionArgs[1]   or {}&lt;br /&gt;
	local added = false&lt;br /&gt;
	local h = counter.row&lt;br /&gt;
	counter.row = counter.row + 1&lt;br /&gt;
	for _, row in ipairs(rows) do&lt;br /&gt;
		if     row.mode == &amp;#039;section&amp;#039; then&lt;br /&gt;
			added = p.addSection(row) or added&lt;br /&gt;
		elseif row.mode == &amp;#039;repeated&amp;#039;   then&lt;br /&gt;
			added = p.addRepeatedRow(row)    or added&lt;br /&gt;
		else&lt;br /&gt;
			added = p.addRow(row)     or added&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if added then&lt;br /&gt;
		p.addRow(first, h)&lt;br /&gt;
	end&lt;br /&gt;
	return added&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- Adds multiple sections sharing the same definition.&lt;br /&gt;
-- Useful with numbered parameters.&lt;br /&gt;
-- Only single rows are accepted.&lt;br /&gt;
--]]&lt;br /&gt;
function p.addRepeatedSection(sectionArgs)&lt;br /&gt;
	local rows  = sectionArgs.rows or {}&lt;br /&gt;
	local first = sectionArgs[1]   or {}&lt;br /&gt;
	local added = false&lt;br /&gt;
	local added_row = false&lt;br /&gt;
	local h&lt;br /&gt;
	&lt;br /&gt;
	-- First, determine how many rows will be needed&lt;br /&gt;
	local n = {}&lt;br /&gt;
	local m = 0&lt;br /&gt;
	for _, rowArgs in ipairs(rows) do&lt;br /&gt;
		for _, param in ipairs(params.row) do&lt;br /&gt;
			-- Number of paramArgs&lt;br /&gt;
			local paramArg = totable(rowArgs[param .. &amp;quot;Arg&amp;quot;])&lt;br /&gt;
			for _, prefix in pairs(paramArg) do&lt;br /&gt;
				for _, v in ipairs(tt.affixNums(origArgs, prefix)) do&lt;br /&gt;
					table.insert(n, v)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			-- Number of paramVals&lt;br /&gt;
			local paramVal = totable(rowArgs[param])&lt;br /&gt;
			m = math.max(m, #paramVal)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if isEmpty(n) then&lt;br /&gt;
		for i=1,m do table.insert(n, i) end&lt;br /&gt;
	else&lt;br /&gt;
		n = tt.removeDuplicates(n)&lt;br /&gt;
		table.sort(n)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Second, actually generate the rows&lt;br /&gt;
	if not isEmpty(n) then&lt;br /&gt;
		for i, j in ipairs(n) do&lt;br /&gt;
			added_row = false&lt;br /&gt;
			h = counter.row&lt;br /&gt;
			counter.row = counter.row + 1&lt;br /&gt;
			for _, rowArgs in ipairs(rows) do&lt;br /&gt;
				local newRowArgs = filter(rowArgs, params.row, i, j)&lt;br /&gt;
				added_row = p.addRow(newRowArgs) or added&lt;br /&gt;
			end&lt;br /&gt;
			if added_row then&lt;br /&gt;
				local newFirst = filter(first, params.row, i, j)&lt;br /&gt;
				added = p.addRow(newFirst, h) or added_row or added&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return added&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- Generate the infobox! Append categories if any.&lt;br /&gt;
--]]&lt;br /&gt;
function p.makeInfobox()&lt;br /&gt;
	return ib(ibArgs) .. mw.text.listToText(categories, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Χ</name></author>
	</entry>
</feed>