<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.fetbuk.ru/w/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AInfoboxBuilder</id>
	<title>Модуль:InfoboxBuilder - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.fetbuk.ru/w/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AInfoboxBuilder"/>
	<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:InfoboxBuilder&amp;action=history"/>
	<updated>2026-06-25T11:31:57Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:InfoboxBuilder&amp;diff=1009&amp;oldid=prev</id>
		<title>Lanmikeman: 1 версия импортирована</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:InfoboxBuilder&amp;diff=1009&amp;oldid=prev"/>
		<updated>2022-03-09T19:44:07Z</updated>

		<summary type="html">&lt;p&gt;1 версия импортирована&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;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия 19:44, 9 марта 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Lanmikeman</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:InfoboxBuilder&amp;diff=1008&amp;oldid=prev</id>
		<title>https://projectsekai.miraheze.org/wiki/&gt;ChaoticShadow: add variable class</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:InfoboxBuilder&amp;diff=1008&amp;oldid=prev"/>
		<updated>2021-12-22T21:58:38Z</updated>

		<summary type="html">&lt;p&gt;add variable class&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local navbar    = require(&amp;#039;Module:Navbar&amp;#039;)._navbar&lt;br /&gt;
&lt;br /&gt;
local InfoboxBuilder = {}&lt;br /&gt;
InfoboxBuilder.__index = InfoboxBuilder&lt;br /&gt;
InfoboxBuilder.__tostring = InfoboxBuilder.tostring&lt;br /&gt;
&lt;br /&gt;
local tagmap = {&lt;br /&gt;
	th = &amp;#039;th&amp;#039;,&lt;br /&gt;
	td = &amp;#039;td&amp;#039;,&lt;br /&gt;
	argth = &amp;#039;th&amp;#039;,&lt;br /&gt;
	argtd = &amp;#039;td&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--- Create the infobox&lt;br /&gt;
-- @return obj metatable&lt;br /&gt;
--             A metatable describing the infobox&lt;br /&gt;
function InfoboxBuilder.new()&lt;br /&gt;
	local obj = setmetatable({&lt;br /&gt;
		name = &amp;#039;&amp;#039;,&lt;br /&gt;
		headerColors = {&lt;br /&gt;
			[&amp;#039;color&amp;#039;]            = nil,&lt;br /&gt;
			[&amp;#039;background-color&amp;#039;] = nil&lt;br /&gt;
		},&lt;br /&gt;
		params = {&lt;br /&gt;
			[&amp;#039;bg color&amp;#039;] = {},&lt;br /&gt;
			[&amp;#039;text color&amp;#039;] = {}&lt;br /&gt;
		},&lt;br /&gt;
		param_names = { &amp;#039;bg color&amp;#039;, &amp;#039;text color&amp;#039; },&lt;br /&gt;
		raw_args = {},&lt;br /&gt;
		proc_args = {},&lt;br /&gt;
		infobox = mw.html.create(&amp;#039;table&amp;#039;):addClass(&amp;#039;infobox&amp;#039;),&lt;br /&gt;
		finished = false&lt;br /&gt;
	}, InfoboxBuilder)&lt;br /&gt;
&lt;br /&gt;
	return obj&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Set the infobox name, for use with bottom links&lt;br /&gt;
-- @param arg string&lt;br /&gt;
--            Name of the template, not nil or empty&lt;br /&gt;
-- @return self&lt;br /&gt;
--         The current object&lt;br /&gt;
function InfoboxBuilder:setName(arg)&lt;br /&gt;
	if arg == nil or arg == &amp;#039;&amp;#039; then&lt;br /&gt;
		error(&amp;quot;Template name must not be nil or empty&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	self.name = arg&lt;br /&gt;
	&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Set the width of the infobox&lt;br /&gt;
-- @param arg string&lt;br /&gt;
--            Width of the infobox, should be a valid value for the CSS &amp;quot;width&amp;quot; &lt;br /&gt;
--            property, not nil or empty&lt;br /&gt;
-- @return self&lt;br /&gt;
--         The current object&lt;br /&gt;
function InfoboxBuilder:setWidth(arg)&lt;br /&gt;
	if arg == nil or arg == &amp;#039;&amp;#039; then&lt;br /&gt;
		error(&amp;quot;Width must not be nil or empty&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	self.infobox:css(&amp;#039;width&amp;#039;, arg)&lt;br /&gt;
	&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Set the text color of the header&lt;br /&gt;
-- @param arg string&lt;br /&gt;
--            Text color of the header, should be a valid value for the CSS &lt;br /&gt;
--            &amp;quot;color&amp;quot; property, not nil or empty&lt;br /&gt;
-- @return self&lt;br /&gt;
--         The current object&lt;br /&gt;
function InfoboxBuilder:setHeaderTextColor(arg)&lt;br /&gt;
	if arg == nil or arg == &amp;#039;&amp;#039; then&lt;br /&gt;
		error(&amp;quot;Header text color must not be nil or empty&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	self.headerColors[&amp;#039;color&amp;#039;] = arg&lt;br /&gt;
	&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Set the background color of the header&lt;br /&gt;
-- @param arg string&lt;br /&gt;
--            Background color of the header, should be a valid value for the &lt;br /&gt;
--            CSS &amp;quot;background-color&amp;quot; property, not nil or empty&lt;br /&gt;
-- @return self &lt;br /&gt;
--         The current object&lt;br /&gt;
function InfoboxBuilder:setHeaderBackgroundColor(arg)&lt;br /&gt;
	if arg == nil or arg == &amp;#039;&amp;#039; then&lt;br /&gt;
		error(&amp;quot;Header background color must not be nil or empty&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	self.headerColors[&amp;#039;background-color&amp;#039;] = arg&lt;br /&gt;
	&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Sets both the text and background color of the header&lt;br /&gt;
-- @param arg { color, background-color }&lt;br /&gt;
--        color            string&lt;br /&gt;
--              Same as setHeaderTextColor&lt;br /&gt;
--        background-color string&lt;br /&gt;
--              Same as setHeaderBackgroundColor&lt;br /&gt;
-- @return self&lt;br /&gt;
--         The current object&lt;br /&gt;
function InfoboxBuilder:setHeaderColors(arg)&lt;br /&gt;
	if arg == nil then&lt;br /&gt;
		error(&amp;quot;Header colors must not be nil&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	self:setHeaderTextColor(arg[&amp;#039;color&amp;#039;])&lt;br /&gt;
	self:setHeaderBackgroundColor(arg[&amp;#039;background-color&amp;#039;])&lt;br /&gt;
	&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Sets both the text and background color of the header&lt;br /&gt;
-- @param param_name string&lt;br /&gt;
--                   Parameter name that helps map the colors&lt;br /&gt;
-- @param color_func { color, background-color } or function&lt;br /&gt;
--        color string&lt;br /&gt;
--             Same as setHeaderTextColor&lt;br /&gt;
--        background-color string&lt;br /&gt;
--             Same as setHeaderBackgroundColor&lt;br /&gt;
--        function&lt;br /&gt;
--             Accepts one argument, and returns a table with color and&lt;br /&gt;
--             background-color keys.&lt;br /&gt;
-- @return self&lt;br /&gt;
--         The current object&lt;br /&gt;
function InfoboxBuilder:setHeaderColorsByParam(param_name, color_func)&lt;br /&gt;
	if param_name == nil then&lt;br /&gt;
		error(&amp;quot;Parameter name must not be nil&amp;quot;)&lt;br /&gt;
	elseif color_func == nil then&lt;br /&gt;
		error(&amp;quot;Header color function or table must not be nil&amp;quot;)&lt;br /&gt;
	elseif type(color_func) ~= &amp;quot;table&amp;quot; and type(color_func) ~= &amp;quot;function&amp;quot; then&lt;br /&gt;
		error(&amp;quot;Must pass in table or function as &amp;#039;color_func&amp;#039;.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local raw_param_value = self.raw_args[param_name]&lt;br /&gt;
	local colors = nil&lt;br /&gt;
	if type(color_func) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		colors = color_func[raw_param_value]&lt;br /&gt;
	else&lt;br /&gt;
		colors = color_func(raw_param_value)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if colors == nil then&lt;br /&gt;
		return self&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	self:setHeaderTextColor(colors[&amp;#039;color&amp;#039;])&lt;br /&gt;
	self:setHeaderBackgroundColor(colors[&amp;#039;background-color&amp;#039;])&lt;br /&gt;
	&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Sets the infobox params&lt;br /&gt;
-- @param ... {{ name, func, default, should_hide }, ...}&lt;br /&gt;
--        name    string&lt;br /&gt;
--                The name of the parameter, not nil, cannot be duplicate&lt;br /&gt;
--        func    function, table or string&lt;br /&gt;
--                A function that accepts the parameter as an argument and&lt;br /&gt;
--                returns a string, OR&lt;br /&gt;
--                A table that has the parameter as a key, OR&lt;br /&gt;
--                An empty string&lt;br /&gt;
--        default string or nil&lt;br /&gt;
--                The default value if no argument is given&lt;br /&gt;
-- @return self&lt;br /&gt;
--         The current object&lt;br /&gt;
function InfoboxBuilder:setParams(...)&lt;br /&gt;
	for i, v in ipairs(...) do&lt;br /&gt;
		if v.name == nil or v.name == &amp;quot;&amp;quot; then&lt;br /&gt;
			error(&amp;quot;name must not be nil or empty&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		if self.param_names[v.name] then&lt;br /&gt;
			error(&amp;quot;name cannot be duplicate&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		self.params[v.name] = {&lt;br /&gt;
			[&amp;#039;type&amp;#039;] = type(v.func),&lt;br /&gt;
			func = v.func,&lt;br /&gt;
			default = v.default&lt;br /&gt;
		}&lt;br /&gt;
		table.insert(self.param_names, v.name)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Sets the infobox arguments&lt;br /&gt;
-- @param args Frame&lt;br /&gt;
--             A frame object, passed in when invoked&lt;br /&gt;
-- @return self&lt;br /&gt;
--         The current object&lt;br /&gt;
function InfoboxBuilder:setArgs(args)&lt;br /&gt;
	for k,v in pairs(args) do&lt;br /&gt;
		if v ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			self.raw_args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if self.raw_args[&amp;#039;bg color&amp;#039;] then&lt;br /&gt;
		self:setHeaderBackgroundColor(self.raw_args[&amp;#039;bg color&amp;#039;])&lt;br /&gt;
	end&lt;br /&gt;
	if self.raw_args[&amp;#039;text color&amp;#039;] then&lt;br /&gt;
		self:setHeaderTextColor(self.raw_args[&amp;#039;text color&amp;#039;])&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Gets the raw argument values passed&lt;br /&gt;
-- @return args table&lt;br /&gt;
--              A table containing the args&lt;br /&gt;
function InfoboxBuilder:getRawArgs()&lt;br /&gt;
	return self.raw_args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Gets the argument values after being processed&lt;br /&gt;
-- @return args table&lt;br /&gt;
--              A table containing the args&lt;br /&gt;
function InfoboxBuilder:getProcessedArgs()&lt;br /&gt;
	return self.proc_args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Gets the argument values of the table, for either raw or processed&lt;br /&gt;
-- @param which string&lt;br /&gt;
--              A string that determines which argument values to return&lt;br /&gt;
-- @retun args table&lt;br /&gt;
--             A table containing the args&lt;br /&gt;
function InfoboxBuilder:getArgs(which)&lt;br /&gt;
	if which == &amp;#039;raw&amp;#039; then&lt;br /&gt;
		return self:getRawArgs()&lt;br /&gt;
	elseif which == &amp;#039;processed&amp;#039; then&lt;br /&gt;
		return self:getProcessedArgs()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return {}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Gets the content associated with a parameter&lt;br /&gt;
-- @param param_name string&lt;br /&gt;
--                   The param name, not nil or empty&lt;br /&gt;
-- @return content string&lt;br /&gt;
--                 A string containing the content&lt;br /&gt;
function InfoboxBuilder:getContent(param_name)&lt;br /&gt;
	if param_name == nil or param_name == &amp;quot;&amp;quot; then&lt;br /&gt;
		error(&amp;quot;Param must not be nil or empty&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if self.proc_args[param_name] then&lt;br /&gt;
		return self.proc_args[param_name]&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local content = nil&lt;br /&gt;
	local current_param = self.params[param_name]&lt;br /&gt;
	&lt;br /&gt;
	if current_param == nil then&lt;br /&gt;
		error(string.format(&amp;quot;No such param with name: %s&amp;quot;, param_name))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local raw_param_value = self.raw_args[param_name] or current_param.default&lt;br /&gt;
	&lt;br /&gt;
	if raw_param_value == nil then&lt;br /&gt;
		return raw_param_value&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if current_param[&amp;#039;type&amp;#039;] == &amp;#039;function&amp;#039; then&lt;br /&gt;
		content = current_param.func(raw_param_value)&lt;br /&gt;
	elseif current_param[&amp;#039;type&amp;#039;] == &amp;#039;table&amp;#039; then&lt;br /&gt;
		content = current_param.func[raw_param_value]&lt;br /&gt;
	else&lt;br /&gt;
		content = raw_param_value&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	self.proc_args[param_name] = content&lt;br /&gt;
	&lt;br /&gt;
	return content&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Determines if the row should be shown based of a list of param names&lt;br /&gt;
-- @param param_names { param_name, ... }&lt;br /&gt;
--        param_name string&lt;br /&gt;
--                   The param name&lt;br /&gt;
-- @return should_show boolean&lt;br /&gt;
function InfoboxBuilder:shouldShow(param_names)&lt;br /&gt;
    if param_names and #param_names &amp;gt; 0 then&lt;br /&gt;
    	local actual_values = {}&lt;br /&gt;
	    for i,v in ipairs(param_names) do&lt;br /&gt;
	        table.insert(actual_values, self:getContent(v))&lt;br /&gt;
	    end&lt;br /&gt;
        &lt;br /&gt;
        if #actual_values == 0 then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Adds a header&lt;br /&gt;
-- @param arg { content, attr, colspan, rowspan, css }&lt;br /&gt;
--        content string or nil&lt;br /&gt;
--                The wikitext to be rendered&lt;br /&gt;
--        attr    {...} or nil &lt;br /&gt;
--                The attributes of the cell in table form&lt;br /&gt;
--        colspan number or nil&lt;br /&gt;
--                The colspan of the cell&lt;br /&gt;
--        roswpan number or nil&lt;br /&gt;
--                The rowspan of the cell&lt;br /&gt;
--        css     {...} or nil&lt;br /&gt;
--                The css of the cell in table form&lt;br /&gt;
-- @param options { hideIfEmpty, subheader }&lt;br /&gt;
--        hideIfEmpty { param_name, ... }&lt;br /&gt;
--        param_name string&lt;br /&gt;
--                   The param_name that will be used to check if corresponding &lt;br /&gt;
--                   content is nil&lt;br /&gt;
--       subheader boolean&lt;br /&gt;
--                 Whether the header is a subheader or not&lt;br /&gt;
-- @return self&lt;br /&gt;
--         The current object&lt;br /&gt;
function InfoboxBuilder:addHeader(arg, options)&lt;br /&gt;
	local is_subheader = false&lt;br /&gt;
    if options then&lt;br /&gt;
        if not self:shouldShow(options.hideIfEmpty) then&lt;br /&gt;
        	return self&lt;br /&gt;
        end&lt;br /&gt;
		if options.subheader then&lt;br /&gt;
			is_subheader = true&lt;br /&gt;
		end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
	self:addSpacer()&lt;br /&gt;
	&lt;br /&gt;
	local _cell = self.infobox:tag(&amp;#039;tr&amp;#039;):tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, 30)&lt;br /&gt;
	_cell:css(self.headerColors)&lt;br /&gt;
	&lt;br /&gt;
	if not is_subheader then&lt;br /&gt;
		_cell:addClass(&amp;#039;infobox-header&amp;#039;)&lt;br /&gt;
	else &lt;br /&gt;
		_cell:addClass(&amp;#039;infobox-subheader&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if arg.attr then&lt;br /&gt;
		_cell:attr(arg.attr)&lt;br /&gt;
	end&lt;br /&gt;
	if arg.colspan then&lt;br /&gt;
		_cell:attr(&amp;#039;colspan&amp;#039;, arg.colspan)&lt;br /&gt;
	end&lt;br /&gt;
	if arg.rowspan then&lt;br /&gt;
		_cell:attr(&amp;#039;rowspan&amp;#039;, arg.rowspan)&lt;br /&gt;
	end&lt;br /&gt;
	if arg.css then&lt;br /&gt;
		_cell:css(arg.css)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if arg.tag == &amp;#039;th&amp;#039; then&lt;br /&gt;
		_cell:wikitext(arg.content)&lt;br /&gt;
	elseif arg.tag == &amp;#039;argth&amp;#039; then&lt;br /&gt;
		_cell:wikitext(self:getContent(arg.content))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	self:addSpacer()&lt;br /&gt;
	&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Adds an image, or switchable images&lt;br /&gt;
-- @param cols { { tag, content, title }, ... }&lt;br /&gt;
--        tag     &amp;quot;artd&amp;quot; or &amp;quot;td&amp;quot;&lt;br /&gt;
--                Whether or not an it is based off a parameter&lt;br /&gt;
--        content string&lt;br /&gt;
--                The content or the parameter name&lt;br /&gt;
--        title   string or nil&lt;br /&gt;
--                The title, if using switchable images&lt;br /&gt;
-- @param options { hideIfEmpty }&lt;br /&gt;
--        hideIfEmpty { param_name, ... }&lt;br /&gt;
--        param_name string&lt;br /&gt;
--                   The param_name that will be used to check if corresponding &lt;br /&gt;
--                   content is nil&lt;br /&gt;
-- @return self&lt;br /&gt;
--         The current object&lt;br /&gt;
function InfoboxBuilder:addImage(cols, options)&lt;br /&gt;
	if options then&lt;br /&gt;
        if not self:shouldShow(options.hideIfEmpty) then&lt;br /&gt;
        	return self&lt;br /&gt;
    	end&lt;br /&gt;
    end&lt;br /&gt;
	&lt;br /&gt;
	local _cell = self.infobox:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;)&lt;br /&gt;
		:attr(&amp;#039;colspan&amp;#039;, 30)&lt;br /&gt;
	local content = &amp;#039;?&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	local actual_args = {}&lt;br /&gt;
	for _,v in ipairs(cols) do&lt;br /&gt;
		local c = v.content&lt;br /&gt;
		if v.tag == &amp;#039;argtd&amp;#039; then&lt;br /&gt;
			c = self:getContent(c)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if c ~= nil then&lt;br /&gt;
			table.insert(actual_args, { title = v.title, content = c })&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if #actual_args == 0 then&lt;br /&gt;
		_cell:tag(&amp;#039;span&amp;#039;):addClass(&amp;#039;plainlinks&amp;#039;)&lt;br /&gt;
			:wikitext(&lt;br /&gt;
				string.format(&amp;quot;[%s?action=edit ? (edit)]&amp;quot;,&lt;br /&gt;
					tostring(mw.uri.fullUrl(mw.title.getCurrentTitle().text))&lt;br /&gt;
				)&lt;br /&gt;
			)&lt;br /&gt;
		return self&lt;br /&gt;
	elseif #actual_args &amp;lt; 2 then&lt;br /&gt;
		content = actual_args[1].content&lt;br /&gt;
	else&lt;br /&gt;
		local t = {}&lt;br /&gt;
		for _,v in ipairs(actual_args) do&lt;br /&gt;
			table.insert(t, v.title .. &amp;#039;=&amp;#039; .. v.content)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		content = mw.getCurrentFrame():callParserFunction({&lt;br /&gt;
					name = &amp;#039;#tag&amp;#039;,&lt;br /&gt;
					args = { &amp;#039;tabber&amp;#039;, table.concat(t, &amp;#039;|-|&amp;#039;) }&lt;br /&gt;
				})&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	_cell:wikitext(content)&lt;br /&gt;
	&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Adds a row, with columns up to 30 columns spanned&lt;br /&gt;
-- @param cols    { { tag, content, hide, attr, colspan, rowspan, css }, ... }&lt;br /&gt;
--        tag       &amp;quot;th&amp;quot;, &amp;quot;td&amp;quot;, &amp;quot;argth&amp;quot;, &amp;quot;argtd&amp;quot;&lt;br /&gt;
--                  A string containing one of the above, &amp;quot;th&amp;quot; or &amp;quot;td&amp;quot; uses &lt;br /&gt;
--                  content as the wikitext, &amp;quot;argth&amp;quot; or &amp;quot;argtd&amp;quot; uses content as&lt;br /&gt;
--                  the parameter name to produce the suitable content&lt;br /&gt;
--        content   string&lt;br /&gt;
--                  Content to be used as wikitext or a parameter name&lt;br /&gt;
--        attr      {...} or nil&lt;br /&gt;
--                  The attributes of the cell in table form&lt;br /&gt;
--        colspan   number or nil&lt;br /&gt;
--                  The colspan of the cell&lt;br /&gt;
--        rowspan   number or nil&lt;br /&gt;
--                  The rowspan of the cell&lt;br /&gt;
--        css       {...} or nil&lt;br /&gt;
--                  The css of the cell in table form&lt;br /&gt;
--        param_css { func , ... }&lt;br /&gt;
--        func function&lt;br /&gt;
--             A function that returns css in table form&lt;br /&gt;
-- @param options { hideIfEmpty }&lt;br /&gt;
--        hideIfEmpty { param_name, ... }&lt;br /&gt;
--        param_name string&lt;br /&gt;
--                   The param_name that will be used to check if corresponding &lt;br /&gt;
--                   content is nil&lt;br /&gt;
--        default_css {...} or nil&lt;br /&gt;
--                    The css of all cells in table form&lt;br /&gt;
-- @return self&lt;br /&gt;
--         The current object&lt;br /&gt;
function InfoboxBuilder:addRow(cols, options)&lt;br /&gt;
	local default_css = nil&lt;br /&gt;
    if options then&lt;br /&gt;
        if not self:shouldShow(options.hideIfEmpty) then&lt;br /&gt;
        	return self&lt;br /&gt;
        end&lt;br /&gt;
		if options.default_css then&lt;br /&gt;
			default_css = options.default_css&lt;br /&gt;
		end&lt;br /&gt;
    end&lt;br /&gt;
	&lt;br /&gt;
	local _row = self.infobox:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
	for _,v in ipairs(cols) do&lt;br /&gt;
		local _cell = _row:tag(tagmap[v.tag] or &amp;#039;td&amp;#039;)&lt;br /&gt;
						:attr(&amp;#039;colspan&amp;#039;, 30 / #cols)&lt;br /&gt;
		&lt;br /&gt;
		if v.attr then&lt;br /&gt;
			_cell:attr(v.attr)&lt;br /&gt;
		end&lt;br /&gt;
		if v.colspan then&lt;br /&gt;
			_cell:attr(&amp;#039;colspan&amp;#039;, v.colspan)&lt;br /&gt;
		end&lt;br /&gt;
		if v.rowspan then&lt;br /&gt;
			_cell:attr(&amp;#039;rowspan&amp;#039;, v.rowspan)&lt;br /&gt;
		end&lt;br /&gt;
		if default_css then&lt;br /&gt;
			_cell:css(default_css)&lt;br /&gt;
		end&lt;br /&gt;
		if v.css then&lt;br /&gt;
			_cell:css(v.css)&lt;br /&gt;
		end&lt;br /&gt;
		if v.class then&lt;br /&gt;
			_cell:addClass(v.class)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if v.tag == &amp;#039;th&amp;#039; or v.tag == &amp;#039;td&amp;#039; then&lt;br /&gt;
			_cell:wikitext(v.content)&lt;br /&gt;
		elseif v.tag == &amp;#039;argth&amp;#039; or v.tag == &amp;#039;argtd&amp;#039; then&lt;br /&gt;
			local content = self:getContent(v.content)&lt;br /&gt;
			if content then&lt;br /&gt;
				if v.param_css and #v.param_css &amp;gt; 0 then&lt;br /&gt;
					for _,func in ipairs(v.param_css) do&lt;br /&gt;
						local cell_css = func(self.raw_args[v.content])&lt;br /&gt;
						if cell_css then&lt;br /&gt;
							_cell:css(cell_css)&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				if v.classFunc then&lt;br /&gt;
					local cellClass = v.classFunc(self.raw_args[v.content])&lt;br /&gt;
					if cellClass then&lt;br /&gt;
						_cell:addClass(cellClass)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			&lt;br /&gt;
				_cell:wikitext(content)&lt;br /&gt;
			else&lt;br /&gt;
				_cell:tag(&amp;#039;span&amp;#039;):addClass(&amp;#039;plainlinks&amp;#039;)&lt;br /&gt;
				:wikitext(&lt;br /&gt;
					string.format(&amp;quot;[%s?action=edit ? (edit)]&amp;quot;,&lt;br /&gt;
						tostring(mw.uri.fullUrl(mw.title.getCurrentTitle().text))&lt;br /&gt;
					)&lt;br /&gt;
				)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Creates the 30-col layout&lt;br /&gt;
function InfoboxBuilder:addSpacer()&lt;br /&gt;
	local spacer = self.infobox:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
	for i=1,30,1 do&lt;br /&gt;
		spacer:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;colspan&amp;#039;, 1)&lt;br /&gt;
			:css(&amp;#039;width&amp;#039;, &amp;#039;calc(100% / 30)&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Adds links to the bottom of the infobox&lt;br /&gt;
function InfoboxBuilder:addLinks()&lt;br /&gt;
	if not self.finished then&lt;br /&gt;
		self.finished = true&lt;br /&gt;
		&lt;br /&gt;
		self:addRow({&lt;br /&gt;
			{&lt;br /&gt;
				tag = &amp;#039;td&amp;#039;,&lt;br /&gt;
				content = navbar({ self.name, plain = 1, noedit = 1 }),&lt;br /&gt;
				colspan = 30,&lt;br /&gt;
				css = { [&amp;#039;text-align&amp;#039;] = &amp;#039;center&amp;#039; }&lt;br /&gt;
			}&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Generates the infobox&lt;br /&gt;
-- @return string&lt;br /&gt;
--         The html of the infobox&lt;br /&gt;
function InfoboxBuilder:tostring()&lt;br /&gt;
	if not self.finished then&lt;br /&gt;
		self:addLinks()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	self.finished = true&lt;br /&gt;
	&lt;br /&gt;
	return &lt;br /&gt;
		mw.getCurrentFrame():extensionTag{&lt;br /&gt;
			name = &amp;#039;templatestyles&amp;#039;,&lt;br /&gt;
			args = { src = &amp;#039;Template:Infobox/styles.css&amp;#039; }&lt;br /&gt;
		} ..&lt;br /&gt;
		tostring(self.infobox)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return InfoboxBuilder&lt;/div&gt;</summary>
		<author><name>https://projectsekai.miraheze.org/wiki/&gt;ChaoticShadow</name></author>
	</entry>
</feed>