<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.thegoonshow.co.uk/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AInfobox3cols</id>
	<title>Module:Infobox3cols - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.thegoonshow.co.uk/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AInfobox3cols"/>
	<link rel="alternate" type="text/html" href="https://www.thegoonshow.co.uk/wiki/index.php?title=Module:Infobox3cols&amp;action=history"/>
	<updated>2026-05-13T21:37:30Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>https://www.thegoonshow.co.uk/wiki/index.php?title=Module:Infobox3cols&amp;diff=40067&amp;oldid=prev</id>
		<title>Kurt: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://www.thegoonshow.co.uk/wiki/index.php?title=Module:Infobox3cols&amp;diff=40067&amp;oldid=prev"/>
		<updated>2023-02-20T17:02:05Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&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 12:02, 20 February 2023&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>Kurt</name></author>
	</entry>
	<entry>
		<id>https://www.thegoonshow.co.uk/wiki/index.php?title=Module:Infobox3cols&amp;diff=40066&amp;oldid=prev</id>
		<title>en&gt;Izno: update to support finding hlist and plainlist</title>
		<link rel="alternate" type="text/html" href="https://www.thegoonshow.co.uk/wiki/index.php?title=Module:Infobox3cols&amp;diff=40066&amp;oldid=prev"/>
		<updated>2022-12-29T07:01:34Z</updated>

		<summary type="html">&lt;p&gt;update to support finding hlist and plainlist&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local check_for_unknown_parameters = require(&amp;quot;Module:Check for unknown parameters&amp;quot;)._check&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
local args = {}&lt;br /&gt;
local origArgs = {}&lt;br /&gt;
local root&lt;br /&gt;
local lists = {&lt;br /&gt;
	plainlist_t = {&lt;br /&gt;
		patterns = {&lt;br /&gt;
			'^plainlist$',&lt;br /&gt;
			'%splainlist$',&lt;br /&gt;
			'^plainlist%s',&lt;br /&gt;
			'%splainlist%s'&lt;br /&gt;
		},&lt;br /&gt;
		found = false,&lt;br /&gt;
		styles = 'Plainlist/styles.css'&lt;br /&gt;
	},&lt;br /&gt;
	hlist_t = {&lt;br /&gt;
		patterns = {&lt;br /&gt;
			'^hlist$',&lt;br /&gt;
			'%shlist$',&lt;br /&gt;
			'^hlist%s',&lt;br /&gt;
			'%shlist%s'&lt;br /&gt;
		},&lt;br /&gt;
		found = false,&lt;br /&gt;
		styles = 'Hlist/styles.css'&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function has_list_class(args_to_check)&lt;br /&gt;
	for _, list in pairs(lists) do&lt;br /&gt;
		if not list.found then&lt;br /&gt;
			for _, arg in pairs(args_to_check) do&lt;br /&gt;
				for _, pattern in ipairs(list.patterns) do&lt;br /&gt;
					if mw.ustring.find(arg or '', pattern) then&lt;br /&gt;
						list.found = true&lt;br /&gt;
						break&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if list.found then break end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Returns the union of the values of two tables, as a sequence.&lt;br /&gt;
local function union(t1, t2)&lt;br /&gt;
&lt;br /&gt;
	local vals = {}&lt;br /&gt;
	for k, v in pairs(t1) do&lt;br /&gt;
		vals[v] = true&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs(t2) do&lt;br /&gt;
		vals[v] = true&lt;br /&gt;
	end&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for k, v in pairs(vals) do&lt;br /&gt;
		table.insert(ret, k)&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Returns a table containing the numbers of the arguments that exist&lt;br /&gt;
-- for the specified prefix. For example, if the prefix was 'data', and&lt;br /&gt;
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.&lt;br /&gt;
local function getArgNums(prefix, suffix)&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local num = tostring(k):match('^' .. prefix .. '([0-9]%d*)' .. suffix .. '$')&lt;br /&gt;
		if num then table.insert(nums, tonumber(num)) end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(nums)&lt;br /&gt;
	return nums&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Adds a row to the infobox, with either a header cell&lt;br /&gt;
-- or a label/data cell combination.&lt;br /&gt;
local function addRow(rowArgs)&lt;br /&gt;
	if rowArgs.header then&lt;br /&gt;
		has_list_class({rowArgs.rowclass, rowArgs.class, args.headerclass})&lt;br /&gt;
		root&lt;br /&gt;
			:tag('tr')&lt;br /&gt;
				:addClass(rowArgs.rowclass)&lt;br /&gt;
				:cssText(rowArgs.rowstyle)&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:attr('colspan', '4')&lt;br /&gt;
					:addClass('infobox-header')&lt;br /&gt;
					:addClass(rowArgs.class)&lt;br /&gt;
					:addClass(args.headerclass)&lt;br /&gt;
					-- @deprecated next; target .infobox-&amp;lt;name&amp;gt; .infobox-header&lt;br /&gt;
					:cssText(args.headerstyle)&lt;br /&gt;
					:cssText(rowArgs.rowcellstyle)&lt;br /&gt;
					:cssText(args.extracellstyles[rowArgs.num .. 'h'])&lt;br /&gt;
					:wikitext(rowArgs.header)&lt;br /&gt;
	elseif rowArgs.label then&lt;br /&gt;
		if rowArgs.data then&lt;br /&gt;
			has_list_class({rowArgs.rowclass, rowArgs.class})&lt;br /&gt;
			local row = root:tag('tr')&lt;br /&gt;
			row:addClass(rowArgs.rowclass)&lt;br /&gt;
			row:cssText(rowArgs.rowstyle)&lt;br /&gt;
			row&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:attr('scope', 'row')&lt;br /&gt;
					:addClass('infobox-label')&lt;br /&gt;
					:cssText(args.labelstyle)&lt;br /&gt;
					:cssText(rowArgs.rowcellstyle)&lt;br /&gt;
					:cssText(args.extracellstyles[rowArgs.num .. 'l'])&lt;br /&gt;
					:wikitext(rowArgs.label)&lt;br /&gt;
					:done()&lt;br /&gt;
		&lt;br /&gt;
			local dataCell = row:tag('td')&lt;br /&gt;
			dataCell&lt;br /&gt;
				:attr('colspan', '3')&lt;br /&gt;
				:addClass('infobox-data')&lt;br /&gt;
				:addClass(rowArgs.class)&lt;br /&gt;
				-- @deprecated next; target .infobox-&amp;lt;name&amp;gt; .infobox-data&lt;br /&gt;
				:cssText(rowArgs.datastyle)&lt;br /&gt;
				:cssText(rowArgs.rowcellstyle)&lt;br /&gt;
				:cssText(args.extracellstyles[rowArgs.num])&lt;br /&gt;
				:newline()&lt;br /&gt;
				:wikitext(rowArgs.data)&lt;br /&gt;
		elseif rowArgs.dataa or rowArgs.datab or rowArgs.datac then&lt;br /&gt;
			has_list_class({rowArgs.rowclass, rowArgs.classa})&lt;br /&gt;
			local row = root:tag('tr')&lt;br /&gt;
			row:addClass(rowArgs.rowclass)&lt;br /&gt;
			row:cssText(rowArgs.rowstyle)&lt;br /&gt;
			row&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:attr('scope', 'row')&lt;br /&gt;
					:addClass('infobox-label')&lt;br /&gt;
					:cssText(args.labelstyle)&lt;br /&gt;
					:cssText(rowArgs.rowcellstyle)&lt;br /&gt;
					:cssText(args.extracellstyles[rowArgs.num .. 'l'])&lt;br /&gt;
					:wikitext(rowArgs.label)&lt;br /&gt;
					:done()&lt;br /&gt;
&lt;br /&gt;
			local dataCella = row:tag('td')&lt;br /&gt;
			dataCella&lt;br /&gt;
				:addClass('infobox-data infobox-data-a')&lt;br /&gt;
				:addClass(rowArgs.classa)&lt;br /&gt;
				-- @deprecated next; target .infobox-&amp;lt;name&amp;gt; .infobox-data-a&lt;br /&gt;
				:cssText(rowArgs.dataastyle)&lt;br /&gt;
				:cssText(rowArgs.rowcellstyle)&lt;br /&gt;
				:cssText(args.extracellstyles[rowArgs.num .. 'a'])&lt;br /&gt;
				:newline()&lt;br /&gt;
				:wikitext(rowArgs.dataa)&lt;br /&gt;
			if rowArgs.renderb then&lt;br /&gt;
				has_list_class({rowArgs.classb})&lt;br /&gt;
				local dataCellb = row:tag('td')&lt;br /&gt;
				dataCellb&lt;br /&gt;
					:addClass('infobox-data infobox-data-b')&lt;br /&gt;
					:addClass(rowArgs.classb)&lt;br /&gt;
					-- @deprecated next; target .infobox-&amp;lt;name&amp;gt; .infobox-data-b&lt;br /&gt;
					:cssText(rowArgs.databstyle)&lt;br /&gt;
					:cssText(rowArgs.rowcellstyle)&lt;br /&gt;
					:cssText(args.extracellstyles[rowArgs.num .. 'b'])&lt;br /&gt;
					:newline()&lt;br /&gt;
					:wikitext(rowArgs.datab)&lt;br /&gt;
			end&lt;br /&gt;
			if rowArgs.renderc then&lt;br /&gt;
				has_list_class({rowArgs.classc})&lt;br /&gt;
				local dataCellc = row:tag('td')&lt;br /&gt;
				dataCellc&lt;br /&gt;
					:addClass('infobox-data infobox-data-c')&lt;br /&gt;
					:addClass(rowArgs.classc)&lt;br /&gt;
					-- @deprecated next; target .infobox-&amp;lt;name&amp;gt; .infobox-data-c&lt;br /&gt;
					:cssText(rowArgs.datacstyle)&lt;br /&gt;
					:cssText(rowArgs.rowcellstyle)&lt;br /&gt;
					:cssText(args.extracellstyles[rowArgs.num .. 'c'])&lt;br /&gt;
					:newline()&lt;br /&gt;
					:wikitext(rowArgs.datac)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	elseif rowArgs.data then&lt;br /&gt;
		has_list_class({rowArgs.rowclass, rowArgs.class})&lt;br /&gt;
		local row = root:tag('tr')&lt;br /&gt;
		row:addClass(rowArgs.rowclass)&lt;br /&gt;
		row:cssText(rowArgs.rowstyle)&lt;br /&gt;
					&lt;br /&gt;
		local dataCell = row:tag('td')&lt;br /&gt;
		dataCell&lt;br /&gt;
			:attr('colspan', '4')&lt;br /&gt;
			:addClass('infobox-full-data')&lt;br /&gt;
			:addClass(rowArgs.class)&lt;br /&gt;
			-- @deprecated next; target .infobox-&amp;lt;name&amp;gt; .infobox-full-data&lt;br /&gt;
			:cssText(rowArgs.datastyle)&lt;br /&gt;
			:cssText(rowArgs.rowcellstyle)&lt;br /&gt;
			:cssText(args.extracellstyles[rowArgs.num])&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(rowArgs.data)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTitle()&lt;br /&gt;
	if not args.title then return end&lt;br /&gt;
	has_list_class({args.titleclass})&lt;br /&gt;
&lt;br /&gt;
	root&lt;br /&gt;
		:tag('caption')&lt;br /&gt;
			:addClass('infobox-title')&lt;br /&gt;
			:addClass(args.titleclass)&lt;br /&gt;
			-- @deprecated next; target .infobox-&amp;lt;name&amp;gt; .infobox-title&lt;br /&gt;
			:cssText(args.titlestyle)&lt;br /&gt;
			:wikitext(args.title)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderAboveRow()&lt;br /&gt;
	if not args.above then return end&lt;br /&gt;
	has_list_class({args.aboveclass})&lt;br /&gt;
	&lt;br /&gt;
	root&lt;br /&gt;
		:tag('tr')&lt;br /&gt;
			:tag('th')&lt;br /&gt;
				:attr('colspan', '4')&lt;br /&gt;
				:addClass('infobox-above')&lt;br /&gt;
				:addClass(args.aboveclass)&lt;br /&gt;
				-- @deprecated next; target .infobox-&amp;lt;name&amp;gt; .infobox-above&lt;br /&gt;
				:cssText(args.abovestyle)&lt;br /&gt;
				:wikitext(args.above)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBelowRow()&lt;br /&gt;
	if not args.below then return end&lt;br /&gt;
	has_list_class({args.belowclass})&lt;br /&gt;
	&lt;br /&gt;
	root&lt;br /&gt;
		:tag('tr')&lt;br /&gt;
			:tag('td')&lt;br /&gt;
				:attr('colspan', '4')&lt;br /&gt;
				:addClass('infobox-below')&lt;br /&gt;
				:addClass(args.belowclass)&lt;br /&gt;
				-- @deprecated next; target .infobox-&amp;lt;name&amp;gt; .infobox-below&lt;br /&gt;
				:cssText(args.belowstyle)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:wikitext(args.below)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function addSubheaderRow(subheaderArgs)&lt;br /&gt;
	if not subheaderArgs.data then return end&lt;br /&gt;
	&lt;br /&gt;
	has_list_class({subheaderArgs.rowclass, subheaderArgs.class})&lt;br /&gt;
	local row = root:tag('tr')&lt;br /&gt;
	row:addClass(subheaderArgs.rowclass)&lt;br /&gt;
				&lt;br /&gt;
	local dataCell = row:tag('td')&lt;br /&gt;
	dataCell&lt;br /&gt;
		:attr('colspan', '4')&lt;br /&gt;
		:addClass('infobox-subheader')&lt;br /&gt;
		:addClass(subheaderArgs.class)&lt;br /&gt;
		:cssText(subheaderArgs.datastyle)&lt;br /&gt;
		:cssText(subheaderArgs.rowcellstyle)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(subheaderArgs.data)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSubheaders()&lt;br /&gt;
	if args.subheader then&lt;br /&gt;
		args.subheader1 = args.subheader&lt;br /&gt;
	end&lt;br /&gt;
	if args.subheaderrowclass then&lt;br /&gt;
		args.subheaderrowclass1 = args.subheaderrowclass&lt;br /&gt;
	end&lt;br /&gt;
	local subheadernums = getArgNums('subheader','')&lt;br /&gt;
	for k, num in ipairs(subheadernums) do&lt;br /&gt;
		addSubheaderRow({&lt;br /&gt;
			data = args['subheader' .. tostring(num)],&lt;br /&gt;
			-- @deprecated next; target .infobox-&amp;lt;name&amp;gt; .infobox-subheader&lt;br /&gt;
			datastyle = args.subheaderstyle,&lt;br /&gt;
			rowcellstyle = args['subheaderstyle' .. tostring(num)],&lt;br /&gt;
			class = args.subheaderclass,&lt;br /&gt;
			rowclass = args['subheaderrowclass' .. tostring(num)]&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function addImageRow(imageArgs)&lt;br /&gt;
	if not imageArgs.data then return end&lt;br /&gt;
	&lt;br /&gt;
	has_list_class({imageArgs.rowclass, imageArgs.class})&lt;br /&gt;
	local row = root:tag('tr')&lt;br /&gt;
	row:addClass(imageArgs.rowclass)&lt;br /&gt;
				&lt;br /&gt;
	local dataCell = row:tag('td')&lt;br /&gt;
	dataCell&lt;br /&gt;
		:attr('colspan', '4')&lt;br /&gt;
		:addClass('infobox-image')&lt;br /&gt;
		:addClass(imageArgs.class)&lt;br /&gt;
		:cssText(imageArgs.datastyle)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(imageArgs.data)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderImages()&lt;br /&gt;
	if args.image then&lt;br /&gt;
		args.image1 = args.image&lt;br /&gt;
	end&lt;br /&gt;
	if args.caption then&lt;br /&gt;
		args.caption1 = args.caption&lt;br /&gt;
	end&lt;br /&gt;
	local imagenums = getArgNums('image','')&lt;br /&gt;
	for k, num in ipairs(imagenums) do&lt;br /&gt;
		local caption = args['caption' .. tostring(num)]&lt;br /&gt;
		local data = mw.html.create():wikitext(args['image' .. tostring(num)])&lt;br /&gt;
		if caption then&lt;br /&gt;
			data&lt;br /&gt;
				:tag('div')&lt;br /&gt;
					:addClass('infobox-caption')&lt;br /&gt;
					-- @deprecated next; target .infobox-&amp;lt;name&amp;gt; .infobox-caption&lt;br /&gt;
					:cssText(args.captionstyle)&lt;br /&gt;
					:wikitext(caption)&lt;br /&gt;
		end&lt;br /&gt;
		addImageRow({&lt;br /&gt;
			data = tostring(data),&lt;br /&gt;
			-- @deprecated next; target .infobox-&amp;lt;name&amp;gt; .infobox-image&lt;br /&gt;
			datastyle = args.imagestyle,&lt;br /&gt;
			class = args.imageclass,&lt;br /&gt;
			rowclass = args['imagerowclass' .. tostring(num)]&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Gets the union of the header and data argument numbers,&lt;br /&gt;
-- and renders them all in order&lt;br /&gt;
local function renderRows()&lt;br /&gt;
	local rownums = union(getArgNums('header',''), getArgNums('data','[abc]?'))&lt;br /&gt;
	local datab_count = #(getArgNums('data','b'))&lt;br /&gt;
	local datac_count = #(getArgNums('data','c'))&lt;br /&gt;
	table.sort(rownums)&lt;br /&gt;
	for k, num in ipairs(rownums) do&lt;br /&gt;
		addRow({&lt;br /&gt;
			num = tostring(num),&lt;br /&gt;
			renderb = datab_count &amp;gt; 0,&lt;br /&gt;
			renderc = datac_count &amp;gt; 0,&lt;br /&gt;
			header = args['header' .. tostring(num)],&lt;br /&gt;
			label = args['label' .. tostring(num)],&lt;br /&gt;
			data = args['data' .. tostring(num)],&lt;br /&gt;
			datastyle = args.datastyle,&lt;br /&gt;
			class = args['class' .. tostring(num)],&lt;br /&gt;
			dataa = args['data' .. tostring(num) .. 'a'],&lt;br /&gt;
			dataastyle = args.datastylea,&lt;br /&gt;
			classa = args['class' .. tostring(num) .. 'a'],&lt;br /&gt;
			datab = args['data' .. tostring(num) .. 'b'],&lt;br /&gt;
			databstyle = args.datastyleb,&lt;br /&gt;
			classb = args['class' .. tostring(num) .. 'b'],&lt;br /&gt;
			datac = args['data' .. tostring(num) .. 'c'],&lt;br /&gt;
			datacstyle = args.datastylec,&lt;br /&gt;
			classc = args['class' .. tostring(num) .. 'c'],&lt;br /&gt;
			rowclass = args['rowclass' .. tostring(num)],&lt;br /&gt;
			-- @deprecated next; target .infobox-&amp;lt;name&amp;gt; rowclass&lt;br /&gt;
			rowstyle = args['rowstyle' .. tostring(num)],&lt;br /&gt;
			rowcellstyle = args['rowcellstyle' .. tostring(num)],&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderNavBar()&lt;br /&gt;
	if not args.name then return end&lt;br /&gt;
	&lt;br /&gt;
	root&lt;br /&gt;
		:tag('tr')&lt;br /&gt;
			:tag('td')&lt;br /&gt;
				:attr('colspan', '4')&lt;br /&gt;
				:addClass('infobox-navbar')&lt;br /&gt;
				:wikitext(require('Module:Navbar')._navbar{&lt;br /&gt;
					args.name,&lt;br /&gt;
					mini = 1,&lt;br /&gt;
				})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderItalicTitle()&lt;br /&gt;
	local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])&lt;br /&gt;
	if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then&lt;br /&gt;
		root:wikitext(require('Module:Italic title')._main({}))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Render tracking categories. args.decat == turns off tracking categories.&lt;br /&gt;
local function renderTrackingCategories()&lt;br /&gt;
	local title = mw.title.getCurrentTitle()&lt;br /&gt;
	if args.decat == 'yes' then return end&lt;br /&gt;
	&lt;br /&gt;
	if #(getArgNums('data','[abc]?')) == 0 and title.namespace == 0 then&lt;br /&gt;
		root:wikitext('[[Category:Articles using infobox templates with no data rows]]')&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	root:wikitext(check_for_unknown_parameters({&lt;br /&gt;
		checkpositional = &amp;quot;y&amp;quot;,&lt;br /&gt;
		ignoreblank = &amp;quot;y&amp;quot;,&lt;br /&gt;
		regexp1 = &amp;quot;header[%d][%d]*&amp;quot;,&lt;br /&gt;
		regexp2 = &amp;quot;label[%d][%d]*&amp;quot;,&lt;br /&gt;
		regexp3 = &amp;quot;data[%d][%d]*[abc]?&amp;quot;,&lt;br /&gt;
		regexp4 = &amp;quot;class[%d][%d]*[abc]?&amp;quot;,&lt;br /&gt;
		regexp5 = &amp;quot;rowclass[%d][%d]*&amp;quot;,&lt;br /&gt;
		regexp6 = &amp;quot;rowstyle[%d][%d]*&amp;quot;,&lt;br /&gt;
		regexp7 = &amp;quot;rowcellstyle[%d][%d]*&amp;quot;,&lt;br /&gt;
		unknown = &amp;quot;[[Category:Pages using infobox3cols with undocumented parameters|_VALUE_&amp;quot; .. title.text .. &amp;quot;]]&amp;quot;,&lt;br /&gt;
		&amp;quot;above&amp;quot;, &amp;quot;aboveclass&amp;quot;, &amp;quot;aboverowclass&amp;quot;, &amp;quot;abovestyle&amp;quot;, &amp;quot;below&amp;quot;, &amp;quot;belowclass&amp;quot;,&lt;br /&gt;
		&amp;quot;belowrowclass&amp;quot;, &amp;quot;belowstyle&amp;quot;, &amp;quot;bodyclass&amp;quot;, &amp;quot;bodystyle&amp;quot;, &amp;quot;caption&amp;quot;, &amp;quot;caption1&amp;quot;,&lt;br /&gt;
		&amp;quot;caption2&amp;quot;, &amp;quot;captionstyle&amp;quot;, &amp;quot;child&amp;quot;, &amp;quot;datastyle&amp;quot;, &amp;quot;datastylea&amp;quot;, &amp;quot;datastyleb&amp;quot;,&lt;br /&gt;
		&amp;quot;datastylec&amp;quot;, &amp;quot;extracellstyles&amp;quot;, &amp;quot;headerstyle&amp;quot;, &amp;quot;image&amp;quot;, &amp;quot;image1&amp;quot;, &amp;quot;image2&amp;quot;,&lt;br /&gt;
		&amp;quot;imageclass&amp;quot;, &amp;quot;imagerowclass1&amp;quot;, &amp;quot;imagerowclass2&amp;quot;, &amp;quot;imagestyle&amp;quot;, &amp;quot;labelstyle&amp;quot;,&lt;br /&gt;
		&amp;quot;name&amp;quot;, &amp;quot;subbox&amp;quot;, &amp;quot;subheader&amp;quot;, &amp;quot;subheader2&amp;quot;, &amp;quot;subheaderclass&amp;quot;,&lt;br /&gt;
		&amp;quot;subheaderrowclass1&amp;quot;, &amp;quot;subheaderrowclass2&amp;quot;, &amp;quot;subheaderstyle&amp;quot;, &amp;quot;templatestyles&amp;quot;,&lt;br /&gt;
		&amp;quot;title&amp;quot;, &amp;quot;titleclass&amp;quot;, &amp;quot;titlestyle&amp;quot;,&lt;br /&gt;
	}, origArgs))&lt;br /&gt;
&lt;br /&gt;
	if origArgs.header0 or origArgs.label0 or origArgs.data0 or origArgs.data0a&lt;br /&gt;
		or origArgs.data0b or origArgs.data0c or origArgs.class0 or origArgs.rowclass0 then&lt;br /&gt;
			root:wikitext(&amp;quot;[[Category:Pages using infobox3cols with header0 or label0 or data0]]&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if title.namespace == 10 and mw.ustring.sub(title.text, 1, 7) == &amp;quot;Infobox&amp;quot; then&lt;br /&gt;
		root:wikitext(&amp;quot;[[Category:Infobox templates|&amp;quot; .. mw.ustring.sub(title.text, 9) .. &amp;quot;]]&amp;quot;)	&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
Loads the templatestyles for the infobox.&lt;br /&gt;
&lt;br /&gt;
TODO: FINISH loading base templatestyles here rather than in&lt;br /&gt;
MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables.&lt;br /&gt;
See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).&lt;br /&gt;
When we do this we should clean up the inline CSS below too.&lt;br /&gt;
Will have to do some bizarre conversion category like with sidebar.&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
local function loadTemplateStyles()&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	&lt;br /&gt;
	local hlist_templatestyles = ''&lt;br /&gt;
	if lists.hlist_t.found then&lt;br /&gt;
		hlist_templatestyles = frame:extensionTag{&lt;br /&gt;
			name = 'templatestyles', args = { src = lists.hlist_t.styles }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local plainlist_templatestyles = ''&lt;br /&gt;
	if lists.plainlist_t.found then&lt;br /&gt;
		plainlist_templatestyles = frame:extensionTag{&lt;br /&gt;
			name = 'templatestyles', args = { src = lists.plainlist_t.styles }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- See function description&lt;br /&gt;
	local base_templatestyles = frame:extensionTag{&lt;br /&gt;
		name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local templatestyles = ''&lt;br /&gt;
	if args['templatestyles'] then&lt;br /&gt;
		templatestyles = frame:extensionTag{&lt;br /&gt;
			name = 'templatestyles', args = { src = args['templatestyles'] }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local child_templatestyles = ''&lt;br /&gt;
	if args['child templatestyles'] then&lt;br /&gt;
		child_templatestyles = frame:extensionTag{&lt;br /&gt;
			name = 'templatestyles', args = { src = args['child templatestyles'] }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local grandchild_templatestyles = ''&lt;br /&gt;
	if args['grandchild templatestyles'] then&lt;br /&gt;
		grandchild_templatestyles = frame:extensionTag{&lt;br /&gt;
			name = 'templatestyles', args = { src = args['grandchild templatestyles'] }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat({&lt;br /&gt;
		-- hlist -&amp;gt; plainlist -&amp;gt; base is best-effort to preserve old Common.css ordering.&lt;br /&gt;
		-- this ordering is not a guarantee because the rows of interest invoking&lt;br /&gt;
		-- each class may not be on a specific page&lt;br /&gt;
		hlist_templatestyles,&lt;br /&gt;
		plainlist_templatestyles,&lt;br /&gt;
		base_templatestyles,&lt;br /&gt;
		templatestyles,&lt;br /&gt;
		child_templatestyles,&lt;br /&gt;
		grandchild_templatestyles&lt;br /&gt;
	})	&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- common functions between the child and non child cases&lt;br /&gt;
local function structure_infobox_common()&lt;br /&gt;
	renderSubheaders()&lt;br /&gt;
	renderImages()&lt;br /&gt;
--	preprocessRows()&lt;br /&gt;
	renderRows()&lt;br /&gt;
	renderBelowRow()&lt;br /&gt;
	renderNavBar()&lt;br /&gt;
	renderItalicTitle()&lt;br /&gt;
--	renderEmptyRowCategories()&lt;br /&gt;
	renderTrackingCategories()&lt;br /&gt;
--	cleanInfobox()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Specify the overall layout of the infobox, with special settings if the&lt;br /&gt;
-- infobox is used as a 'child' inside another infobox.&lt;br /&gt;
local function _infobox()&lt;br /&gt;
&lt;br /&gt;
	root = mw.html.create('table')&lt;br /&gt;
	has_list_class({args.bodyclass})&lt;br /&gt;
		&lt;br /&gt;
	root&lt;br /&gt;
		:addClass((args.child == 'yes' or args.subbox == 'yes') and 'infobox-subbox' or 'infobox')&lt;br /&gt;
		:addClass(args.child == 'yes' and 'infobox-3cols-child' or nil)&lt;br /&gt;
		:addClass(args.bodyclass)&lt;br /&gt;
		-- @deprecated next; target .infobox-&amp;lt;name&amp;gt;&lt;br /&gt;
		:cssText(args.bodystyle)&lt;br /&gt;
	&lt;br /&gt;
	renderTitle()&lt;br /&gt;
	renderAboveRow()&lt;br /&gt;
	structure_infobox_common()&lt;br /&gt;
	&lt;br /&gt;
	return loadTemplateStyles() .. tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- If the argument exists and isn't blank, add it to the argument table.&lt;br /&gt;
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.&lt;br /&gt;
local function preprocessSingleArg(argName)&lt;br /&gt;
	if origArgs[argName] and origArgs[argName] ~= '' then&lt;br /&gt;
		args[argName] = origArgs[argName]&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Assign the parameters with the given prefixes to the args table, in order, in&lt;br /&gt;
-- batches of the step size specified. This is to prevent references etc. from&lt;br /&gt;
-- appearing in the wrong order. The prefixTable should be an array containing&lt;br /&gt;
-- tables, each of which has two possible fields, a &amp;quot;prefix&amp;quot; string and a&lt;br /&gt;
-- &amp;quot;depend&amp;quot; table. The function always parses parameters containing the &amp;quot;prefix&amp;quot;&lt;br /&gt;
-- string, but only parses parameters in the &amp;quot;depend&amp;quot; table if the prefix&lt;br /&gt;
-- parameter is present and non-blank.&lt;br /&gt;
local function preprocessArgs(prefixTable, step)&lt;br /&gt;
	if type(prefixTable) ~= 'table' then&lt;br /&gt;
		error(&amp;quot;Non-table value detected for the prefix table&amp;quot;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	if type(step) ~= 'number' then&lt;br /&gt;
		error(&amp;quot;Invalid step value detected&amp;quot;, 2)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Get arguments without a number suffix, and check for bad input.&lt;br /&gt;
	for i,v in ipairs(prefixTable) do&lt;br /&gt;
		if type(v) ~= 'table' or type(v.prefix) ~= &amp;quot;string&amp;quot; or&lt;br /&gt;
			(v.depend and type(v.depend) ~= 'table') then&lt;br /&gt;
			error('Invalid input detected to preprocessArgs prefix table', 2)&lt;br /&gt;
		end&lt;br /&gt;
		preprocessSingleArg(v.prefix)&lt;br /&gt;
		-- Only parse the depend parameter if the prefix parameter is present&lt;br /&gt;
		-- and not blank.&lt;br /&gt;
		if args[v.prefix] and v.depend then&lt;br /&gt;
			for j, dependValue in ipairs(v.depend) do&lt;br /&gt;
				if type(dependValue) ~= 'string' then&lt;br /&gt;
					error('Invalid &amp;quot;depend&amp;quot; parameter value detected in preprocessArgs')&lt;br /&gt;
				end&lt;br /&gt;
				preprocessSingleArg(dependValue)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Get arguments with number suffixes.&lt;br /&gt;
	local a = 0 -- Counter variable.&lt;br /&gt;
	local moreArgumentsExist = true&lt;br /&gt;
	while moreArgumentsExist == true do&lt;br /&gt;
		moreArgumentsExist = false&lt;br /&gt;
		for i = a, a + step - 1 do&lt;br /&gt;
			for j,v in ipairs(prefixTable) do&lt;br /&gt;
				local prefixArgName = v.prefix .. tostring(i) .. (v.suffix or '')&lt;br /&gt;
				if origArgs[prefixArgName] then&lt;br /&gt;
					-- Do another loop if any arguments are found, even blank ones.&lt;br /&gt;
					moreArgumentsExist = true&lt;br /&gt;
					preprocessSingleArg(prefixArgName)&lt;br /&gt;
				end&lt;br /&gt;
				-- Process the depend table if the prefix argument is present&lt;br /&gt;
				-- and not blank, or we are processing &amp;quot;prefix1&amp;quot; and &amp;quot;prefix&amp;quot; is&lt;br /&gt;
				-- present and not blank, and if the depend table is present.&lt;br /&gt;
				if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then&lt;br /&gt;
					for j,dependValue in ipairs(v.depend) do&lt;br /&gt;
						local dependArgName = dependValue .. tostring(i) .. (v.dependsuffix or '')&lt;br /&gt;
						preprocessSingleArg(dependArgName)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		a = a + step&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Parse the data parameters in the same order that the old {{infobox}} did, so&lt;br /&gt;
-- that references etc. will display in the expected places. Parameters that&lt;br /&gt;
-- depend on another parameter are only processed if that parameter is present,&lt;br /&gt;
-- to avoid phantom references appearing in article reference lists.&lt;br /&gt;
local function parseDataParameters()&lt;br /&gt;
	preprocessSingleArg('child')&lt;br /&gt;
	preprocessSingleArg('bodyclass')&lt;br /&gt;
	preprocessSingleArg('subbox')&lt;br /&gt;
	preprocessSingleArg('bodystyle')&lt;br /&gt;
	preprocessSingleArg('title')&lt;br /&gt;
	preprocessSingleArg('titleclass')&lt;br /&gt;
	preprocessSingleArg('titlestyle')&lt;br /&gt;
	preprocessSingleArg('above')&lt;br /&gt;
	preprocessSingleArg('aboveclass')&lt;br /&gt;
	preprocessSingleArg('abovestyle')&lt;br /&gt;
	preprocessArgs({&lt;br /&gt;
		{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}&lt;br /&gt;
	}, 10)&lt;br /&gt;
	preprocessSingleArg('subheaderstyle')&lt;br /&gt;
	preprocessSingleArg('subheaderclass')&lt;br /&gt;
	preprocessSingleArg('image')&lt;br /&gt;
	preprocessSingleArg('caption')&lt;br /&gt;
	preprocessArgs({&lt;br /&gt;
		{prefix = 'image', depend = {'caption', 'imagerowclass'}}&lt;br /&gt;
	}, 10)&lt;br /&gt;
	preprocessSingleArg('captionstyle')&lt;br /&gt;
	preprocessSingleArg('imagestyle')&lt;br /&gt;
	preprocessSingleArg('imageclass')&lt;br /&gt;
	preprocessArgs({&lt;br /&gt;
		{prefix = 'header'},&lt;br /&gt;
		{prefix = 'data', depend = {'label'}},&lt;br /&gt;
		{prefix = 'data', suffix = 'a', depend = {'label'}},&lt;br /&gt;
		{prefix = 'data', suffix = 'a'},&lt;br /&gt;
		{prefix = 'data', suffix = 'b', depend = {'label'}},&lt;br /&gt;
		{prefix = 'data', suffix = 'b'},&lt;br /&gt;
		{prefix = 'data', suffix = 'c', depend = {'label'}},&lt;br /&gt;
		{prefix = 'data', suffix = 'c'},&lt;br /&gt;
		{prefix = 'rowclass'},&lt;br /&gt;
		{prefix = 'rowstyle'},&lt;br /&gt;
		{prefix = 'rowcellstyle'},&lt;br /&gt;
		{prefix = 'class'}&lt;br /&gt;
	}, 50)&lt;br /&gt;
	preprocessSingleArg('headerclass')&lt;br /&gt;
	preprocessSingleArg('headerstyle')&lt;br /&gt;
	preprocessSingleArg('labelstyle')&lt;br /&gt;
	preprocessSingleArg('datastyle')&lt;br /&gt;
	preprocessSingleArg('datastylea')&lt;br /&gt;
	preprocessSingleArg('datastyleb')&lt;br /&gt;
	preprocessSingleArg('datastylec')&lt;br /&gt;
	preprocessSingleArg('below')&lt;br /&gt;
	preprocessSingleArg('belowclass')&lt;br /&gt;
	preprocessSingleArg('belowstyle')&lt;br /&gt;
	preprocessSingleArg('name')&lt;br /&gt;
	-- different behaviour for italics if blank or absent&lt;br /&gt;
	args['italic title'] = origArgs['italic title']&lt;br /&gt;
	preprocessSingleArg('decat')&lt;br /&gt;
	preprocessSingleArg('templatestyles')&lt;br /&gt;
	preprocessSingleArg('child templatestyles')&lt;br /&gt;
	preprocessSingleArg('grandchild templatestyles')&lt;br /&gt;
&lt;br /&gt;
	args['extracellstyles'] = {}&lt;br /&gt;
	for line in mw.text.gsplit(origArgs['extracellstyles'] or '', '\n') do&lt;br /&gt;
		local equals = line:find('=')&lt;br /&gt;
		if equals then&lt;br /&gt;
			for i in mw.text.gsplit(line:sub(1, equals - 1), '%s*,%s*') do&lt;br /&gt;
				args.extracellstyles[i] = line:sub(equals + 1)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- If called via #invoke, use the args passed into the invoking template.&lt;br /&gt;
-- Otherwise, for testing purposes, assume args are being passed directly in.&lt;br /&gt;
function p.infobox(frame)&lt;br /&gt;
	if frame == mw.getCurrentFrame() then&lt;br /&gt;
		origArgs = frame:getParent().args&lt;br /&gt;
	else&lt;br /&gt;
		origArgs = frame&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	parseDataParameters()&lt;br /&gt;
	&lt;br /&gt;
	return _infobox()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- For calling via #invoke within a template&lt;br /&gt;
function p.infoboxTemplate(frame, extra_args)&lt;br /&gt;
	origArgs = extra_args or {}&lt;br /&gt;
	for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end&lt;br /&gt;
	&lt;br /&gt;
	parseDataParameters()&lt;br /&gt;
	&lt;br /&gt;
	return _infobox()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Shortcut for making child infoboxes via #invoke.&lt;br /&gt;
function p.child(frame)&lt;br /&gt;
	return p.infoboxTemplate(frame, {child = &amp;quot;yes&amp;quot;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>en&gt;Izno</name></author>
	</entry>
</feed>