<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://the.satanic.wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AInfoboxV2</id>
	<title>Module:InfoboxV2 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://the.satanic.wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AInfoboxV2"/>
	<link rel="alternate" type="text/html" href="https://the.satanic.wiki/index.php?title=Module:InfoboxV2&amp;action=history"/>
	<updated>2026-04-19T19:54:08Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://the.satanic.wiki/index.php?title=Module:InfoboxV2&amp;diff=15970&amp;oldid=prev</id>
		<title>WikiGOD at 19:59, 27 June 2021</title>
		<link rel="alternate" type="text/html" href="https://the.satanic.wiki/index.php?title=Module:InfoboxV2&amp;diff=15970&amp;oldid=prev"/>
		<updated>2021-06-27T19:59:20Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 19:59, 27 June 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l666&quot;&gt;Line 666:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 666:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     box:addImage( arguments.image,{&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     box:addImage( arguments.image,{&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         &amp;#039;frameless&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         &amp;#039;frameless&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         &#039;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;360px&lt;/del&gt;&#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         &#039;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;300px&lt;/ins&gt;&#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     } )&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     } )&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key zzegtzyr_mw19226-mwjf_:diff:1.41:old-15969:rev-15970:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiGOD</name></author>
	</entry>
	<entry>
		<id>https://the.satanic.wiki/index.php?title=Module:InfoboxV2&amp;diff=15969&amp;oldid=prev</id>
		<title>WikiGOD at 19:58, 27 June 2021</title>
		<link rel="alternate" type="text/html" href="https://the.satanic.wiki/index.php?title=Module:InfoboxV2&amp;diff=15969&amp;oldid=prev"/>
		<updated>2021-06-27T19:58:37Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 19:58, 27 June 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l666&quot;&gt;Line 666:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 666:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     box:addImage( arguments.image,{&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     box:addImage( arguments.image,{&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         &amp;#039;frameless&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         &amp;#039;frameless&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         &#039;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;250px&lt;/del&gt;&#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         &#039;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;360px&lt;/ins&gt;&#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     } )&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     } )&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key zzegtzyr_mw19226-mwjf_:diff:1.41:old-15967:rev-15969:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiGOD</name></author>
	</entry>
	<entry>
		<id>https://the.satanic.wiki/index.php?title=Module:InfoboxV2&amp;diff=15967&amp;oldid=prev</id>
		<title>WikiGOD at 19:46, 27 June 2021</title>
		<link rel="alternate" type="text/html" href="https://the.satanic.wiki/index.php?title=Module:InfoboxV2&amp;diff=15967&amp;oldid=prev"/>
		<updated>2021-06-27T19:46:53Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 19:46, 27 June 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l666&quot;&gt;Line 666:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 666:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     box:addImage( arguments.image,{&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     box:addImage( arguments.image,{&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         &amp;#039;frameless&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         &amp;#039;frameless&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         &#039;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;600px&lt;/del&gt;&#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         &#039;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;250px&lt;/ins&gt;&#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     } )&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     } )&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key zzegtzyr_mw19226-mwjf_:diff:1.41:old-15946:rev-15967:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiGOD</name></author>
	</entry>
	<entry>
		<id>https://the.satanic.wiki/index.php?title=Module:InfoboxV2&amp;diff=15946&amp;oldid=prev</id>
		<title>WikiGOD: Created page with &quot;local Infobox = {} local metatable = {} local methodtable = {}  metatable.__index = methodtable  metatable.__tostring = function( t )     return tostring( t:getBoxText() ) end...&quot;</title>
		<link rel="alternate" type="text/html" href="https://the.satanic.wiki/index.php?title=Module:InfoboxV2&amp;diff=15946&amp;oldid=prev"/>
		<updated>2021-06-26T18:58:43Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local Infobox = {} local metatable = {} local methodtable = {}  metatable.__index = methodtable  metatable.__tostring = function( t )     return tostring( t:getBoxText() ) end...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local Infobox = {}&lt;br /&gt;
local metatable = {}&lt;br /&gt;
local methodtable = {}&lt;br /&gt;
&lt;br /&gt;
metatable.__index = methodtable&lt;br /&gt;
&lt;br /&gt;
metatable.__tostring = function( t )&lt;br /&gt;
    return tostring( t:getBoxText() )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Uses capiunto as the base&lt;br /&gt;
local capiunto = require &amp;#039;capiunto&amp;#039;&lt;br /&gt;
local libraryUtil = require( &amp;#039;libraryUtil&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
--- Returns true if input is a string or number&lt;br /&gt;
--- @param input string|number|table&lt;br /&gt;
--- @return boolean&lt;br /&gt;
local function verifyStringNum( input )&lt;br /&gt;
    return type( input ) == &amp;#039;string&amp;#039; or type( input ) == &amp;#039;number&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- This fills the box with content&lt;br /&gt;
local function addBoxContent( t )&lt;br /&gt;
    if t.contentAdded then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for _, row in ipairs( t.rows ) do&lt;br /&gt;
        local label = tostring( row.label )&lt;br /&gt;
&lt;br /&gt;
        if row.type == &amp;#039;row&amp;#039; then&lt;br /&gt;
            if (type( label ) == &amp;#039;string&amp;#039; or type( label ) == &amp;#039;number&amp;#039;) and ( type( row.data ) == &amp;#039;string&amp;#039; or type( row.data ) == &amp;#039;number&amp;#039; ) then&lt;br /&gt;
                t.capiunto:addRow( label, row.data, row.class, row.rowClass )&lt;br /&gt;
            end&lt;br /&gt;
        elseif row.type == &amp;#039;header&amp;#039; or row.type == &amp;#039;image&amp;#039; then&lt;br /&gt;
            if row.type == &amp;#039;image&amp;#039; and row.rowClass ~= &amp;#039;row-image&amp;#039; then&lt;br /&gt;
                row.rowClass = row.rowClass .. &amp;#039; row-image&amp;#039;&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            -- Only add the header if it has content&lt;br /&gt;
            if mw.ustring.find( row.rowClass, &amp;#039;row-header&amp;#039;, 1, true ) ~= nil and t.headerContentCounts[ label ] ~= nil and t.headerContentCounts[ label ] == 0 then&lt;br /&gt;
                -- skip add&lt;br /&gt;
            else&lt;br /&gt;
                t.capiunto:addRow( nil, label, row.class, row.rowClass )&lt;br /&gt;
            end&lt;br /&gt;
        elseif row.type == &amp;#039;subheader&amp;#039; then&lt;br /&gt;
            t.capiunto:addSubHeader( label, row.class, row.style )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    t.contentAdded = true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Iterate table in key order&lt;br /&gt;
local function spairs( t, orderFn )&lt;br /&gt;
    -- collect the keys&lt;br /&gt;
    local keys = {}&lt;br /&gt;
    for k, v in pairs( t ) do&lt;br /&gt;
        if v ~= nil then&lt;br /&gt;
            keys[ #keys + 1 ] = tostring( k )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- if order function given, sort by it by passing the table and keys a, b,&lt;br /&gt;
    -- otherwise just sort the keys&lt;br /&gt;
    if orderFn then&lt;br /&gt;
        table.sort( keys, function( a, b ) return orderFn( t, a, b ) end )&lt;br /&gt;
    else&lt;br /&gt;
        table.sort( keys )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- return the iterator function&lt;br /&gt;
    local i = 0&lt;br /&gt;
    return function()&lt;br /&gt;
        i = i + 1&lt;br /&gt;
        if keys[ i ] then&lt;br /&gt;
            return keys[ i ], t[ keys[ i ] ]&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Parse all available capiunto options from a table&lt;br /&gt;
--- Returns only non nil values&lt;br /&gt;
---&lt;br /&gt;
--- @param args table&lt;br /&gt;
--- @return table&lt;br /&gt;
local function parseArgs( args )&lt;br /&gt;
    local options = {&lt;br /&gt;
        [ &amp;#039;isChild&amp;#039; ]      = args[ &amp;#039;isChild&amp;#039; ]      or nil,&lt;br /&gt;
        [ &amp;#039;isSubbox&amp;#039; ]     = args[ &amp;#039;isSubbox&amp;#039; ]     or nil,&lt;br /&gt;
&lt;br /&gt;
        [ &amp;#039;title&amp;#039; ]        = args[ &amp;#039;title&amp;#039; ]        or nil,&lt;br /&gt;
        [ &amp;#039;titleClass&amp;#039; ]   = args[ &amp;#039;titleClass&amp;#039; ]   or nil,&lt;br /&gt;
        [ &amp;#039;titleStyle&amp;#039; ]   = args[ &amp;#039;titleStyle&amp;#039; ]   or nil,&lt;br /&gt;
&lt;br /&gt;
        [ &amp;#039;top&amp;#039; ]          = args[ &amp;#039;top&amp;#039; ]          or nil,&lt;br /&gt;
        [ &amp;#039;topClass&amp;#039; ]     = args[ &amp;#039;topClass&amp;#039; ]     or nil,&lt;br /&gt;
        [ &amp;#039;topStyle&amp;#039; ]     = args[ &amp;#039;topStyle&amp;#039; ]     or nil,&lt;br /&gt;
&lt;br /&gt;
        [ &amp;#039;captionStyle&amp;#039; ] = args[ &amp;#039;captionStyle&amp;#039; ] or nil,&lt;br /&gt;
        [ &amp;#039;imageStyle&amp;#039; ]   = args[ &amp;#039;imageStyle&amp;#039; ]   or nil,&lt;br /&gt;
        [ &amp;#039;imageClass&amp;#039; ]   = args[ &amp;#039;imageClass&amp;#039; ]   or nil,&lt;br /&gt;
&lt;br /&gt;
        [ &amp;#039;bodyClass&amp;#039; ]    = args[ &amp;#039;bodyClass&amp;#039; ]    or nil,&lt;br /&gt;
        [ &amp;#039;bodyStyle&amp;#039; ]    = args[ &amp;#039;bodyStyle&amp;#039; ]    or nil,&lt;br /&gt;
        [ &amp;#039;headerStyle&amp;#039; ]  = args[ &amp;#039;headerStyle&amp;#039; ]  or nil,&lt;br /&gt;
        [ &amp;#039;labelStyle&amp;#039; ]   = args[ &amp;#039;labelStyle&amp;#039; ]   or nil,&lt;br /&gt;
        [ &amp;#039;dataStyle&amp;#039; ]    = args[ &amp;#039;dataStyle&amp;#039; ]    or nil,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    local i = 0&lt;br /&gt;
    local keys, values = {}, {}&lt;br /&gt;
    for k, v in pairs( options ) do&lt;br /&gt;
        i = i + 1&lt;br /&gt;
        keys[ i ] = k&lt;br /&gt;
        values[ i ] = v&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    while i &amp;gt; 0 do&lt;br /&gt;
        if keys[ i ] == nil then&lt;br /&gt;
            table.remove( keys, i )&lt;br /&gt;
            table.remove( values, i )&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
        i = i - 1&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local finalOptions = {}&lt;br /&gt;
    for i = 1, #keys do&lt;br /&gt;
        finalOptions[ keys[ i ] ] = values[ i ]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local finalArgs = {}&lt;br /&gt;
    for k, v in pairs( args ) do&lt;br /&gt;
        if finalOptions[ k ] == nil and v ~= nil then&lt;br /&gt;
            finalArgs[ k ] = v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return finalOptions, finalArgs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Replaces a row if labels match and returns the replaced index&lt;br /&gt;
--- Otherwise returns the next free index&lt;br /&gt;
---&lt;br /&gt;
--- @return number New index&lt;br /&gt;
local function replaceInRows( t, targetLabel )&lt;br /&gt;
    for idx, row in ipairs( t.rows ) do&lt;br /&gt;
        if row.label == targetLabel then&lt;br /&gt;
            table.remove( t.rows, idx )&lt;br /&gt;
            return idx&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return #t.rows + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Adds one of three special rows to the infobox&lt;br /&gt;
--- As defined by Capiunto&lt;br /&gt;
--- Available rowTypes are: title (caption), top (first row), bottom (last row)&lt;br /&gt;
---&lt;br /&gt;
--- @param t table The infobox&lt;br /&gt;
--- @param rowType string title, top or bottom&lt;br /&gt;
--- @param class string Row class&lt;br /&gt;
--- @param style string Css style&lt;br /&gt;
--- @return table&lt;br /&gt;
local function addSpecialRow( t, rowType, text, class, style )&lt;br /&gt;
    if t.capiunto == nil then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if verifyStringNum( text ) then&lt;br /&gt;
        t.capiunto.args[ rowType ] = text&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if type( class ) == &amp;#039;string&amp;#039; then&lt;br /&gt;
        t.capiunto.args[ rowType .. &amp;#039;Class&amp;#039; ] = class&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if type( style ) == &amp;#039;string&amp;#039; then&lt;br /&gt;
        t.capiunto.args[ rowType .. &amp;#039;Style&amp;#039; ] = style&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Generates a link to Special:Upload with pre-defined parameters&lt;br /&gt;
---&lt;br /&gt;
--- @param fileName string|nil The filename including the extension&lt;br /&gt;
--- @param title string The title of the infobox&lt;br /&gt;
local function generateUploadLink( fileName, category )&lt;br /&gt;
	local title = mw.title.new( &amp;#039;Special:Upload&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
	if fileName == nil then&lt;br /&gt;
		fileName = mw.title.getCurrentTitle().text .. &amp;#039;.jpg&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if category == nil then&lt;br /&gt;
		category = mw.title.getCurrentTitle().text&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local description = [==[&lt;br /&gt;
=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description={{en|1=%s}}&lt;br /&gt;
|date=%s&lt;br /&gt;
|source=&amp;lt;!-- Please insert link to picture --&amp;gt;&lt;br /&gt;
|author=RSI&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{int:license-header}}==&lt;br /&gt;
{{license-rsi}}&lt;br /&gt;
&lt;br /&gt;
[[Category:%s]]&lt;br /&gt;
	]==]&lt;br /&gt;
&lt;br /&gt;
	description = mw.ustring.format(&lt;br /&gt;
		description,&lt;br /&gt;
		category,&lt;br /&gt;
		mw.getContentLanguage():formatDate(&amp;#039;Y-m-d H:i:s&amp;#039;),&lt;br /&gt;
		category&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
	local parameters = {&lt;br /&gt;
		[ &amp;#039;wpDestFile&amp;#039; ] = fileName,&lt;br /&gt;
		[ &amp;#039;wpLicense&amp;#039; ] = &amp;#039;license-rsi&amp;#039;,&lt;br /&gt;
		[ &amp;#039;wpUploadDescription&amp;#039; ] = description&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return title:fullUrl( parameters, &amp;#039;https&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Generates a link to Special:Uploadwizard with pre-defined parameters&lt;br /&gt;
---&lt;br /&gt;
--- @param fileName string|nil The filename excluding the extension&lt;br /&gt;
--- @param title string The title of the infobox&lt;br /&gt;
local function generateUploadwizardLink( fileName, category )&lt;br /&gt;
	local title = mw.title.new( &amp;#039;Special:Uploadwizard&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
	if fileName == nil then&lt;br /&gt;
		fileName = mw.title.getCurrentTitle().text&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if category == nil then&lt;br /&gt;
		category = mw.title.getCurrentTitle().text&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local parameters = {&lt;br /&gt;
		[ &amp;#039;categories&amp;#039; ] = category,&lt;br /&gt;
		[ &amp;#039;title&amp;#039; ] = fileName,&lt;br /&gt;
		[ &amp;#039;description&amp;#039; ] = fileName,&lt;br /&gt;
		-- Missing: Date&lt;br /&gt;
		-- Missing pre license select&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return title:fullUrl( parameters, &amp;#039;https&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Base method to add a row&lt;br /&gt;
--- @see https://www.mediawiki.org/wiki/Extension:Capiunto/Infobox&lt;br /&gt;
--- @param t table The instance&lt;br /&gt;
--- @param rowLabel string Row label&lt;br /&gt;
--- @param rowData string Row content (can be anything)&lt;br /&gt;
--- @param dataClass string CSS class added to data&lt;br /&gt;
--- @param rowCssClass string CSS class added to row&lt;br /&gt;
--- @param rowStyle string CSS style only used if type is &amp;#039;subheader&amp;#039;!&lt;br /&gt;
--- @param type string Either &amp;#039;row&amp;#039;, &amp;#039;header&amp;#039;, &amp;#039;image&amp;#039; or &amp;#039;subheader&amp;#039;&lt;br /&gt;
function methodtable.addRow( t, rowLabel, rowData, dataClass, rowCssClass, rowStyle, type )&lt;br /&gt;
    t.checkSelf( t, &amp;#039;addRow&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    type = type or &amp;#039;row&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    if t.removeEmpty == true then&lt;br /&gt;
        if type == &amp;#039;row&amp;#039; and ( rowData == nil or rowData == t.emptyString ) then&lt;br /&gt;
            return t&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if type == &amp;#039;header&amp;#039; then&lt;br /&gt;
        t.currentHeader = rowLabel&lt;br /&gt;
&lt;br /&gt;
        if t.headerContentCounts[ rowLabel ] == nil then&lt;br /&gt;
            local count = 0&lt;br /&gt;
            -- A &amp;quot;single&amp;quot; header is a header without content&lt;br /&gt;
            -- This is used to circumvent removing the header as it as no content&lt;br /&gt;
            if dataClass == &amp;#039;single&amp;#039; then&lt;br /&gt;
                count = 1&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            t.headerContentCounts[ rowLabel ] = count&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- increment the header count&lt;br /&gt;
    if t.currentHeader ~= nil and type == &amp;#039;row&amp;#039; and t.headerContentCounts[ t.currentHeader ] ~= nil then&lt;br /&gt;
        t.headerContentCounts[ t.currentHeader ] = t.headerContentCounts[ t.currentHeader ] + 1&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local pos = -1&lt;br /&gt;
    if t.allowReplace == true and #t.rows &amp;gt; 0 then&lt;br /&gt;
        pos = replaceInRows( t, rowLabel )&lt;br /&gt;
    else&lt;br /&gt;
        t.rowCount = t.rowCount + 1&lt;br /&gt;
        pos = t.rowCount&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if rowCssClass == nil then&lt;br /&gt;
        rowCssClass = &amp;#039;row-&amp;#039; .. type&lt;br /&gt;
        if rowCssClass == &amp;#039;row-row&amp;#039; then&lt;br /&gt;
            rowCssClass = &amp;#039;row&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not mw.ustring.match( rowCssClass, &amp;#039;row&amp;#039; ) then&lt;br /&gt;
        local toAdd = type&lt;br /&gt;
        if toAdd ~= &amp;#039;row&amp;#039; then&lt;br /&gt;
            toAdd = &amp;#039;row-&amp;#039; .. type&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        rowCssClass = rowCssClass .. &amp;#039; &amp;#039; .. toAdd&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    table.insert( t.rows, pos, {&lt;br /&gt;
        type = type,&lt;br /&gt;
        label = rowLabel,&lt;br /&gt;
        data = rowData or nil,&lt;br /&gt;
        class = dataClass or nil,&lt;br /&gt;
        rowClass = rowCssClass,&lt;br /&gt;
        style = rowStyle or nil&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Adds a header to the infobox&lt;br /&gt;
function methodtable.addHeader( t, text, class, rowClass )&lt;br /&gt;
    t.checkSelf( t, &amp;#039;addHeader&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    rowClass = ( rowClass or &amp;#039;&amp;#039; ) .. &amp;#039; row-header&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    return t:addRow( text, nil, class, rowClass, nil, &amp;#039;header&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Adds a title row to the infobox&lt;br /&gt;
function methodtable.addTitle( t, text, class, rowClass )&lt;br /&gt;
    t.checkSelf( t, &amp;#039;addTitle&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    rowClass = ( rowClass or &amp;#039;&amp;#039; ) .. &amp;#039; row-title&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    return t:addRow( text, nil, class, rowClass, nil, &amp;#039;header&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Adds a subheader to the infobox&lt;br /&gt;
function methodtable.addSubHeader( t, text, class, style )&lt;br /&gt;
    t.checkSelf( t, &amp;#039;addSubHeader&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    return t:addRow( text, nil, class, &amp;#039;row-subheader&amp;#039;, style, &amp;#039;subheader&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Adds a caption to the infobox&lt;br /&gt;
function methodtable.addCaption( t, text, class, style )&lt;br /&gt;
    t.checkSelf( t, &amp;#039;addCaption&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    return addSpecialRow( t, &amp;#039;title&amp;#039;, text, class, style )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Adds a caption to the infobox&lt;br /&gt;
function methodtable.addTop( t, text, class, style )&lt;br /&gt;
    t.checkSelf( t, &amp;#039;addTop&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    return addSpecialRow( t, &amp;#039;top&amp;#039;, text, class, style )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Adds a bottom to the infobox&lt;br /&gt;
function methodtable.addBottom( t, text, class, style )&lt;br /&gt;
    t.checkSelf( t, &amp;#039;addBottom&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    return addSpecialRow( t, &amp;#039;bottom&amp;#039;, text, class, style )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Adds an image to the infobox&lt;br /&gt;
--- @param file string Wiki page filename&lt;br /&gt;
--- @param options table Image options&lt;br /&gt;
--- @param checkExistence boolean True to check if the file exists&lt;br /&gt;
function methodtable.addImage( t, file, options, checkExistence )&lt;br /&gt;
    t.checkSelf( t, &amp;#039;addImage&amp;#039; )&lt;br /&gt;
    local isPlaceholder = false&lt;br /&gt;
&lt;br /&gt;
    if type( file ) ~= &amp;#039;string&amp;#039; then&lt;br /&gt;
        if t.displayPlaceholder == false then&lt;br /&gt;
            return&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        file = t.placeholderImage&lt;br /&gt;
        isPlaceholder = true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local exists = true&lt;br /&gt;
    local title = mw.title.new( mw.uri.decode( file, &amp;#039;WIKI&amp;#039; ), 6 )&lt;br /&gt;
&lt;br /&gt;
    if title == nil then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if type( options ) == &amp;#039;string&amp;#039; then&lt;br /&gt;
        options = {&lt;br /&gt;
            [ &amp;#039;rowClass&amp;#039; ] = options&lt;br /&gt;
        }&lt;br /&gt;
    else&lt;br /&gt;
        options = options or {}&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if checkExistence ~= nil and checkExistence == true then&lt;br /&gt;
        exists = title.exists&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local class = options[ &amp;#039;rowClass&amp;#039; ] or nil&lt;br /&gt;
&lt;br /&gt;
    local function buildOptions( imageOptions )&lt;br /&gt;
        local out = {}&lt;br /&gt;
&lt;br /&gt;
        for k, v in pairs( imageOptions ) do&lt;br /&gt;
            if k ~= &amp;#039;rowClass&amp;#039; and type( k ) == &amp;#039;string&amp;#039; and type( v ) == &amp;#039;string&amp;#039; then&lt;br /&gt;
                table.insert( out, k .. &amp;#039;=&amp;#039; .. v )&lt;br /&gt;
            elseif type( k ) == &amp;#039;number&amp;#039; then&lt;br /&gt;
                table.insert( out, v )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        return table.concat( out, &amp;#039;|&amp;#039; )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if isPlaceholder == true then&lt;br /&gt;
    	options[ &amp;#039;link&amp;#039; ] = generateUploadLink()&lt;br /&gt;
    	if class == nil then&lt;br /&gt;
    		class = &amp;#039;placeholder&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			class = class .. &amp;#039; placeholder&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    local imageOptions = buildOptions( options )&lt;br /&gt;
    if imageOptions ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        imageOptions = &amp;#039;|&amp;#039; .. imageOptions&lt;br /&gt;
        &lt;br /&gt;
        if isPlaceholder == true then&lt;br /&gt;
        	imageOptions = imageOptions .. &amp;#039;|Klicke um Bild hochzuladen&amp;#039;&lt;br /&gt;
    	end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local header = &amp;#039;[[&amp;#039; .. title.prefixedText .. imageOptions .. &amp;#039;]]&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    if exists == false then&lt;br /&gt;
        header = &amp;#039;Datei fehlt&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return t:addRow( header, nil, class, &amp;#039;row-image&amp;#039;, nil, &amp;#039;image&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Allows to add arbitrary rows from template args&lt;br /&gt;
--- @param args table Template arguments&lt;br /&gt;
--- @param prefix string|nil An optional prefix that each argument must have to be added as a row&lt;br /&gt;
--- @param allowedKeys table|nil An optional table of keys that are allowed as rows, are passed to ustring.match&lt;br /&gt;
---&lt;br /&gt;
--- Example param = !row -&amp;gt; Only Template arguments in the form of |!row...=Content are added as Rows&lt;br /&gt;
--- The prefix gets replaced from each key: |!rowLabel=Content  =&amp;gt; Label=Content&lt;br /&gt;
---&lt;br /&gt;
--- The row type can be set by adding &amp;#039;subheader&amp;#039; or &amp;#039;header&amp;#039; to the key&lt;br /&gt;
--- Example: |header1=Content =&amp;gt; Header row with content &amp;#039;content&amp;#039; added&lt;br /&gt;
--- Multiple headers must be suffixed by numbers&lt;br /&gt;
---&lt;br /&gt;
--- !!! NOTE !!!&lt;br /&gt;
--- Lua tables do not preserve order, to mitigate this, this module SORTS the given arguments ALPHABETICALLY&lt;br /&gt;
--- You can prefix arguments with numbers to preserve the order&lt;br /&gt;
--- Example Template:&lt;br /&gt;
--- {{Infobox&lt;br /&gt;
--- |1-header=Header for block one&lt;br /&gt;
--- |1.1-RowLabel=This is the content for row 1.1&lt;br /&gt;
--- |1.2-RowLabel=This again is the content&lt;br /&gt;
--- |2-subheader=Subheader&lt;br /&gt;
--- |2.1-Label=Content&lt;br /&gt;
--- |2.2...&lt;br /&gt;
--- }}&lt;br /&gt;
---&lt;br /&gt;
--- Example Module Call:&lt;br /&gt;
--- infobox.addRowsFromArgs({&lt;br /&gt;
---   [ &amp;#039;1-header&amp;#039; ] = &amp;#039;Header for block one&amp;#039;,&lt;br /&gt;
---   [ &amp;#039;1.1-RowLabel&amp;#039; ] = &amp;#039;This is...&amp;#039;,&lt;br /&gt;
--- })&lt;br /&gt;
function methodtable.addRowsFromArgs( t, args, prefix, allowedKeys )&lt;br /&gt;
    t.checkSelf( t, &amp;#039;addRowsFromArgs&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    if type( args ) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    _, args = parseArgs( args )&lt;br /&gt;
&lt;br /&gt;
    local function canAdd( key )&lt;br /&gt;
        if key == &amp;#039;image&amp;#039; then -- Image is added separately&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if prefix == nil then&lt;br /&gt;
            if type( allowedKeys ) == &amp;#039;table&amp;#039; then&lt;br /&gt;
                for _, allowed in pairs( allowedKeys ) do&lt;br /&gt;
                    if mw.ustring.match( key, allowed ) then&lt;br /&gt;
                        return true&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                return false&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            return true&lt;br /&gt;
        elseif type( prefix ) == &amp;#039;string&amp;#039; then&lt;br /&gt;
            return mw.ustring.match( key, prefix )&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for k, v in spairs( args ) do&lt;br /&gt;
        if type( k ) == &amp;#039;string&amp;#039; and type( v ) == &amp;#039;string&amp;#039; then&lt;br /&gt;
            if canAdd( k ) then&lt;br /&gt;
                if prefix~= nil and type( prefix ) == &amp;#039;string&amp;#039; then&lt;br /&gt;
                    k = mw.ustring.gsub( k, prefix, &amp;#039;&amp;#039; )&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                -- Remove Digits - and . at start of label&lt;br /&gt;
                k = mw.ustring.gsub( k, &amp;#039;^[%d%-%.]+&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
                -- Removes digits at the end, should enable MW Infobox behaviour&lt;br /&gt;
                k = mw.ustring.gsub( k, &amp;#039;[%d]+$&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
                local splitted = mw.text.split( v, &amp;#039;&amp;lt;&amp;gt;&amp;#039;, true )&lt;br /&gt;
&lt;br /&gt;
                local label = splitted[1]&lt;br /&gt;
                local class = splitted[2] or &amp;#039;&amp;#039;&lt;br /&gt;
                local rowClass = splitted[3] or &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
                if mw.ustring.match( k, &amp;#039;subheader&amp;#039; ) then&lt;br /&gt;
                    t:addSubHeader( v )&lt;br /&gt;
                elseif mw.ustring.match( k, &amp;#039;header&amp;#039; ) then&lt;br /&gt;
                    t:addHeader( label, class, rowClass )&lt;br /&gt;
                elseif mw.ustring.match( k, &amp;#039;title&amp;#039; ) then&lt;br /&gt;
                    t:addTitle( label, class, rowClass )&lt;br /&gt;
                elseif mw.ustring.match( k, &amp;#039;caption&amp;#039; ) then&lt;br /&gt;
                    t:addCaption( label, class, rowClass )&lt;br /&gt;
                elseif mw.ustring.match( k, &amp;#039;top&amp;#039; ) then&lt;br /&gt;
                    t:addTop( label, class, rowClass )&lt;br /&gt;
                elseif mw.ustring.match( k, &amp;#039;bottom&amp;#039; ) then&lt;br /&gt;
                    t:addBottom( label, class, rowClass )&lt;br /&gt;
                else&lt;br /&gt;
                    t:addRow( k, label, class, rowClass )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Flag to allow or disable row replacing&lt;br /&gt;
--- @param flag boolean&lt;br /&gt;
function methodtable.setAllowReplace( t, flag )&lt;br /&gt;
    t.checkSelf( t, &amp;#039;setAllowReplace&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    t.allowReplace = flag&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns the raw capiunto box&lt;br /&gt;
--- @return table&lt;br /&gt;
function methodtable.getBox( t )&lt;br /&gt;
    t.checkSelf( t, &amp;#039;getBox&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    addBoxContent( t )&lt;br /&gt;
&lt;br /&gt;
    return t.capiunto&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns the table string&lt;br /&gt;
--- @return string&lt;br /&gt;
function methodtable.getBoxText( t )&lt;br /&gt;
    t.checkSelf( t, &amp;#039;getBoxText&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    return tostring( t:getBox() )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Init the infobox&lt;br /&gt;
--- @param options table|nil Option table passed to capiunto.create&lt;br /&gt;
function Infobox.create( options )&lt;br /&gt;
    local instance = {&lt;br /&gt;
        -- Table containing Header = count of rows&lt;br /&gt;
        headerContentCounts = {},&lt;br /&gt;
        -- The currently active header&lt;br /&gt;
        currentHeader = nil,&lt;br /&gt;
        -- The row tables&lt;br /&gt;
        rows = {},&lt;br /&gt;
        -- Total number of rows in the box&lt;br /&gt;
        rowCount = 0,&lt;br /&gt;
        -- Capiunto table&lt;br /&gt;
        capiunto = {},&lt;br /&gt;
        -- Flag to stop adding rows to the box&lt;br /&gt;
        contentAdded = false,&lt;br /&gt;
        -- Flag to enable replacing already added rows&lt;br /&gt;
        allowReplace = false,&lt;br /&gt;
        -- Flag to discard empty rows&lt;br /&gt;
        removeEmpty = false,&lt;br /&gt;
        -- Optional string which is valued as empty&lt;br /&gt;
        emptyString = nil,&lt;br /&gt;
        -- Display a placeholder image if addImage does not find an image&lt;br /&gt;
        displayPlaceholder = true,&lt;br /&gt;
        -- Placeholder Image&lt;br /&gt;
        placeholderImage = &amp;#039;Platzhalter.webp&amp;#039;,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if options.allowReplace ~= nil then&lt;br /&gt;
        instance.allowReplace = options.allowReplace&lt;br /&gt;
        options.allowReplace = nil&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options.removeEmpty ~= nil then&lt;br /&gt;
        instance.removeEmpty = true&lt;br /&gt;
        options.removeEmpty = nil&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options.emptyString ~= nil then&lt;br /&gt;
        instance.emptyString = options.emptyString&lt;br /&gt;
        options.emptyString = nil&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options.displayPlaceholder ~= nil then&lt;br /&gt;
        instance.displayPlaceholder = options.displayPlaceholder&lt;br /&gt;
        options.displayPlaceholder = nil&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options.placeholderImage ~= nil then&lt;br /&gt;
        instance.placeholderImage = options.placeholderImage&lt;br /&gt;
        options.placeholderImage = nil&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    setmetatable( instance, metatable )&lt;br /&gt;
&lt;br /&gt;
    instance.capiunto = capiunto.create( parseArgs( options or {} ) )&lt;br /&gt;
&lt;br /&gt;
    instance.checkSelf = libraryUtil.makeCheckSelfFunction( &amp;#039;Infobox&amp;#039;, &amp;#039;instance&amp;#039;, instance, &amp;#039;Method Call&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    return instance&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Create a infobox from args&lt;br /&gt;
--- @param frame table&lt;br /&gt;
--- @return string&lt;br /&gt;
function Infobox.fromArgs( frame )&lt;br /&gt;
    local arguments = require( &amp;#039;Module:Arguments&amp;#039; ).getArgs( frame )&lt;br /&gt;
    local options, args = parseArgs( arguments )&lt;br /&gt;
&lt;br /&gt;
    if options.bodyClass == nil then&lt;br /&gt;
        options.bodyClass = &amp;#039;floatright&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local box = Infobox.create( options )&lt;br /&gt;
&lt;br /&gt;
    box:addImage( arguments.image,{&lt;br /&gt;
        &amp;#039;frameless&amp;#039;,&lt;br /&gt;
        &amp;#039;600px&amp;#039;&lt;br /&gt;
    } )&lt;br /&gt;
&lt;br /&gt;
    if arguments.image ~= nil then&lt;br /&gt;
        arguments.image = nil&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    box:addRowsFromArgs( args )&lt;br /&gt;
&lt;br /&gt;
    return tostring( box )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Infobox&lt;/div&gt;</summary>
		<author><name>WikiGOD</name></author>
	</entry>
</feed>