<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://atmospedia.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wooseph</id>
	<title>Atmospedia - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://atmospedia.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wooseph"/>
	<link rel="alternate" type="text/html" href="https://atmospedia.org/wiki/Special:Contributions/Wooseph"/>
	<updated>2026-11-15T13:04:56Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://atmospedia.org/index.php?title=Module:Navbar/configuration&amp;diff=226</id>
		<title>Module:Navbar/configuration</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Module:Navbar/configuration&amp;diff=226"/>
		<updated>2024-07-13T22:36:54Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;return {&lt;br /&gt;
	[&#039;templatestyles&#039;] = &#039;Module:Navbar/styles.css&#039;,&lt;br /&gt;
	[&#039;hlist_templatestyles&#039;] = &#039;Hlist/styles.css&#039;,&lt;br /&gt;
	[&#039;box_text&#039;] = &#039;This box: &#039;,			-- default text box when not plain or mini&lt;br /&gt;
	[&#039;title_namespace&#039;] = &#039;Template&#039;,		-- namespace to default to for title&lt;br /&gt;
	[&#039;invalid_title&#039;] = &#039;Invalid title &#039;,&lt;br /&gt;
	[&#039;classes&#039;] = { -- set a line to nil if you don&#039;t want it&lt;br /&gt;
		[&#039;navbar&#039;] = &#039;navbar&#039;,&lt;br /&gt;
		[&#039;plainlinks&#039;] = &#039;plainlinks&#039;, -- plainlinks&lt;br /&gt;
		[&#039;horizontal_list&#039;] = &#039;hlist&#039;, -- horizontal list class&lt;br /&gt;
		[&#039;mini&#039;] = &#039;navbar-mini&#039;, -- class indicating small links in the navbar&lt;br /&gt;
		[&#039;this_box&#039;] = &#039;navbar-boxtext&#039;,&lt;br /&gt;
		[&#039;brackets&#039;] = &#039;navbar-brackets&#039;,&lt;br /&gt;
		-- &#039;collapsible&#039; is the key for a class to indicate the navbar is&lt;br /&gt;
		-- setting up the collapsible element in addition to the normal&lt;br /&gt;
		-- navbar.&lt;br /&gt;
		[&#039;collapsible&#039;] = &#039;navbar-collapse&#039;,&lt;br /&gt;
		[&#039;collapsible_title_mini&#039;] = &#039;navbar-ct-mini&#039;,&lt;br /&gt;
		[&#039;collapsible_title_full&#039;] = &#039;navbar-ct-full&#039;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
	<entry>
		<id>https://atmospedia.org/index.php?title=Template:Navbox/doc&amp;diff=224</id>
		<title>Template:Navbox/doc</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Template:Navbox/doc&amp;diff=224"/>
		<updated>2024-07-03T20:53:29Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{for|vertically-aligned navigation|Template:Sidebar}}&lt;br /&gt;
{{documentation subpage}}&lt;br /&gt;
{{high use}}&lt;br /&gt;
{{Template display|nomobile}}&lt;br /&gt;
{{Lua|Module:Navbox}}&lt;br /&gt;
{{Navbox suite}}&lt;br /&gt;
{{Lua sidebar}}&lt;br /&gt;
&lt;br /&gt;
This template allows a [[Wikipedia:Navigation template|navigational template]] to be set up relatively quickly by supplying it with one or more lists of links. It comes equipped with default styles that should work for most navigational templates. Changing the default styles is possible, but not recommended. Using this template, or one of its &amp;quot;Navbox suite&amp;quot; sister templates, is highly recommended for standardization of navigational templates, and for ease of use.&lt;br /&gt;
&lt;br /&gt;
{{Navbox visibility}}&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
Please remove the parameters that are left blank.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;{{Navbox&lt;br /&gt;
| name       = {{subst:PAGENAME}}{{subst:void|Don&#039;t change anything on this line. It will change itself when you save.}}&lt;br /&gt;
| title      =&lt;br /&gt;
| listclass  = hlist&lt;br /&gt;
| state      = {{{state|}}}&lt;br /&gt;
&lt;br /&gt;
| above      =&lt;br /&gt;
| image      =&lt;br /&gt;
&lt;br /&gt;
| group1     =&lt;br /&gt;
| list1      =&lt;br /&gt;
&lt;br /&gt;
| group2     =&lt;br /&gt;
| list2      =&lt;br /&gt;
&lt;br /&gt;
| group3     =&lt;br /&gt;
| list3      =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ... --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| below      =&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameter list ==&lt;br /&gt;
{{{{PAGENAMETDOC}}&lt;br /&gt;
| name   = Navbox/doc&lt;br /&gt;
| state  = uncollapsed&lt;br /&gt;
| title  = {{{title}}}&lt;br /&gt;
| above  = {{{above}}}&lt;br /&gt;
| image  = {{{image}}}&lt;br /&gt;
| group1 = {{{group1}}}&lt;br /&gt;
| list1  = {{{list1}}}&lt;br /&gt;
| group2 = {{{group2}}}&lt;br /&gt;
| list2  = {{{list2}}}&lt;br /&gt;
| group3 = {{{group3}}}&lt;br /&gt;
| list3  = {{{list3}}}&lt;br /&gt;
| group4 = {{{group4}}}&lt;br /&gt;
| list4  = {{{list4}}}&lt;br /&gt;
| below  = {{{below}}} &amp;lt;br /&amp;gt; See alternate navbox formats under: [[#Layout of table|&#039;&#039;Layout of table&#039;&#039;]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The navbox uses lowercase parameter names, as shown in the box (&#039;&#039;above&#039;&#039;). The required &#039;&#039;name&#039;&#039; and &#039;&#039;title&#039;&#039; will create a one-line box if other parameters are omitted.&lt;br /&gt;
&lt;br /&gt;
Notice &amp;quot;group1&amp;quot; (etc.) is optional, as are sections named &amp;quot;above/below&amp;quot;.&lt;br /&gt;
{{clear}}&lt;br /&gt;
The basic and most common parameters are as follows (see [[#Parameter descriptions|below]] for the full list):&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; – the name (Wikipedia location) of the template.&lt;br /&gt;
: &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt; – text in the title bar, such as: &amp;lt;nowiki&amp;gt;[[Widget stuff]]&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
: &amp;lt;code&amp;gt;listclass&amp;lt;/code&amp;gt; – a CSS class for the list cells, usually &amp;lt;code&amp;gt;hlist&amp;lt;/code&amp;gt; for horizontal lists. Alternatively, use bodyclass for the whole box.&lt;br /&gt;
: &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; – controls when a navbox is expanded or collapsed.&lt;br /&gt;
: &amp;lt;code&amp;gt;titlestyle&amp;lt;/code&amp;gt; – a CSS style for the title-bar, such as: &amp;lt;code&amp;gt;background: gray;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;groupstyle&amp;lt;/code&amp;gt; – a CSS style for the group-cells, such as: &amp;lt;code&amp;gt;background: #eee;&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;above&amp;lt;/code&amp;gt; – text to appear above the group/list section (could be a list of overall wikilinks).&lt;br /&gt;
: &amp;lt;code&amp;gt;image&amp;lt;/code&amp;gt; – an optional right-side image, coded as the whole image, such as: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[File:&amp;lt;/nowiki&amp;gt;&amp;lt;var&amp;gt;XX&amp;lt;/var&amp;gt;&amp;lt;nowiki&amp;gt;.jpg|80px|alt=Alternate text]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:: Note that most of such images don&#039;t comply with [[MOS:DECOR]] and should be removed at sight.&lt;br /&gt;
: &amp;lt;code&amp;gt;imageleft&amp;lt;/code&amp;gt; – an optional left-side image (code the same as the &amp;quot;image&amp;quot; parameter).&lt;br /&gt;
: &amp;lt;code&amp;gt;group&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt; – the left-side text before list-n (if group-n omitted, list-n extends to the left edge of the box, and defaults to &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; styling).&lt;br /&gt;
: &amp;lt;code&amp;gt;list&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt; – text listing wikilinks using a [[Help:List|wikilist]] format.&lt;br /&gt;
: &amp;lt;code&amp;gt;below&amp;lt;/code&amp;gt; – optional text to appear below the group/list section.&lt;br /&gt;
&lt;br /&gt;
== Parameter descriptions ==&lt;br /&gt;
The following is a complete list of parameters for using {{tl|Navbox}}. In most cases, the only required parameters are &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;list1&amp;lt;/code&amp;gt;, though [[Template:Navbox/doc#Child navboxes|child navboxes]] do not even require those to be set.&lt;br /&gt;
&lt;br /&gt;
{{tl|Navbox}} shares numerous common parameter names with its sister templates, {{tl|Navbox with columns}} and {{tl|Navbox with collapsible groups}}, for consistency and ease of use. Parameters marked with an asterisk (*) are common to all three master templates.&lt;br /&gt;
&lt;br /&gt;
=== Setup parameters ===&lt;br /&gt;
; &#039;&#039;name&#039;&#039;*&lt;br /&gt;
: The name of the template, which is needed for the &amp;quot;V&amp;amp;nbsp;• T&amp;amp;nbsp;• E&amp;quot; (&amp;quot;View&amp;amp;nbsp;• Talk&amp;amp;nbsp;• Edit&amp;quot;) links to work properly on all pages where the template is used. You can enter &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{subst:PAGENAME}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; for this value as a shortcut. The name parameter is only mandatory if a &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt; is specified, and the &amp;lt;code&amp;gt;border&amp;lt;/code&amp;gt; parameter is not set, and the &amp;lt;code&amp;gt;navbar&amp;lt;/code&amp;gt; parameter is not used to disable the navbar.&lt;br /&gt;
; &#039;&#039;state&#039;&#039;* &amp;lt;span style=&amp;quot;font-weight:normal;&amp;quot;&amp;gt;[&amp;lt;code&amp;gt;autocollapse, collapsed, expanded, plain, off&amp;lt;/code&amp;gt;]&amp;lt;/span&amp;gt;{{anchor|Autocollapse}}&lt;br /&gt;
:* Defaults to &amp;lt;code&amp;gt;autocollapse&amp;lt;/code&amp;gt;. A navbox with &amp;lt;code&amp;gt;autocollapse&amp;lt;/code&amp;gt; will start out collapsed if there are two or more collapsible elements on the same page. Otherwise, the navbox will be expanded. For the technically minded, see [[MediaWiki:Common.js]] (search for &amp;quot;autocollapse&amp;quot;).&lt;br /&gt;
:* If set to &amp;lt;code&amp;gt;collapsed&amp;lt;/code&amp;gt;, the navbox will always start out in a collapsed state.&lt;br /&gt;
:* If set to &amp;lt;code&amp;gt;expanded&amp;lt;/code&amp;gt;, the navbox will always start out in an expanded state.&lt;br /&gt;
:* If set to &amp;lt;code&amp;gt;plain&amp;lt;/code&amp;gt;, the navbox will always be expanded with no [hide] link on the right, and the title will remain centered (by using padding to offset the &amp;lt;small&amp;gt;V&amp;amp;nbsp;• T&amp;amp;nbsp;• E&amp;lt;/small&amp;gt; links).&lt;br /&gt;
:* If set to &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;, the navbox will always be expanded with no [hide] link on the right, but no padding will be used to keep the title centered. This is for advanced use only; the &amp;quot;plain&amp;quot; option should suffice for most applications where the [show]/[hide] button needs to be hidden.&lt;br /&gt;
: To show the box when standalone (non-included) but then auto-hide contents when in an article, put &amp;quot;expanded&amp;quot; inside {{tag|noinclude|p}} tags. This setting will force the box to be visible when standalone (even when followed by other boxes), displaying &amp;quot;[hide]&amp;quot;, but then it will auto-collapse the box when stacked inside an article: &lt;br /&gt;
:: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;| state =&amp;amp;nbsp;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;{{tag|noinclude|content=expanded}}&lt;br /&gt;
:Often times, editors will want a default initial state for a navbox, which may be overridden in an article. Here is the trick to do this:&lt;br /&gt;
:* In your intermediate template, create a parameter also named &amp;quot;state&amp;quot; as a pass-through like this: &amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;| state = {{{state&amp;lt;includeonly&amp;gt;|your_desired_initial_state&amp;lt;/includeonly&amp;gt;}}}&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
:* The {{tag|includeonly|o}}&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; will make the template expanded when viewing the template page by itself.&lt;br /&gt;
:** Example 1: {{tl|Peso}} with &#039;&#039;autocollapse&#039;&#039; as the default initial state. [[Catalan peseta]] transcludes it and has only one navbox; thus, the peso navbox shows. [[Chilean peso]] has more than two navboxes; thus, the peso navbox collapses.&lt;br /&gt;
:** Example 2: {{tl|Historical currencies of Hungary}} with &#039;&#039;expanded&#039;&#039; as the default initial state, as such: &amp;lt;pre&amp;gt;| state = {{{state&amp;lt;includeonly&amp;gt;|expanded&amp;lt;/includeonly&amp;gt;}}}&amp;lt;/pre&amp;gt; All transcluding articles show the content by default, unless there is a hypothetical article that specifies &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{templatename|state=collapsed}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; when transcluding.&lt;br /&gt;
:** Example 3: {{tl|Tourism}} with &#039;&#039;collapsed&#039;&#039; as the default initial state, as such: &amp;lt;pre&amp;gt;| state = {{{state&amp;lt;includeonly&amp;gt;|collapsed&amp;lt;/includeonly&amp;gt;}}}&amp;lt;/pre&amp;gt; All transcluding articles will show the template as collapsed by default, but the template will still be uncollapsed when displayed on its own page.&lt;br /&gt;
:* The template {{tl|Collapsible option}} explains how to use the &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; parameter. It can be added to a {{tag|noinclude|p}} section after the template definition or to the instructions on the {{tl|documentation subpage}}.&lt;br /&gt;
; &#039;&#039;navbar&#039;&#039;*&lt;br /&gt;
: If set to &amp;lt;code&amp;gt;plain&amp;lt;/code&amp;gt;, the &amp;lt;span style=&amp;quot;font-size: 88%;&amp;quot;&amp;gt;V&amp;amp;nbsp;• T&amp;amp;nbsp;• E&amp;lt;/span&amp;gt; links on the left side of the titlebar will not be displayed, and padding will be automatically used to keep the title centered. Use &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; to remove the &amp;lt;span style=&amp;quot;font-size: 88%;&amp;quot;&amp;gt;V&amp;amp;nbsp;• T&amp;amp;nbsp;• E&amp;lt;/span&amp;gt; links, but not apply padding (this is for advanced use only; the &amp;quot;plain&amp;quot; option should suffice for most applications where a navbar is not desired). It is highly recommended that one not hide the navbar, in order to make it easier for users to edit the template, and to keep a standard style across pages.&lt;br /&gt;
; &#039;&#039;border&#039;&#039;*&lt;br /&gt;
: &#039;&#039;See later section on [[#Child navboxes|using navboxes within one another]] for examples and a more complete description.&#039;&#039; If set to &amp;lt;code&amp;gt;child&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;subgroup&amp;lt;/code&amp;gt;, then the navbox can be used as a borderless child that fits snugly in another navbox. The border is hidden and there is no padding on the sides of the table, so it fits into the &#039;&#039;list&#039;&#039; area of its parent navbox. If set to &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;, then the border is hidden and padding is removed, and the navbox may be used as a child of another container (do not use the &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; option inside of another navbox; similarly, only use the &amp;lt;code&amp;gt;child&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;subgroup&amp;lt;/code&amp;gt; option inside of another navbox). If set to anything else (default), then a regular navbox is displayed with a 1px border. An alternate way to specify the border to be a subgroup style is like this (i.e. use the first unnamed parameter instead of the named &#039;&#039;border&#039;&#039; parameter):&lt;br /&gt;
:&amp;lt;pre&amp;gt;{{Navbox|child|...}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cells ===&lt;br /&gt;
; &#039;&#039;title&#039;&#039;*&lt;br /&gt;
: Text that appears centered in the top row of the table. It is usually the template&#039;s topic, i.e. a succinct description of the body contents. This should be a single line, but if a second line is needed, use &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{-}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; to ensure proper centering. This parameter is technically not mandatory, but using {{tl|Navbox}} is rather pointless without a title.&lt;br /&gt;
; &#039;&#039;above&#039;&#039;*&lt;br /&gt;
: A full-width cell displayed between the titlebar and first group/list, i.e. &#039;&#039;above&#039;&#039; the template&#039;s body (groups, lists and image). In a template without an image, &#039;&#039;above&#039;&#039; behaves in the same way as the &#039;&#039;list1&#039;&#039; parameter without the &#039;&#039;group1&#039;&#039; parameter.&lt;br /&gt;
; &#039;&#039;group&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&#039;&#039;*&lt;br /&gt;
: (i.e. &#039;&#039;group1&#039;&#039;, &#039;&#039;group2&#039;&#039;, etc.) If specified, text appears in a header cell displayed to the left of &#039;&#039;list&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&#039;&#039;. If omitted, &#039;&#039;list&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&#039;&#039; uses the full width of the table.&lt;br /&gt;
; &#039;&#039;list&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&#039;&#039;*&lt;br /&gt;
: (i.e. &#039;&#039;list1&#039;&#039;, &#039;&#039;list2&#039;&#039;, etc.) The body of the template, usually a list of links. Format is inline, although the text can be entered on separate lines if the entire list is enclosed within &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;div&amp;gt; &amp;lt;/div&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. At least one &#039;&#039;list&#039;&#039; parameter is required; each additional &#039;&#039;list&#039;&#039; is displayed in a separate row of the table. Each &#039;&#039;list&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&#039;&#039; may be preceded by a corresponding &#039;&#039;group&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&#039;&#039; parameter, if provided (see below).&lt;br /&gt;
:Entries should be separated using a [[newline]] and an [[asterisk]] (*). If instead two asterisks are used, it provides [[Nesting (computing)|nesting]] within the previous entry by enclosing the entry with brackets. Increasing the number of asterisks used increases the number of brackets around entries.&lt;br /&gt;
; &#039;&#039;image&#039;&#039;*&lt;br /&gt;
: An image to be displayed in a cell below the title and to the right of the body (the groups/lists). For the image to display properly, the &#039;&#039;list1&#039;&#039; parameter must be specified. The &#039;&#039;image&#039;&#039; parameter accepts standard wikicode for displaying an image, &#039;&#039;e.g.&#039;&#039;: &amp;lt;pre&amp;gt;[[File:&amp;lt;/nowiki&amp;gt;&amp;lt;var&amp;gt;XX&amp;lt;/var&amp;gt;&amp;lt;nowiki&amp;gt;.jpg|80px|link=|alt=]]&amp;lt;/pre&amp;gt; nb: including &amp;quot;|right&amp;quot; will produce the usual left margin to provide separation from the list items and [[Zebra striping (computer graphics)|zebra striping]].&lt;br /&gt;
:Note that most of such images don&#039;t comply with [[MOS:DECOR]] and should be removed at sight. A rare example of a correct usage would be [[special:permalink/995622594|this one]]: a map shows (in green) the location of a region within the state of Kazakhstan, and this is consistently implemented for [[:category:Kazakhstan region templates|all state&#039;s regions]].&lt;br /&gt;
; &#039;&#039;imageleft&#039;&#039;*&lt;br /&gt;
: An image to be displayed in a cell below the title and to the left of the body (lists). For the image to display properly, the &#039;&#039;list1&#039;&#039; parameter must be specified and no groups can be specified. It accepts the same sort of parameter that &#039;&#039;image&#039;&#039; accepts.&lt;br /&gt;
; &#039;&#039;below&#039;&#039;*&lt;br /&gt;
: A full-width cell displayed &#039;&#039;below&#039;&#039; the template&#039;s body (groups, lists and image). In a template without an image, &#039;&#039;below&#039;&#039; behaves in the same way as the template&#039;s final &#039;&#039;list&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&#039;&#039; parameter without a &#039;&#039;group&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&#039;&#039; parameter. For an example of the &#039;&#039;below&#039;&#039; parameter in use, see {{oldid|Main Page|352612160|this}} version of {{tl|Lists of the provinces and territories of Canada}}. {{tl|icon}} is often used for non-article links, for example &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{icon|category}} [[:Category:&amp;lt;/nowiki&amp;gt;&#039;&#039;name&#039;&#039;&amp;lt;nowiki&amp;gt;|Category]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Style parameters ===&lt;br /&gt;
Styles are generally advised against, to maintain consistency among templates and pages in Wikipedia; but the option to modify styles is given.&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;bodystyle&#039;&#039;*&lt;br /&gt;
: Specifies [[Cascading Style Sheets|CSS]] styles to apply to the template body. This option should be used sparingly as it can lead to visual inconsistencies. Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;bodystyle = background: #&#039;&#039;nnnnnn&#039;&#039;;&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;bodystyle = width: &#039;&#039;N&#039;&#039;&amp;amp;nbsp;[em/%/px or width: auto];&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;bodystyle = float: [&#039;&#039;left/right/none&#039;&#039;];&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;bodystyle = clear: [&#039;&#039;right/left/both/none&#039;&#039;];&amp;lt;/code&amp;gt;&lt;br /&gt;
; &#039;&#039;basestyle&#039;&#039;*&lt;br /&gt;
: CSS styles to apply to the &#039;&#039;title&#039;&#039;, &#039;&#039;above&#039;&#039;, &#039;&#039;below&#039;&#039;, and &#039;&#039;group&#039;&#039; cells all at once. The styles are not applied to &#039;&#039;list&#039;&#039; cells. This is convenient for easily changing the basic color of the navbox without having to repeat the style specifications for the different parts of the navbox. Example: &amp;lt;code&amp;gt;basestyle = background: lightskyblue;&amp;lt;/code&amp;gt;&lt;br /&gt;
; &#039;&#039;titlestyle&#039;&#039;*&lt;br /&gt;
: [[Cascading Style Sheets|CSS]] styles to apply to &#039;&#039;title&#039;&#039;, most often the titlebar&#039;s background color:&lt;br /&gt;
:* &amp;lt;code&amp;gt;titlestyle = background: &#039;&#039;#nnnnnn&#039;&#039;;&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;titlestyle = background: &#039;&#039;name&#039;&#039;;&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;titlestyle = background: none;&amp;lt;/code&amp;gt; — for no background color&lt;br /&gt;
; &#039;&#039;groupstyle&#039;&#039;*&lt;br /&gt;
: CSS styles to apply to the &#039;&#039;groupN&#039;&#039; cells. This option overrides any styles that are applied to the entire table. Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;groupstyle = background: #&#039;&#039;nnnnnn&#039;&#039;;&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;groupstyle = text-align: [&#039;&#039;left/center/right&#039;&#039;];&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;groupstyle = vertical-align: [&#039;&#039;top/middle/bottom&#039;&#039;];&amp;lt;/code&amp;gt;&lt;br /&gt;
; &#039;&#039;group&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;style&#039;&#039;*&lt;br /&gt;
: CSS styles to apply to a specific group, in addition to any styles specified by the &#039;&#039;groupstyle&#039;&#039; parameter. This parameter should only be used when absolutely necessary in order to maintain standardization and simplicity. Example: &amp;lt;code&amp;gt;group3style = background: red; color: white;&amp;lt;/code&amp;gt;&lt;br /&gt;
; &#039;&#039;groupwidth&#039;&#039;&lt;br /&gt;
: A number and unit specifying a uniform width for the group cells, in cases where little content in the list cells may cause group cells to be too wide. No default. However, may be overridden by the &#039;&#039;group(n)style&#039;&#039; parameter. Example: &amp;lt;code&amp;gt;groupwidth = 9em&amp;lt;/code&amp;gt;&lt;br /&gt;
; &#039;&#039;liststyle&#039;&#039;*&lt;br /&gt;
: CSS styles to apply to all lists. Overruled by the &#039;&#039;oddstyle&#039;&#039; and &#039;&#039;evenstyle&#039;&#039; parameters (if specified) hereafter. When using backgound colors in the navbox, see the [[#Intricacies|note hereafter]].&lt;br /&gt;
; &#039;&#039;list&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;style&#039;&#039;*&lt;br /&gt;
: CSS styles to apply to a specific list, in addition to any styles specified by the &#039;&#039;liststyle&#039;&#039; parameter. This parameter should only be used when absolutely necessary in order to maintain standardization and simplicity. Example: &amp;lt;code&amp;gt;list5style = background: #ddddff;&amp;lt;/code&amp;gt;&lt;br /&gt;
; &#039;&#039;listpadding&#039;&#039;*&lt;br /&gt;
: A number and unit specifying the padding in each &#039;&#039;list&#039;&#039; cell. The &#039;&#039;list&#039;&#039; cells come equipped with a default padding of 0.25em on the left and right, and 0 on the top and bottom. Due to complex technical reasons, simply setting &amp;quot;liststyle = padding: 0.5em;&amp;quot; (or any other padding setting) will not work. Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;listpadding = 0.5em 0;&amp;lt;/code&amp;gt; (sets 0.5em padding for the top/bottom, and 0 padding for the left/right.)&lt;br /&gt;
:* &amp;lt;code&amp;gt;listpadding = 0;&amp;lt;/code&amp;gt; (removes all list padding.)&lt;br /&gt;
; &#039;&#039;oddstyle&#039;&#039;&lt;br /&gt;
; &#039;&#039;evenstyle&#039;&#039;&lt;br /&gt;
: Applies to odd/even list numbers. Overrules styles defined by &#039;&#039;liststyle&#039;&#039;. The default behavior is to add striped colors (white and gray) to odd/even rows, respectively, in order to improve readability. These should not be changed except in extraordinary circumstances.&lt;br /&gt;
; &#039;&#039;evenodd&#039;&#039; &amp;lt;span style=&amp;quot;font-weight: normal;&amp;quot;&amp;gt;&amp;lt;code&amp;gt;[swap, even, odd, off]&amp;lt;/code&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
: If set to &amp;lt;code&amp;gt;swap&amp;lt;/code&amp;gt;, then the automatic striping of even and odd rows is reversed. Normally, even rows get a light gray background for striping; when this parameter is used, the odd rows receive the gray striping instead of the even rows. Setting to &amp;lt;code&amp;gt;even&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;odd&amp;lt;/code&amp;gt; sets all rows to have that striping color. Setting to &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; disables automatic row striping.&lt;br /&gt;
; &#039;&#039;abovestyle&#039;&#039;*&lt;br /&gt;
; &#039;&#039;belowstyle&#039;&#039;*&lt;br /&gt;
: CSS styles to apply to the top cell (specified via the &#039;&#039;above&#039;&#039; parameter) and bottom cell (specified via the &#039;&#039;below&#039;&#039; parameter). Typically used to set background color or text alignment:&lt;br /&gt;
:* &amp;lt;code&amp;gt;abovestyle = background: #&#039;&#039;nnnnnn&#039;&#039;;&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;abovestyle = text-align: [&#039;&#039;left/center/right&#039;&#039;];&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;belowstyle = background: #&#039;&#039;nnnnnn&#039;&#039;;&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;belowstyle = text-align: [&#039;&#039;left/center/right&#039;&#039;];&amp;lt;/code&amp;gt;&lt;br /&gt;
; &#039;&#039;imagestyle&#039;&#039;*&lt;br /&gt;
; &#039;&#039;imageleftstyle&#039;&#039;*&lt;br /&gt;
: CSS styles to apply to the cells where the image/imageleft sits. These styles should only be used in exceptional circumstances, usually to fix width problems if the width of groups is set and the width of the image cell grows too large. Example: &amp;lt;code&amp;gt;imagestyle = width:5em;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Default styles =====&lt;br /&gt;
The style settings listed here are those that editors using the navbox change most often. The other more complex style settings were left out of this list to keep it simple. Most styles are set in [[MediaWiki:Common.css]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
bodystyle = background: #fdfdfd; width: 100%; vertical-align: middle;&lt;br /&gt;
titlestyle = background: #ccccff; padding-left: 1em; padding-right: 1em; text-align: center;&lt;br /&gt;
abovestyle = background: #ddddff; padding-left: 1em; padding-right: 1em; text-align: center;&lt;br /&gt;
belowstyle = background: #ddddff; padding-left: 1em; padding-right: 1em; text-align: center;&lt;br /&gt;
groupstyle = background: #ddddff; padding-left: 1em; padding-right: 1em; text-align: right;&lt;br /&gt;
liststyle = background: transparent; text-align: left/center;&lt;br /&gt;
oddstyle = background: transparent;&lt;br /&gt;
evenstyle = background: #f7f7f7;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Since &#039;&#039;liststyle&#039;&#039; and &#039;&#039;oddstyle&#039;&#039; are transparent, odd lists have the color of the &#039;&#039;bodystyle&#039;&#039;, which defaults to #fdfdfd (white with a hint of gray). A list defaults to &amp;lt;code&amp;gt;text-align: left;&amp;lt;/code&amp;gt; if it has a group, if not it defaults to &amp;lt;code&amp;gt;text-align: center;&amp;lt;/code&amp;gt;. Since only &#039;&#039;bodystyle&#039;&#039; has a vertical-align all the others inherit its &amp;lt;code&amp;gt;vertical-align: middle;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Advanced parameters ===&lt;br /&gt;
; &#039;&#039;bodyclass&#039;&#039;&lt;br /&gt;
; &#039;&#039;aboveclass&#039;&#039;&lt;br /&gt;
; &#039;&#039;groupclass&#039;&#039;&lt;br /&gt;
; &#039;&#039;listclass&#039;&#039;&lt;br /&gt;
; &#039;&#039;belowclass&#039;&#039;&lt;br /&gt;
: This enables attaching a CSS class to group or list cells. The most common use for &#039;&#039;listclass&#039;&#039; is to give it the &amp;lt;code&amp;gt;hlist&amp;lt;/code&amp;gt; class that will cause lists to render horizontally. All these parameters accept the &amp;lt;code&amp;gt;hlist&amp;lt;/code&amp;gt; class, but if more than one parameter is used for &amp;lt;code&amp;gt;hlist&amp;lt;/code&amp;gt;, use {{para|bodyclass|hlist}} instead.&lt;br /&gt;
:{{tl|navbox}} automatically adds the class &amp;lt;code&amp;gt;nowraplinks&amp;lt;/code&amp;gt; which can be overridden, for example with &amp;lt;code&amp;gt;{{para|listclass|wraplinks}}&amp;lt;/code&amp;gt;.&lt;br /&gt;
; &#039;&#039;innerstyle&#039;&#039;&lt;br /&gt;
: A very advanced parameter to be used &#039;&#039;only&#039;&#039; for advanced meta-templates employing the navbox. Internally, the navbox uses an outer table to draw the border, and then an inner table for everything else (title/above/groups/lists/below/images, etc.). The &#039;&#039;style&#039;&#039;/&#039;&#039;bodystyle&#039;&#039; parameter sets the style for the outer table, which the inner table inherits, but in advanced cases (meta-templates) it may be necessary to directly set the style for the inner table. This parameter provides access to that inner table so styles can be applied. Use at your own risk.&lt;br /&gt;
; &#039;&#039;nowrapitems&#039;&#039;&lt;br /&gt;
: Setting &amp;lt;code&amp;gt;|nowrapitems=yes&amp;lt;/code&amp;gt; applies nowrap to each line in a list item, and to any &amp;lt;code&amp;gt;above&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;below&amp;lt;/code&amp;gt; item.&lt;br /&gt;
; &#039;&#039;orphan&#039;&#039;&lt;br /&gt;
: Setting &amp;lt;code&amp;gt;|orphan=yes&amp;lt;/code&amp;gt; in a child navbox fixes odd/even striping and removes [[:Category:Navbox orphans]].&lt;br /&gt;
&lt;br /&gt;
==== Microformats ====&lt;br /&gt;
; &#039;&#039;bodyclass&#039;&#039;&lt;br /&gt;
: This parameter is inserted into the &amp;quot;class&amp;quot; attribute for the navbox as a whole.&lt;br /&gt;
; &#039;&#039;titleclass&#039;&#039;&lt;br /&gt;
: This parameter is inserted into the &amp;quot;class&amp;quot; attribute for the navbox&#039;s title caption.&lt;br /&gt;
&lt;br /&gt;
This template supports the addition of microformat information. This is done by adding &amp;quot;class&amp;quot; attributes to various data cells, indicating what kind of information is contained within. To flag a navbox as containing [[hCard]] information about a person, for example, add the following parameter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| bodyclass = vcard&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;and&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| titleclass = fn&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;or&#039;&#039; (for example):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
| title = The books of &amp;lt;span class=&amp;quot;fn&amp;quot;&amp;gt;[[Iain Banks]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...and so forth.&lt;br /&gt;
&lt;br /&gt;
See [[Wikipedia:WikiProject Microformats]] for more information on adding microformat information to Wikipedia, and [[microformat]] for more information on microformats in general.&lt;br /&gt;
&lt;br /&gt;
== Layout of table ==&lt;br /&gt;
===Without image, above and below===&lt;br /&gt;
Table generated by {{tl|Navbox}} &#039;&#039;&#039;without&#039;&#039;&#039; &#039;&#039;image&#039;&#039;, &#039;&#039;above&#039;&#039; and &#039;&#039;below&#039;&#039; parameters (gray list background color added for illustration only):&lt;br /&gt;
&lt;br /&gt;
{{{{PAGENAMETDOC}}&lt;br /&gt;
| name = Navbox/doc&lt;br /&gt;
| state = uncollapsed&lt;br /&gt;
| liststyle = background: silver;&lt;br /&gt;
| title  = {{{title}}}&lt;br /&gt;
| group1 = {{{group1}}}&lt;br /&gt;
| list1  = {{{list1}}}&lt;br /&gt;
| group2 = {{{group2}}}&lt;br /&gt;
| list2  = {{{list2}}}&lt;br /&gt;
| list3  = {{{list3}}} &#039;&#039;without {{{group3}}}&#039;&#039;&lt;br /&gt;
| group4 = {{{group4}}}&lt;br /&gt;
| list4  = {{{list4}}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===With image, above and below===&lt;br /&gt;
Table generated by {{tl|Navbox}} &#039;&#039;&#039;with&#039;&#039;&#039; &#039;&#039;image&#039;&#039;, &#039;&#039;above&#039;&#039; and &#039;&#039;below&#039;&#039; parameters (gray list background color added for illustration only):&lt;br /&gt;
&lt;br /&gt;
{{{{PAGENAMETDOC}}&lt;br /&gt;
| name = Navbox/doc&lt;br /&gt;
| state = uncollapsed&lt;br /&gt;
| liststyle = background: silver;&lt;br /&gt;
| image  = {{{image}}}&lt;br /&gt;
| title  = {{{title}}}&lt;br /&gt;
| above  = {{{above}}}&lt;br /&gt;
| group1 = {{{group1}}}&lt;br /&gt;
| list1  = {{{list1}}}&lt;br /&gt;
| group2 = {{{group2}}}&lt;br /&gt;
| list2  = {{{list2}}}&lt;br /&gt;
| list3  = {{{list3}}} &#039;&#039;without {{{group3}}}&#039;&#039;&lt;br /&gt;
| group4 = {{{group4}}}&lt;br /&gt;
| list4  = {{{list4}}}&lt;br /&gt;
| below  = {{{below}}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===With image and without groups===&lt;br /&gt;
Table generated by {{tl|Navbox}} &#039;&#039;&#039;with&#039;&#039;&#039; &#039;&#039;image&#039;&#039;, &#039;&#039;imageleft&#039;&#039;, &#039;&#039;lists&#039;&#039;, and &#039;&#039;&#039;without&#039;&#039;&#039; &#039;&#039;groups&#039;&#039;, &#039;&#039;above&#039;&#039;, &#039;&#039;below&#039;&#039; (gray list background color added for illustration only):&lt;br /&gt;
&lt;br /&gt;
{{{{PAGENAMETDOC}}&lt;br /&gt;
| name = Navbox/doc&lt;br /&gt;
| state = uncollapsed&lt;br /&gt;
| liststyle = background: silver;&lt;br /&gt;
| image = {{{image}}}&lt;br /&gt;
| imageleft = {{{imageleft}}}&lt;br /&gt;
| title = {{{title}}}&lt;br /&gt;
| list1 = {{{list1}}}&lt;br /&gt;
| list2 = {{{list2}}}&lt;br /&gt;
| list3 = {{{list3}}}&lt;br /&gt;
| list4 = {{{list4}}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&amp;lt;!-- Please do not encourage folks to use &amp;lt;div&amp;gt; within Navboxes as (unless handled carefully) they can negate liststyles/groupstyles/etc. settings. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== No image ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{Navbox&lt;br /&gt;
| name  = Navbox/doc&lt;br /&gt;
| title = [[MSC Malaysia]]&lt;br /&gt;
| listclass = hlist&lt;br /&gt;
&lt;br /&gt;
| group1 = Centre&lt;br /&gt;
| list1  =&lt;br /&gt;
* [[Cyberjaya]]&lt;br /&gt;
&lt;br /&gt;
| group2 = Area&lt;br /&gt;
| list2  =&lt;br /&gt;
* [[Klang Valley]]&lt;br /&gt;
&lt;br /&gt;
| group3 = Major landmarks&lt;br /&gt;
| list3  =&lt;br /&gt;
* [[Petronas Twin Towers]]&lt;br /&gt;
* [[Kuala Lumpur Tower]]&lt;br /&gt;
* [[Kuala Lumpur Sentral]]&lt;br /&gt;
* [[Technology Park Malaysia]]&lt;br /&gt;
* [[Putrajaya]]&lt;br /&gt;
* [[Cyberjaya]]&lt;br /&gt;
* [[Kuala Lumpur International Airport]]&lt;br /&gt;
&lt;br /&gt;
| group4 = Infrastructure&lt;br /&gt;
| list4  =&lt;br /&gt;
* [[Express Rail Link]]&lt;br /&gt;
* [[KL-KLIA Dedicated Expressway]]&lt;br /&gt;
&lt;br /&gt;
| group5 = Prime applications&lt;br /&gt;
| list5  =&lt;br /&gt;
* [[E-Government]]&lt;br /&gt;
* [[MyKad]]&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{{{PAGENAMETDOC}}&lt;br /&gt;
| name   = Navbox/doc&lt;br /&gt;
| state  = uncollapsed&lt;br /&gt;
| title  = [[MSC Malaysia]]&lt;br /&gt;
| listclass = hlist&lt;br /&gt;
| group1 = Centre&lt;br /&gt;
| list1  =&lt;br /&gt;
* [[Cyberjaya]]&lt;br /&gt;
| group2 = Area&lt;br /&gt;
| list2  =&lt;br /&gt;
* [[Klang Valley]]&lt;br /&gt;
| group3 = Major landmarks&lt;br /&gt;
| list3  =&lt;br /&gt;
* [[Petronas Twin Towers]]&lt;br /&gt;
* [[Kuala Lumpur Tower]]&lt;br /&gt;
* [[Kuala Lumpur Sentral]]&lt;br /&gt;
* [[Technology Park Malaysia]]&lt;br /&gt;
* [[Putrajaya]]&lt;br /&gt;
* [[Cyberjaya]]&lt;br /&gt;
* [[Kuala Lumpur International Airport]]&lt;br /&gt;
| group4 = Infrastructure&lt;br /&gt;
| list4  =&lt;br /&gt;
* [[Express Rail Link]]&lt;br /&gt;
* [[KL-KLIA Dedicated Expressway]]&lt;br /&gt;
| group5 = Prime applications&lt;br /&gt;
| list5  =&lt;br /&gt;
* [[E-Government]]&lt;br /&gt;
* [[MyKad]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Child navboxes ==&lt;br /&gt;
{{Selfref|For additional examples, see the [[Template:Navbox/testcases|Navbox testcases page]].}}&lt;br /&gt;
&lt;br /&gt;
It is possible to place multiple navboxes within a single border by using &amp;quot;child&amp;quot; as the first parameter, or by setting the &#039;&#039;border&#039;&#039; parameter. The basic code for doing this is as follows (which adds a subgroup for the first group/list area):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{Navbox&lt;br /&gt;
| name = {{subst:PAGENAME}}&lt;br /&gt;
| title = Title&lt;br /&gt;
&lt;br /&gt;
| group1 = [optional]&lt;br /&gt;
| list1  = {{Navbox|child&lt;br /&gt;
   ...child navbox parameters...&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Subgroups example ===&lt;br /&gt;
This example shows two subgroups created using &amp;lt;code&amp;gt;child&amp;lt;/code&amp;gt; as the first unnamed parameter. The striping is alternated automatically. To remove the striping altogether, you can set &amp;lt;code&amp;gt;liststyle = background:transparent;&amp;lt;/code&amp;gt; in each of the navboxes.&lt;br /&gt;
&lt;br /&gt;
{{{{PAGENAMETDOC}}&lt;br /&gt;
| name = Navbox/doc&lt;br /&gt;
| state = uncollapsed&lt;br /&gt;
| title = Multiple subgroup example&lt;br /&gt;
| above = Above&lt;br /&gt;
| below = Below&lt;br /&gt;
| group1 = Group1&lt;br /&gt;
| list1  = List1&lt;br /&gt;
| group2 = Group2&lt;br /&gt;
| list2  =&lt;br /&gt;
 {{{{PAGENAMETDOC}}|child&lt;br /&gt;
  | group1 = Group2.1&lt;br /&gt;
  | list1  = List1&lt;br /&gt;
  | group2 = Group2.2&lt;br /&gt;
  | list2  = List2&lt;br /&gt;
  | group3 = Group2.3&lt;br /&gt;
  | list3  = List3&lt;br /&gt;
 }}&lt;br /&gt;
| group3 = Group3&lt;br /&gt;
| list3 = List3&lt;br /&gt;
| group4 = Group4&lt;br /&gt;
| list4 =&lt;br /&gt;
 {{{{PAGENAMETDOC}}|child&lt;br /&gt;
  | group1 = Group4.1&lt;br /&gt;
  | list1  = List1&lt;br /&gt;
  | group2 = Group4.2&lt;br /&gt;
  | list2  = List2&lt;br /&gt;
  | group3 = Group4.3&lt;br /&gt;
  | list3  = List3&lt;br /&gt;
 }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Multiple show/hides in a single container ===&lt;br /&gt;
{{main|Template:Navbox with collapsible groups}}&lt;br /&gt;
&lt;br /&gt;
The example below is generated using a regular navbox for the main container, then its list1, list2, and list3 parameters each contain another navbox, with &amp;lt;code&amp;gt;1 = child&amp;lt;/code&amp;gt; set. The view (v), talk (t), edit (e) navbar links are hidden using &amp;lt;code&amp;gt;navbar = plain&amp;lt;/code&amp;gt; for each of them, or could be suppressed by just leaving out the &#039;&#039;name&#039;&#039; parameter (child navboxes do not require the name parameter to be set, unlike regular navboxes).&lt;br /&gt;
&lt;br /&gt;
{{{{PAGENAMETDOC}}&lt;br /&gt;
| name = Navbox/doc&lt;br /&gt;
| title = [[French colonial empire|Former French overseas empire]]&lt;br /&gt;
| state = uncollapsed&lt;br /&gt;
| list1 = {{{{PAGENAMETDOC}}|child&lt;br /&gt;
 | navbar    = plain&lt;br /&gt;
 | title     = [[French colonial empire|Former French colonies]] in [[Africa]] and the [[Indian Ocean]]&lt;br /&gt;
 | listclass = hlist&lt;br /&gt;
 | group1 = [[Mahgreb]]&lt;br /&gt;
 | list1  =&lt;br /&gt;
* [[French rule in Algeria|Algeria]]&lt;br /&gt;
* [[French Morocco|Morocco]] &amp;lt;small&amp;gt;([[Arguin|Arguin Island]])&amp;lt;/small&amp;gt;&lt;br /&gt;
* [[History of Tunisia|Tunisia]]&lt;br /&gt;
 | group2 = [[French West Africa]]&lt;br /&gt;
 | list2  =&lt;br /&gt;
* [[History of Côte d&#039;Ivoire#French Period|Côte d&#039;Ivoire]]&lt;br /&gt;
* [[French Dahomey|Dahomey]]&lt;br /&gt;
* [[French Sudan]]&lt;br /&gt;
* [[French Guinea|Guinea]]&lt;br /&gt;
* [[History of Mauritania#French colonization and post-colonial history|Mauritania]]&lt;br /&gt;
* [[History of Niger#Colonization|Niger]]&lt;br /&gt;
* [[History of Senegal|Senegal]]&lt;br /&gt;
* [[French Upper Volta|Upper Volta]]&lt;br /&gt;
* [[French Togoland]]&lt;br /&gt;
* [[James Island (The Gambia)|James Island]]&lt;br /&gt;
| group3 = [[French Equatorial Africa]]&lt;br /&gt;
 | list3  =&lt;br /&gt;
* [[Colonial Chad|Chad]]&lt;br /&gt;
* [[History of Gabon|Gabon]]&lt;br /&gt;
* [[History of the Republic of the Congo|Middle Congo]]&lt;br /&gt;
* [[Oubangui-Chari]]&lt;br /&gt;
| group4 = [[Comoros]]&lt;br /&gt;
 | list4  =&lt;br /&gt;
* [[Anjouan]]&lt;br /&gt;
* [[Grande Comore]]&lt;br /&gt;
* [[Mohéli]]&lt;br /&gt;
* [[History of Djibouti#French Interest|French Somaliland (Djibouti)]]&lt;br /&gt;
* [[History of Madagascar#French control|Madagascar]]&lt;br /&gt;
* [[Mauritius|Ile de France]]&lt;br /&gt;
* [[Seychelles]]&lt;br /&gt;
}}&lt;br /&gt;
| list2 = {{{{PAGENAMETDOC}}|child&lt;br /&gt;
 | navbar    = plain&lt;br /&gt;
 | title     = [[French colonial empire|Former French colonies]] in the [[Americas]]&lt;br /&gt;
 | listclass = hlist&lt;br /&gt;
| list1 =&lt;br /&gt;
* [[New France]]{{spaces|2}}&amp;lt;small&amp;gt;([[Acadia]], [[Louisiana (New France)|Louisiana]], [[Canada, New France|Canada]], [[Newfoundland (island)|Terre Neuve]]) 1655–1763 &amp;lt;/small&amp;gt;&lt;br /&gt;
| list2 =&lt;br /&gt;
* [[Inini]]&lt;br /&gt;
* [[Berbice]]&lt;br /&gt;
* [[Saint-Domingue]]&lt;br /&gt;
* &amp;lt;small&amp;gt;[[Haiti]]&amp;lt;/small&amp;gt;&lt;br /&gt;
* [[Tobago]]&lt;br /&gt;
* [[History of the British Virgin Islands|Virgin Islands]]&lt;br /&gt;
* [[France Antarctique]]&lt;br /&gt;
* [[France Équinoxiale]]&lt;br /&gt;
| below      = [[French West India Company]]&lt;br /&gt;
}}&lt;br /&gt;
| list3 = {{{{PAGENAMETDOC}}|child&lt;br /&gt;
 | navbar     = plain&lt;br /&gt;
 | title      = [[French colonial empire|Former French colonies]] in [[Asia]] and [[Oceania]]&lt;br /&gt;
 | listclass  = hlist&lt;br /&gt;
| group1 = [[French India]]&lt;br /&gt;
 | list1  =&lt;br /&gt;
* [[Chandernagor]]&lt;br /&gt;
* [[Coromandel Coast]]&lt;br /&gt;
* [[History of Chennai|Madras]]&lt;br /&gt;
* [[Mahé, India|Mahé]]&lt;br /&gt;
* [[History of Pondicherry|Pondichéry]]&lt;br /&gt;
* [[Karaikal]]&lt;br /&gt;
* [[Yanam (India)|Yanaon]]&lt;br /&gt;
| group2 = [[French Indochina]]&lt;br /&gt;
 | list2  =&lt;br /&gt;
* [[Colonial Cambodia|Cambodia]]&lt;br /&gt;
* [[History of Laos to 1945#French Laos|Laos]]&lt;br /&gt;
* [[French Indochina|Vietnam]] &amp;lt;small&amp;gt;([[Annam (French colony)|Annam]], [[Cochinchina]], [[Tonkin]])&amp;lt;/small&amp;gt;&lt;br /&gt;
| group3 = Other Asian&lt;br /&gt;
 | list3  =&lt;br /&gt;
* [[Alawite State|Alaouites]]&lt;br /&gt;
* [[Republic of Hatay|Alexandretta-Hatay]]&lt;br /&gt;
* [[Sri Lanka|Ceylon]]&lt;br /&gt;
* [[Kwangchowan]]&lt;br /&gt;
| group4 = [[Oceania]]&lt;br /&gt;
 | list4  =&lt;br /&gt;
* [[New Hebrides]]&lt;br /&gt;
** [[History of Vanuatu|Vanuatu]]&lt;br /&gt;
| below      = [[French East India Company]]&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Relationship with other Navbox templates ==&lt;br /&gt;
This navbox template works in conjunction with two other templates: {{tl|Navbox with columns}} and {{tl|Navbox with collapsible groups}}. All three of these templates share common parameters for consistency and ease of use (such parameters are marked with an asterisk (*) in the [[#Parameter descriptions|parameter descriptions]] list hereinbefore). Most importantly, each template can be used as a child of one another (by using the {{para|border|child}} parameter, or by specifying the first unnamed parameter to be &amp;lt;code&amp;gt;child&amp;lt;/code&amp;gt;. For example: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Navbox|child ...}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Navbox with columns|child ...}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Navbox with collapsible groups|child ...}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
== Technical details ==&lt;br /&gt;
* The {{navbar|1=:{{FULLPAGENAME}}|mini=on}} links are produced by [[Template:Navbar]]. If you have a question about them, it is probably best to ask at [[Template talk:Navbar]].&lt;br /&gt;
* The 2px wide border between groups and lists is drawn using the border-left property of the list cell. Thus, if you wish to change the background color of the template (for example &amp;lt;code&amp;gt;bodystyle = background:purple;&amp;lt;/code&amp;gt;), then you&#039;ll need to make the border-left-color match the background color (i.e. &amp;lt;code&amp;gt;liststyle = border-left-color: purple;&amp;lt;/code&amp;gt;). If you wish to have a border around each list cell, then the 2px border between the list cells and group cells will disappear; you&#039;ll have to come up with your own solution.&lt;br /&gt;
* Adjacent navboxes have only a 1 pixel border between them. If you set the top or bottom margin of &amp;lt;code&amp;gt;style/bodystyle&amp;lt;/code&amp;gt;, then this will not work.&lt;br /&gt;
* The default margin-left and margin-right of the outer navbox table are set to &amp;quot;auto;&amp;quot;. If you wish to use navbox as a float, you need to manually set the margin-left and margin-right values, because the auto margins interfere with the float option. For example, add the following code to use the navbox as a float:&lt;br /&gt;
** &amp;lt;code&amp;gt;bodystyle = width: 22em; float: right; margin-left: 1em; margin-right: 0;&amp;lt;/code&amp;gt;&lt;br /&gt;
* This template calls {{ml|Navbox|navbox}}, which can double the [[WP:PEIS|post-expand include size]] when navbox templates are used on pages. When child navboxes are used, this can cause the size to quadruple or more. To reduce the include size, you can call the module directly, e.g.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot;&amp;gt;&lt;br /&gt;
{{#invoke:Navbox|navbox&lt;br /&gt;
| name = {{subst:PAGENAME}}&lt;br /&gt;
| title = Title&lt;br /&gt;
&lt;br /&gt;
| group1 = [optional]&lt;br /&gt;
| list1  = {{#invoke:Navbox|navbox|child&lt;br /&gt;
   ...child navbox parameters...&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copying to other projects or wikis ===&lt;br /&gt;
If you are trying to copy {{tlf|Navbox}} to your local wiki, there are several other things that must be installed or copied over as well:&lt;br /&gt;
* The [[mw:Extension:Scribunto|Scribunto]] and [[:mw:Extension:TemplateStyles|TemplateStyles]] extensions must be installed.&lt;br /&gt;
* [[Module:Navbox]] and its module and TemplateStyles dependencies, listed in the above two links&lt;br /&gt;
* Optionally, the &amp;lt;code&amp;gt;Add support to mw-collapsible for autocollapse, innercollapse and outercollapse&amp;lt;/code&amp;gt; script from [[MediaWiki:Common.js]] may be copied, if autocollapsing is desired.&lt;br /&gt;
&lt;br /&gt;
== TemplateData ==&lt;br /&gt;
{{TemplateDataHeader}}&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;state&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;State&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Controls when a navbox is expanded or collapsed&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;autocollapse&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;autocollapse&amp;quot;,&lt;br /&gt;
				&amp;quot;collapsed&amp;quot;,&lt;br /&gt;
				&amp;quot;expanded&amp;quot;,&lt;br /&gt;
				&amp;quot;plain&amp;quot;,&lt;br /&gt;
				&amp;quot;off&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;autocollapse&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;title&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Title&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Text in the title bar; centered in the top row of the table. Usually the template&#039;s topic.&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;[[Widget stuff]]&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;above&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Above&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Full-width cell displayed between the titlebar and first group/list, i.e. above the template&#039;s body (groups, lists and image)&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;image&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Image&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Image to be displayed in a cell below the title and to the right of the body&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;[[File:XX.jpg | 80px | link= | alt= ]]&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;wiki-file-name&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group1&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Group 1&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;If specified, text appears in a header cell displayed to the left of list 1. If omitted, list 1 uses the full width of the table.&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;list1&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;List 1&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Body of the template; usually a list of links. Format is inline. At least one list parameter is required; each additional list is displayed in a separate row of the table. Each listn may be preceded by a corresponding groupn parameter.\nEntries should be separated using a newline and an asterisk. If two asterisks are used, it provides nesting within the previous entry with brackets.&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: true,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group2&amp;quot;: {&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;list2&amp;quot;: {&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;list3&amp;quot;: {&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group3&amp;quot;: {&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group4&amp;quot;: {},&lt;br /&gt;
		&amp;quot;list4&amp;quot;: {},&lt;br /&gt;
		&amp;quot;below&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Below&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Full-width cell displayed below the template&#039;s body.&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;imageleft&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Image left&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Image to be displayed in a cell below the title and to the left of the body. For the image to display properly, list1 parameter must be specified and no groups can be specified.&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;[[File:XX.jpg | 80px | link= | alt= ]]&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;wiki-file-name&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;name&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Name&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The name of the template. Needed for \&amp;quot;View • Talk • Edit\&amp;quot; links to work properly.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;{{subst:PAGENAME}}{{subst:void|Don&#039;t change anything on this line. It will change itself when you save.}}&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;listclass&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;List class&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;CSS class for the list cells, usually hlist for horizontal lists. Alternatively, use bodyclass for the whole box.&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;hlist&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;navbar&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Navbar status&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;plain, off&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;border&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Border status&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;child, subgroup, none&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;bodystyle&amp;quot;: {},&lt;br /&gt;
		&amp;quot;basestyle&amp;quot;: {},&lt;br /&gt;
		&amp;quot;titlestyle&amp;quot;: {},&lt;br /&gt;
		&amp;quot;groupstyle&amp;quot;: {},&lt;br /&gt;
		&amp;quot;group1style&amp;quot;: {},&lt;br /&gt;
		&amp;quot;groupwidth&amp;quot;: {},&lt;br /&gt;
		&amp;quot;liststyle&amp;quot;: {},&lt;br /&gt;
		&amp;quot;list1style&amp;quot;: {},&lt;br /&gt;
		&amp;quot;listpadding&amp;quot;: {},&lt;br /&gt;
		&amp;quot;oddstyle&amp;quot;: {},&lt;br /&gt;
		&amp;quot;evenstyle&amp;quot;: {},&lt;br /&gt;
		&amp;quot;evenodd&amp;quot;: {&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;swap&amp;quot;,&lt;br /&gt;
				&amp;quot;even&amp;quot;,&lt;br /&gt;
				&amp;quot;odd&amp;quot;,&lt;br /&gt;
				&amp;quot;off&amp;quot;&lt;br /&gt;
			]&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;abovestyle&amp;quot;: {},&lt;br /&gt;
		&amp;quot;belowstyle&amp;quot;: {},&lt;br /&gt;
		&amp;quot;imagestyle&amp;quot;: {},&lt;br /&gt;
		&amp;quot;imageleftstyle&amp;quot;: {}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;Creates a navigational box for links to other pages. \nDoes not display in mobile.&amp;quot;,&lt;br /&gt;
	&amp;quot;paramOrder&amp;quot;: [&lt;br /&gt;
		&amp;quot;name&amp;quot;,&lt;br /&gt;
		&amp;quot;title&amp;quot;,&lt;br /&gt;
		&amp;quot;group1&amp;quot;,&lt;br /&gt;
		&amp;quot;list1&amp;quot;,&lt;br /&gt;
		&amp;quot;listclass&amp;quot;,&lt;br /&gt;
		&amp;quot;state&amp;quot;,&lt;br /&gt;
		&amp;quot;above&amp;quot;,&lt;br /&gt;
		&amp;quot;below&amp;quot;,&lt;br /&gt;
		&amp;quot;image&amp;quot;,&lt;br /&gt;
		&amp;quot;group2&amp;quot;,&lt;br /&gt;
		&amp;quot;list2&amp;quot;,&lt;br /&gt;
		&amp;quot;group3&amp;quot;,&lt;br /&gt;
		&amp;quot;list3&amp;quot;,&lt;br /&gt;
		&amp;quot;group4&amp;quot;,&lt;br /&gt;
		&amp;quot;list4&amp;quot;,&lt;br /&gt;
		&amp;quot;imageleft&amp;quot;,&lt;br /&gt;
		&amp;quot;navbar&amp;quot;,&lt;br /&gt;
		&amp;quot;border&amp;quot;,&lt;br /&gt;
		&amp;quot;bodystyle&amp;quot;,&lt;br /&gt;
		&amp;quot;basestyle&amp;quot;,&lt;br /&gt;
		&amp;quot;titlestyle&amp;quot;,&lt;br /&gt;
		&amp;quot;groupstyle&amp;quot;,&lt;br /&gt;
		&amp;quot;liststyle&amp;quot;,&lt;br /&gt;
		&amp;quot;group1style&amp;quot;,&lt;br /&gt;
		&amp;quot;list1style&amp;quot;,&lt;br /&gt;
		&amp;quot;groupwidth&amp;quot;,&lt;br /&gt;
		&amp;quot;listpadding&amp;quot;,&lt;br /&gt;
		&amp;quot;oddstyle&amp;quot;,&lt;br /&gt;
		&amp;quot;evenstyle&amp;quot;,&lt;br /&gt;
		&amp;quot;evenodd&amp;quot;,&lt;br /&gt;
		&amp;quot;abovestyle&amp;quot;,&lt;br /&gt;
		&amp;quot;belowstyle&amp;quot;,&lt;br /&gt;
		&amp;quot;imagestyle&amp;quot;,&lt;br /&gt;
		&amp;quot;imageleftstyle&amp;quot;&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* {{tl|Navboxes}} — groups several navigation boxes together.&lt;br /&gt;
* {{tl|Nobold}} — To display text at normal font-weight within a context where the default font-weight is bold, e.g. header cells in tables.&lt;br /&gt;
* {{tl|Sidebar}} — Vertically-aligned navigation templates.&lt;br /&gt;
* {{tl|Navbox documentation}} — Shows the standard documentation using {{tl|Documentation}}.&lt;br /&gt;
* [[Template:Navbox/testcases]] — For additional examples of template code.&lt;br /&gt;
* [[Wikipedia:Line-break handling]] — The how-to guide about how to handle word wraps (line breaks) on Wikipedia, such as the wrapping of the link lists used in navboxes.&lt;br /&gt;
* [[Wikipedia:Template documentation]] — Guideline to creating the accompanying documentation&lt;br /&gt;
* {{tl|Nowrap begin}}, {{tl|·}} and {{tl|•}} are &#039;&#039;&#039;deprecated&#039;&#039;&#039; in favor of the &amp;lt;code&amp;gt;hlist&amp;lt;/code&amp;gt; class for formatting lists. See [[Template:Flatlist#Technical details|Flatlist]] for a technical explanation of how &amp;lt;code&amp;gt;hlist&amp;lt;/code&amp;gt; works.&lt;br /&gt;
&lt;br /&gt;
=== Tracking categories ===&lt;br /&gt;
* {{clc|Navbox orphans}}&lt;br /&gt;
* {{clc|Navigational boxes without horizontal lists}}&lt;br /&gt;
* {{clc|Navboxes using background colours}}&lt;br /&gt;
* {{clc|Potentially illegible navboxes}}&lt;br /&gt;
* {{clc|Navboxes using borders}}&lt;br /&gt;
&lt;br /&gt;
{{Navigation templates}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{sandbox other||&lt;br /&gt;
&amp;lt;!-- Add categories below this line, and interwikis at Wikidata --&amp;gt;&lt;br /&gt;
[[Category:Navbox meta-templates| ]]&lt;br /&gt;
[[Category:Templates generating microformats]]&lt;br /&gt;
[[Category:Templates that are not mobile friendly]]&lt;br /&gt;
[[Category:Collapse templates]]&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
	<entry>
		<id>https://atmospedia.org/index.php?title=Template:Navbox&amp;diff=222</id>
		<title>Template:Navbox</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Template:Navbox&amp;diff=222"/>
		<updated>2024-07-03T20:53:28Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#invoke:Navbox|navbox}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
	<entry>
		<id>https://atmospedia.org/index.php?title=Module:Infobox/styles.css&amp;diff=220</id>
		<title>Module:Infobox/styles.css</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Module:Infobox/styles.css&amp;diff=220"/>
		<updated>2024-07-03T20:53:28Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* {{pp|small=y}} */&lt;br /&gt;
/*&lt;br /&gt;
 * This TemplateStyles sheet deliberately does NOT include the full set of&lt;br /&gt;
 * infobox styles. We are still working to migrate all of the manual&lt;br /&gt;
 * infoboxes. See [[MediaWiki talk:Common.css/to do#Infobox]]&lt;br /&gt;
 * DO NOT ADD THEM HERE&lt;br /&gt;
 */&lt;br /&gt;
/*&lt;br /&gt;
 * not strictly certain these styles are necessary since the modules now&lt;br /&gt;
 * exclusively output infobox-subbox or infobox, not both&lt;br /&gt;
 * just replicating the module faithfully&lt;br /&gt;
 */&lt;br /&gt;
.infobox-subbox {&lt;br /&gt;
	padding: 0;&lt;br /&gt;
	border: none;&lt;br /&gt;
	margin: -3px;&lt;br /&gt;
	width: auto;&lt;br /&gt;
	min-width: 100%;&lt;br /&gt;
	font-size: 100%;&lt;br /&gt;
	clear: none;&lt;br /&gt;
	float: none;&lt;br /&gt;
	background-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox-3cols-child {&lt;br /&gt;
	margin: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox .navbar {&lt;br /&gt;
	font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* T281642 */&lt;br /&gt;
body.skin-minerva .infobox-header,&lt;br /&gt;
body.skin-minerva .infobox-subheader,&lt;br /&gt;
body.skin-minerva  .infobox-above,&lt;br /&gt;
body.skin-minerva .infobox-title,&lt;br /&gt;
body.skin-minerva  .infobox-image,&lt;br /&gt;
body.skin-minerva  .infobox-full-data,&lt;br /&gt;
body.skin-minerva .infobox-below {&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Dark theme: [[William_Wragg]], [[Coral_Castle]] */&lt;br /&gt;
html.skin-theme-clientpref-night .infobox-full-data:not(.notheme) &amp;gt; div:not(.notheme)[style] {&lt;br /&gt;
    background: #1f1f23 !important;&lt;br /&gt;
      /* switch with var( --color-base ) when supported. */&lt;br /&gt;
      color: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (prefers-color-scheme: dark) {&lt;br /&gt;
    html.skin-theme-clientpref-os .infobox-full-data:not(.notheme) div:not(.notheme) {&lt;br /&gt;
      background: #1f1f23 !important;&lt;br /&gt;
      /* switch with var( --color-base ) when supported. */&lt;br /&gt;
      color: #f8f9fa;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Since infobox is a table, many infobox templates take advantage of this to add columns and rows to the infobox itself rather than as part of a new table inside them. This class should be discouraged and removed on the long term, but allows us to at least identify these tables going forward&lt;br /&gt;
Currently in use on: [[Module:Infobox3cols]]&lt;br /&gt;
Fixes issue described in https://phabricator.wikimedia.org/F55300125 on Vector 2022.&lt;br /&gt;
*/&lt;br /&gt;
@media (min-width: 640px) {&lt;br /&gt;
  body.skin--responsive .infobox-table {&lt;br /&gt;
    display: table !important;&lt;br /&gt;
  }&lt;br /&gt;
  body.skin--responsive .infobox-table &amp;gt; caption {&lt;br /&gt;
    display: table-caption !important;&lt;br /&gt;
  }&lt;br /&gt;
  body.skin--responsive .infobox-table &amp;gt; tbody {&lt;br /&gt;
    display: table-row-group;&lt;br /&gt;
  }&lt;br /&gt;
  body.skin--responsive .infobox-table tr {&lt;br /&gt;
    display: table-row !important;&lt;br /&gt;
  }&lt;br /&gt;
  body.skin--responsive .infobox-table th,&lt;br /&gt;
  body.skin--responsive .infobox-table td {&lt;br /&gt;
    padding-left: inherit;&lt;br /&gt;
    padding-right: inherit;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
	<entry>
		<id>https://atmospedia.org/index.php?title=Module:If_empty&amp;diff=218</id>
		<title>Module:If empty</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Module:If_empty&amp;diff=218"/>
		<updated>2024-07-03T18:32:42Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = require(&#039;Module:Arguments&#039;).getArgs(frame, {wrappers = &#039;Template:If empty&#039;, removeBlanks = false})&lt;br /&gt;
&lt;br /&gt;
	for k,v in ipairs(args) do&lt;br /&gt;
		if v ~= &#039;&#039; then&lt;br /&gt;
			return v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
	<entry>
		<id>https://atmospedia.org/index.php?title=Module:Check_for_unknown_parameters&amp;diff=216</id>
		<title>Module:Check for unknown parameters</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Module:Check_for_unknown_parameters&amp;diff=216"/>
		<updated>2024-07-03T18:32:42Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module may be used to compare the arguments passed to the parent&lt;br /&gt;
-- with a list of arguments, returning a specified result if an argument is&lt;br /&gt;
-- not on the list&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(s)&lt;br /&gt;
	return s:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isnotempty(s)&lt;br /&gt;
	return s and s:match(&#039;%S&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function clean(text)&lt;br /&gt;
	-- Return text cleaned for display and truncated if too long.&lt;br /&gt;
	-- Strip markers are replaced with dummy text representing the original wikitext.&lt;br /&gt;
	local pos, truncated&lt;br /&gt;
	local function truncate(text)&lt;br /&gt;
		if truncated then&lt;br /&gt;
			return &#039;&#039;&lt;br /&gt;
		end&lt;br /&gt;
		if mw.ustring.len(text) &amp;gt; 25 then&lt;br /&gt;
			truncated = true&lt;br /&gt;
			text = mw.ustring.sub(text, 1, 25) .. &#039;...&#039;&lt;br /&gt;
		end&lt;br /&gt;
		return mw.text.nowiki(text)&lt;br /&gt;
	end&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for before, tag, remainder in text:gmatch(&#039;([^\127]*)\127[^\127]*%-(%l+)%-[^\127]*\127()&#039;) do&lt;br /&gt;
		pos = remainder&lt;br /&gt;
		table.insert(parts, truncate(before) .. &#039;&amp;amp;lt;&#039; .. tag .. &#039;&amp;amp;gt;...&amp;amp;lt;/&#039; .. tag .. &#039;&amp;amp;gt;&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(parts, truncate(text:sub(pos or 1)))&lt;br /&gt;
	return table.concat(parts)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._check(args, pargs)&lt;br /&gt;
	if type(args) ~= &amp;quot;table&amp;quot; or type(pargs) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		-- TODO: error handling&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- create the list of known args, regular expressions, and the return string&lt;br /&gt;
	local knownargs = {}&lt;br /&gt;
	local regexps = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		if type(k) == &#039;number&#039; then&lt;br /&gt;
			v = trim(v)&lt;br /&gt;
			knownargs[v] = 1&lt;br /&gt;
		elseif k:find(&#039;^regexp[1-9][0-9]*$&#039;) then&lt;br /&gt;
			table.insert(regexps, &#039;^&#039; .. v .. &#039;$&#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- loop over the parent args, and make sure they are on the list&lt;br /&gt;
	local ignoreblank = isnotempty(args[&#039;ignoreblank&#039;])&lt;br /&gt;
	local showblankpos = isnotempty(args[&#039;showblankpositional&#039;])&lt;br /&gt;
	local values = {}&lt;br /&gt;
	for k, v in pairs(pargs) do&lt;br /&gt;
		if type(k) == &#039;string&#039; and knownargs[k] == nil then&lt;br /&gt;
			local knownflag = false&lt;br /&gt;
			for _, regexp in ipairs(regexps) do&lt;br /&gt;
				if mw.ustring.match(k, regexp) then&lt;br /&gt;
					knownflag = true&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if not knownflag and ( not ignoreblank or isnotempty(v) )  then&lt;br /&gt;
				table.insert(values, clean(k))&lt;br /&gt;
			end&lt;br /&gt;
		elseif type(k) == &#039;number&#039; and knownargs[tostring(k)] == nil then&lt;br /&gt;
			local knownflag = false&lt;br /&gt;
			for _, regexp in ipairs(regexps) do&lt;br /&gt;
				if mw.ustring.match(tostring(k), regexp) then&lt;br /&gt;
					knownflag = true&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if not knownflag and ( showblankpos or isnotempty(v) ) then&lt;br /&gt;
				table.insert(values, k .. &#039; = &#039; .. clean(v))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- add results to the output tables&lt;br /&gt;
	local res = {}&lt;br /&gt;
	if #values &amp;gt; 0 then&lt;br /&gt;
		local unknown_text = args[&#039;unknown&#039;] or &#039;Found _VALUE_, &#039;&lt;br /&gt;
&lt;br /&gt;
		if mw.getCurrentFrame():preprocess( &amp;quot;{{REVISIONID}}&amp;quot; ) == &amp;quot;&amp;quot; then&lt;br /&gt;
			local preview_text = args[&#039;preview&#039;]&lt;br /&gt;
			if isnotempty(preview_text) then&lt;br /&gt;
				preview_text = require(&#039;Module:If preview&#039;)._warning({preview_text})&lt;br /&gt;
			elseif preview == nil then&lt;br /&gt;
				preview_text = unknown_text&lt;br /&gt;
			end&lt;br /&gt;
			unknown_text = preview_text&lt;br /&gt;
		end&lt;br /&gt;
		for _, v in pairs(values) do&lt;br /&gt;
			-- Fix odd bug for | = which gets stripped to the empty string and&lt;br /&gt;
			-- breaks category links&lt;br /&gt;
			if v == &#039;&#039; then v = &#039; &#039; end&lt;br /&gt;
&lt;br /&gt;
			-- avoid error with v = &#039;example%2&#039; (&amp;quot;invalid capture index&amp;quot;)&lt;br /&gt;
			local r = unknown_text:gsub(&#039;_VALUE_&#039;, {_VALUE_ = v})&lt;br /&gt;
			table.insert(res, r)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat(res)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.check(frame)&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local pargs = frame:getParent().args&lt;br /&gt;
	return p._check(args, pargs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
	<entry>
		<id>https://atmospedia.org/index.php?title=Module:InfoboxImage&amp;diff=214</id>
		<title>Module:InfoboxImage</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Module:InfoboxImage&amp;diff=214"/>
		<updated>2024-07-03T18:32:42Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Inputs:&lt;br /&gt;
--    image - Can either be a bare filename (with or without the File:/Image: prefix) or a fully formatted image link&lt;br /&gt;
--    page - page to display for multipage images (DjVu)&lt;br /&gt;
--    size - size to display the image&lt;br /&gt;
--    maxsize - maximum size for image&lt;br /&gt;
--    sizedefault - default size to display the image if size param is blank&lt;br /&gt;
--    alt - alt text for image&lt;br /&gt;
--    title - title text for image&lt;br /&gt;
--    border - set to yes if border&lt;br /&gt;
--    center - set to yes, if the image has to be centered&lt;br /&gt;
--    upright - upright image param&lt;br /&gt;
--    suppressplaceholder - if yes then checks to see if image is a placeholder and suppresses it&lt;br /&gt;
--    link - page to visit when clicking on image&lt;br /&gt;
--    class - HTML classes to add to the image&lt;br /&gt;
-- Outputs:&lt;br /&gt;
--    Formatted image.&lt;br /&gt;
-- More details available at the &amp;quot;Module:InfoboxImage/doc&amp;quot; page&lt;br /&gt;
&lt;br /&gt;
local i = {};&lt;br /&gt;
&lt;br /&gt;
local placeholder_image = {&lt;br /&gt;
    &amp;quot;Blue - Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Blue - Replace this image male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Female no free image yet.png&amp;quot;,&lt;br /&gt;
    &amp;quot;Flag of None (square).svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Flag of None.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Flag of.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Green - Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Green - Replace this image male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Image is needed female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Image is needed male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Location map of None.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Male no free image yet.png&amp;quot;,&lt;br /&gt;
    &amp;quot;Missing flag.png&amp;quot;,&lt;br /&gt;
    &amp;quot;No flag.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;No free portrait.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;No portrait (female).svg&amp;quot;,&lt;br /&gt;
    &amp;quot;No portrait (male).svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Red - Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Red - Replace this image male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Replace this image female (blue).svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Replace this image male (blue).svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Replace this image male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Silver - Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Silver - Replace this image male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Replace this image.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Cricket no pic.png&amp;quot;,&lt;br /&gt;
	&amp;quot;CarersLogo.gif&amp;quot;,&lt;br /&gt;
	&amp;quot;Diagram Needed.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Example.jpg&amp;quot;,&lt;br /&gt;
	&amp;quot;Image placeholder.png&amp;quot;,&lt;br /&gt;
	&amp;quot;No male portrait.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Nocover-upload.png&amp;quot;,&lt;br /&gt;
	&amp;quot;NoDVDcover copy.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Noribbon.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;No portrait-BFD-test.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Placeholder barnstar ribbon.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Project Trains no image.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Image-request.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Sin bandera.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Sin escudo.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Replace this image - temple.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Replace this image butterfly.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Replace this image.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Replace this image1.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Resolution angle.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Image-No portrait-text-BFD-test.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Insert image here.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;No image available.png&amp;quot;,&lt;br /&gt;
	&amp;quot;NO IMAGE YET square.png&amp;quot;,&lt;br /&gt;
	&amp;quot;NO IMAGE YET.png&amp;quot;,&lt;br /&gt;
	&amp;quot;No Photo Available.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;No Screenshot.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;No-image-available.jpg&amp;quot;,&lt;br /&gt;
	&amp;quot;Null.png&amp;quot;,&lt;br /&gt;
	&amp;quot;PictureNeeded.gif&amp;quot;,&lt;br /&gt;
	&amp;quot;Place holder.jpg&amp;quot;,&lt;br /&gt;
	&amp;quot;Unbenannt.JPG&amp;quot;,&lt;br /&gt;
	&amp;quot;UploadACopyrightFreeImage.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;UploadAnImage.gif&amp;quot;,&lt;br /&gt;
	&amp;quot;UploadAnImage.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;UploadAnImageShort.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;CarersLogo.gif&amp;quot;,&lt;br /&gt;
	&amp;quot;Diagram Needed.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;No male portrait.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;NoDVDcover copy.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Placeholder barnstar ribbon.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Project Trains no image.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Image-request.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Noimage.gif&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function i.IsPlaceholder(image)&lt;br /&gt;
    -- change underscores to spaces&lt;br /&gt;
    image = mw.ustring.gsub(image, &amp;quot;_&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
    assert(image ~= nil, &#039;mw.ustring.gsub(image, &amp;quot;_&amp;quot;, &amp;quot; &amp;quot;) must not return nil&#039;)&lt;br /&gt;
    -- if image starts with [[ then remove that and anything after |&lt;br /&gt;
    if mw.ustring.sub(image,1,2) == &amp;quot;[[&amp;quot; then&lt;br /&gt;
        image = mw.ustring.sub(image,3);&lt;br /&gt;
        image = mw.ustring.gsub(image, &amp;quot;([^|]*)|.*&amp;quot;, &amp;quot;%1&amp;quot;);&lt;br /&gt;
        assert(image ~= nil, &#039;mw.ustring.gsub(image, &amp;quot;([^|]*)|.*&amp;quot;, &amp;quot;%1&amp;quot;) must not return nil&#039;)&lt;br /&gt;
    end&lt;br /&gt;
    -- Trim spaces&lt;br /&gt;
    image = mw.ustring.gsub(image, &#039;^[ ]*(.-)[ ]*$&#039;, &#039;%1&#039;);&lt;br /&gt;
    assert(image ~= nil, &amp;quot;mw.ustring.gsub(image, &#039;^[ ]*(.-)[ ]*$&#039;, &#039;%1&#039;) must not return nil&amp;quot;)&lt;br /&gt;
    -- remove prefix if exists&lt;br /&gt;
    local allNames = mw.site.namespaces[6].aliases&lt;br /&gt;
    allNames[#allNames + 1] = mw.site.namespaces[6].name&lt;br /&gt;
    allNames[#allNames + 1] = mw.site.namespaces[6].canonicalName&lt;br /&gt;
    for i, name in ipairs(allNames) do&lt;br /&gt;
        if mw.ustring.lower(mw.ustring.sub(image, 1, mw.ustring.len(name) + 1)) == mw.ustring.lower(name .. &amp;quot;:&amp;quot;) then&lt;br /&gt;
            image = mw.ustring.sub(image, mw.ustring.len(name) + 2);&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Trim spaces&lt;br /&gt;
    image = mw.ustring.gsub(image, &#039;^[ ]*(.-)[ ]*$&#039;, &#039;%1&#039;);&lt;br /&gt;
    -- capitalise first letter&lt;br /&gt;
    image = mw.ustring.upper(mw.ustring.sub(image,1,1)) .. mw.ustring.sub(image,2);&lt;br /&gt;
&lt;br /&gt;
    for i,j in pairs(placeholder_image) do&lt;br /&gt;
        if image == j then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function i.InfoboxImage(frame)&lt;br /&gt;
    local image = frame.args[&amp;quot;image&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    if image == &amp;quot;&amp;quot; or image == nil then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if image == &amp;quot;&amp;amp;nbsp;&amp;quot; then&lt;br /&gt;
        return image;&lt;br /&gt;
    end&lt;br /&gt;
    if frame.args[&amp;quot;suppressplaceholder&amp;quot;] ~= &amp;quot;no&amp;quot; then&lt;br /&gt;
        if i.IsPlaceholder(image) == true then&lt;br /&gt;
            return &amp;quot;&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if mw.ustring.lower(mw.ustring.sub(image,1,5)) == &amp;quot;http:&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if mw.ustring.lower(mw.ustring.sub(image,1,6)) == &amp;quot;[http:&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if mw.ustring.lower(mw.ustring.sub(image,1,7)) == &amp;quot;[[http:&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if mw.ustring.lower(mw.ustring.sub(image,1,6)) == &amp;quot;https:&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if mw.ustring.lower(mw.ustring.sub(image,1,7)) == &amp;quot;[https:&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if mw.ustring.lower(mw.ustring.sub(image,1,8)) == &amp;quot;[[https:&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if mw.ustring.sub(image,1,2) == &amp;quot;[[&amp;quot; then&lt;br /&gt;
        -- search for thumbnail images and add to tracking cat if found&lt;br /&gt;
        local cat = &amp;quot;&amp;quot;;&lt;br /&gt;
        if mw.title.getCurrentTitle().namespace == 0 and (mw.ustring.find(image, &amp;quot;|%s*thumb%s*[|%]]&amp;quot;) or mw.ustring.find(image, &amp;quot;|%s*thumbnail%s*[|%]]&amp;quot;)) then&lt;br /&gt;
            cat = &amp;quot;[[Category:Pages using infoboxes with thumbnail images]]&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        return image .. cat;&lt;br /&gt;
    elseif mw.ustring.sub(image,1,2) == &amp;quot;{{&amp;quot; and mw.ustring.sub(image,1,3) ~= &amp;quot;{{{&amp;quot; then&lt;br /&gt;
        return image;&lt;br /&gt;
    elseif mw.ustring.sub(image,1,1) == &amp;quot;&amp;lt;&amp;quot; then&lt;br /&gt;
        return image;&lt;br /&gt;
    elseif mw.ustring.sub(image,1,8) == mw.ustring.char(127)..&amp;quot;&#039;\&amp;quot;`UNIQ&amp;quot; then&lt;br /&gt;
        -- Found strip marker at begining, so pass don&#039;t process at all&lt;br /&gt;
        return image;&lt;br /&gt;
    else&lt;br /&gt;
        local result = &amp;quot;&amp;quot;;&lt;br /&gt;
        local page = frame.args[&amp;quot;page&amp;quot;];&lt;br /&gt;
        local size = frame.args[&amp;quot;size&amp;quot;];&lt;br /&gt;
        local maxsize = frame.args[&amp;quot;maxsize&amp;quot;];&lt;br /&gt;
        local sizedefault = frame.args[&amp;quot;sizedefault&amp;quot;];&lt;br /&gt;
        local alt = frame.args[&amp;quot;alt&amp;quot;];&lt;br /&gt;
        local link = frame.args[&amp;quot;link&amp;quot;];&lt;br /&gt;
        local title = frame.args[&amp;quot;title&amp;quot;];&lt;br /&gt;
        local border = frame.args[&amp;quot;border&amp;quot;];&lt;br /&gt;
        local upright = frame.args[&amp;quot;upright&amp;quot;] or &amp;quot;&amp;quot;;&lt;br /&gt;
        local thumbtime = frame.args[&amp;quot;thumbtime&amp;quot;] or &amp;quot;&amp;quot;;&lt;br /&gt;
        local center = frame.args[&amp;quot;center&amp;quot;];&lt;br /&gt;
        local class = frame.args[&amp;quot;class&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        -- remove prefix if exists&lt;br /&gt;
        local allNames = mw.site.namespaces[6].aliases&lt;br /&gt;
        allNames[#allNames + 1] = mw.site.namespaces[6].name&lt;br /&gt;
        allNames[#allNames + 1] = mw.site.namespaces[6].canonicalName&lt;br /&gt;
        for i, name in ipairs(allNames) do&lt;br /&gt;
            if mw.ustring.lower(mw.ustring.sub(image, 1, mw.ustring.len(name) + 1)) == mw.ustring.lower(name .. &amp;quot;:&amp;quot;) then&lt;br /&gt;
                image = mw.ustring.sub(image, mw.ustring.len(name) + 2);&lt;br /&gt;
                break&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        if maxsize ~= &amp;quot;&amp;quot; and maxsize ~= nil then&lt;br /&gt;
            -- if no sizedefault then set to maxsize&lt;br /&gt;
            if sizedefault == &amp;quot;&amp;quot; or sizedefault == nil then&lt;br /&gt;
                sizedefault = maxsize&lt;br /&gt;
            end&lt;br /&gt;
            -- check to see if size bigger than maxsize&lt;br /&gt;
            if size ~= &amp;quot;&amp;quot; and size ~= nil then&lt;br /&gt;
                local sizenumber = tonumber(mw.ustring.match(size,&amp;quot;%d*&amp;quot;)) or 0;&lt;br /&gt;
                local maxsizenumber = tonumber(mw.ustring.match(maxsize,&amp;quot;%d*&amp;quot;)) or 0;&lt;br /&gt;
                if sizenumber&amp;gt;maxsizenumber and maxsizenumber&amp;gt;0 then&lt;br /&gt;
                    size = maxsize;&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        -- add px to size if just a number&lt;br /&gt;
        if (tonumber(size) or 0) &amp;gt; 0 then&lt;br /&gt;
            size = size .. &amp;quot;px&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        -- add px to sizedefault if just a number&lt;br /&gt;
        if (tonumber(sizedefault) or 0) &amp;gt; 0 then&lt;br /&gt;
            sizedefault = sizedefault .. &amp;quot;px&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        result = &amp;quot;[[File:&amp;quot; .. image;&lt;br /&gt;
        if page ~= &amp;quot;&amp;quot; and page ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|page=&amp;quot; .. page;&lt;br /&gt;
        end&lt;br /&gt;
        if size ~= &amp;quot;&amp;quot; and size ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|&amp;quot; .. size;&lt;br /&gt;
        elseif sizedefault ~= &amp;quot;&amp;quot; and sizedefault ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|&amp;quot; .. sizedefault;&lt;br /&gt;
        else&lt;br /&gt;
            result = result .. &amp;quot;|frameless&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        if center == &amp;quot;yes&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|center&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if alt ~= &amp;quot;&amp;quot; and alt ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|alt=&amp;quot; .. alt;&lt;br /&gt;
        end&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; and link ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|link=&amp;quot; .. link;&lt;br /&gt;
        end&lt;br /&gt;
        if border == &amp;quot;yes&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|border&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        if upright == &amp;quot;yes&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|upright&amp;quot;;&lt;br /&gt;
        elseif upright ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|upright=&amp;quot; .. upright;&lt;br /&gt;
        end&lt;br /&gt;
        if thumbtime ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|thumbtime=&amp;quot; .. thumbtime;&lt;br /&gt;
        end&lt;br /&gt;
        if class ~= nil and class ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|class=&amp;quot; .. class;&lt;br /&gt;
        end&lt;br /&gt;
        -- if alt value is a keyword then do not use as a description&lt;br /&gt;
        if alt == &amp;quot;thumbnail&amp;quot; or alt == &amp;quot;thumb&amp;quot; or alt == &amp;quot;frameless&amp;quot; or alt == &amp;quot;left&amp;quot; or alt == &amp;quot;center&amp;quot; or alt == &amp;quot;right&amp;quot; or alt == &amp;quot;upright&amp;quot; or alt == &amp;quot;border&amp;quot; or mw.ustring.match(alt or &amp;quot;&amp;quot;, &#039;^[0-9]*px$&#039;, 1) ~= nil then&lt;br /&gt;
            alt = nil;&lt;br /&gt;
        end&lt;br /&gt;
        if title ~= &amp;quot;&amp;quot; and title ~= nil then&lt;br /&gt;
            -- does title param contain any templatestyles? If yes then set to blank.&lt;br /&gt;
            if mw.ustring.match(frame:preprocess(title), &#039;UNIQ%-%-templatestyles&#039;, 1) ~= nil then&lt;br /&gt;
                title = nil;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if title ~= &amp;quot;&amp;quot; and title ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|&amp;quot; .. title;&lt;br /&gt;
        end&lt;br /&gt;
        result = result .. &amp;quot;]]&amp;quot;;&lt;br /&gt;
        &lt;br /&gt;
        return result;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return i;&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
	<entry>
		<id>https://atmospedia.org/index.php?title=Module:Navbar&amp;diff=212</id>
		<title>Module:Navbar</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Module:Navbar&amp;diff=212"/>
		<updated>2024-07-03T18:32:42Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
local cfg = mw.loadData(&#039;Module:Navbar/configuration&#039;)&lt;br /&gt;
&lt;br /&gt;
local function get_title_arg(is_collapsible, template)&lt;br /&gt;
	local title_arg = 1&lt;br /&gt;
	if is_collapsible then title_arg = 2 end&lt;br /&gt;
	if template then title_arg = &#039;template&#039; end&lt;br /&gt;
	return title_arg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function choose_links(template, args)&lt;br /&gt;
	-- The show table indicates the default displayed items.&lt;br /&gt;
	-- view, talk, edit, hist, move, watch&lt;br /&gt;
	-- TODO: Move to configuration.&lt;br /&gt;
	local show = {true, true, true, false, false, false}&lt;br /&gt;
	if template then&lt;br /&gt;
		show[2] = false&lt;br /&gt;
		show[3] = false&lt;br /&gt;
		local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6,&lt;br /&gt;
			talk = 2, edit = 3, hist = 4, move = 5, watch = 6}&lt;br /&gt;
		-- TODO: Consider removing TableTools dependency.&lt;br /&gt;
		for _, v in ipairs(require (&#039;Module:TableTools&#039;).compressSparseArray(args)) do&lt;br /&gt;
			local num = index[v]&lt;br /&gt;
			if num then show[num] = true end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local remove_edit_link = args.noedit&lt;br /&gt;
	if remove_edit_link then show[3] = false end&lt;br /&gt;
	&lt;br /&gt;
	return show&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function add_link(link_description, ul, is_mini, font_style)&lt;br /&gt;
	local l&lt;br /&gt;
	if link_description.url then&lt;br /&gt;
		l = {&#039;[&#039;, &#039;&#039;, &#039;]&#039;}&lt;br /&gt;
	else&lt;br /&gt;
		l = {&#039;[[&#039;, &#039;|&#039;, &#039;]]&#039;}&lt;br /&gt;
	end&lt;br /&gt;
	ul:tag(&#039;li&#039;)&lt;br /&gt;
		:addClass(&#039;nv-&#039; .. link_description.full)&lt;br /&gt;
		:wikitext(l[1] .. link_description.link .. l[2])&lt;br /&gt;
		:tag(is_mini and &#039;abbr&#039; or &#039;span&#039;)&lt;br /&gt;
			:attr(&#039;title&#039;, link_description.html_title)&lt;br /&gt;
			:cssText(font_style)&lt;br /&gt;
			:wikitext(is_mini and link_description.mini or link_description.full)&lt;br /&gt;
			:done()&lt;br /&gt;
		:wikitext(l[3])&lt;br /&gt;
		:done()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style)&lt;br /&gt;
	&lt;br /&gt;
	local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)&lt;br /&gt;
	if not title then&lt;br /&gt;
		error(cfg.invalid_title .. title_text)&lt;br /&gt;
	end&lt;br /&gt;
	local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or &#039;&#039;&lt;br /&gt;
	&lt;br /&gt;
	-- TODO: Get link_descriptions and show into the configuration module.&lt;br /&gt;
	-- link_descriptions should be easier...&lt;br /&gt;
	local link_descriptions = {&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;v&#039;, [&#039;full&#039;] = &#039;view&#039;, [&#039;html_title&#039;] = &#039;View this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = title.fullText, [&#039;url&#039;] = false },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;t&#039;, [&#039;full&#039;] = &#039;talk&#039;, [&#039;html_title&#039;] = &#039;Discuss this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = talkpage, [&#039;url&#039;] = false },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;e&#039;, [&#039;full&#039;] = &#039;edit&#039;, [&#039;html_title&#039;] = &#039;Edit this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = &#039;Special:EditPage/&#039; .. title.fullText, [&#039;url&#039;] = false },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;h&#039;, [&#039;full&#039;] = &#039;hist&#039;, [&#039;html_title&#039;] = &#039;History of this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = &#039;Special:PageHistory/&#039; .. title.fullText, [&#039;url&#039;] = false },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;m&#039;, [&#039;full&#039;] = &#039;move&#039;, [&#039;html_title&#039;] = &#039;Move this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = mw.title.new(&#039;Special:Movepage&#039;):fullUrl(&#039;target=&#039;..title.fullText), [&#039;url&#039;] = true },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;w&#039;, [&#039;full&#039;] = &#039;watch&#039;, [&#039;html_title&#039;] = &#039;Watch this template&#039;, &lt;br /&gt;
			[&#039;link&#039;] = title:fullUrl(&#039;action=watch&#039;), [&#039;url&#039;] = true }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local ul = mw.html.create(&#039;ul&#039;)&lt;br /&gt;
	if has_brackets then&lt;br /&gt;
		ul:addClass(cfg.classes.brackets)&lt;br /&gt;
			:cssText(font_style)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for i, _ in ipairs(displayed_links) do&lt;br /&gt;
		if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end&lt;br /&gt;
	end&lt;br /&gt;
	return ul:done()&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._navbar(args)&lt;br /&gt;
	&lt;br /&gt;
	-- TODO: We probably don&#039;t need both fontstyle and fontcolor...&lt;br /&gt;
	local font_style = args.fontstyle&lt;br /&gt;
	local font_color = args.fontcolor&lt;br /&gt;
	local is_collapsible = args.collapsible&lt;br /&gt;
	local is_mini = args.mini&lt;br /&gt;
	local is_plain = args.plain&lt;br /&gt;
	&lt;br /&gt;
	local collapsible_class = nil&lt;br /&gt;
	if is_collapsible then&lt;br /&gt;
		collapsible_class = cfg.classes.collapsible&lt;br /&gt;
		if not is_plain then is_mini = 1 end&lt;br /&gt;
		if font_color then&lt;br /&gt;
			font_style = (font_style or &#039;&#039;) .. &#039;; color: &#039; .. font_color .. &#039;;&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local navbar_style = args.style&lt;br /&gt;
	local div = mw.html.create():tag(&#039;div&#039;)&lt;br /&gt;
	div&lt;br /&gt;
		:addClass(cfg.classes.navbar)&lt;br /&gt;
		:addClass(cfg.classes.plainlinks)&lt;br /&gt;
		:addClass(cfg.classes.horizontal_list)&lt;br /&gt;
		:addClass(collapsible_class) -- we made the determination earlier&lt;br /&gt;
		:cssText(navbar_style)&lt;br /&gt;
&lt;br /&gt;
	if is_mini then div:addClass(cfg.classes.mini) end&lt;br /&gt;
&lt;br /&gt;
	local box_text = (args.text or cfg.box_text) .. &#039; &#039;&lt;br /&gt;
	 -- the concatenated space guarantees the box text is separated&lt;br /&gt;
	if not (is_mini or is_plain) then&lt;br /&gt;
		div&lt;br /&gt;
			:tag(&#039;span&#039;)&lt;br /&gt;
				:addClass(cfg.classes.box_text)&lt;br /&gt;
				:cssText(font_style)&lt;br /&gt;
				:wikitext(box_text)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local template = args.template&lt;br /&gt;
	local displayed_links = choose_links(template, args)&lt;br /&gt;
	local has_brackets = args.brackets&lt;br /&gt;
	local title_arg = get_title_arg(is_collapsible, template)&lt;br /&gt;
	local title_text = args[title_arg] or (&#039;:&#039; .. mw.getCurrentFrame():getParent():getTitle())&lt;br /&gt;
	local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style)&lt;br /&gt;
	div:node(list)&lt;br /&gt;
&lt;br /&gt;
	if is_collapsible then&lt;br /&gt;
		local title_text_class&lt;br /&gt;
		if is_mini then&lt;br /&gt;
			title_text_class = cfg.classes.collapsible_title_mini&lt;br /&gt;
		else&lt;br /&gt;
			title_text_class = cfg.classes.collapsible_title_full&lt;br /&gt;
		end&lt;br /&gt;
		div:done()&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
			:addClass(title_text_class)&lt;br /&gt;
			:cssText(font_style)&lt;br /&gt;
			:wikitext(args[1])&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- hlist -&amp;gt; navbar is best-effort to preserve old Common.css ordering.&lt;br /&gt;
	return frame:extensionTag{&lt;br /&gt;
		name = &#039;templatestyles&#039;, args = { src = cfg.hlist_templatestyles }&lt;br /&gt;
	} .. frame:extensionTag{&lt;br /&gt;
		name = &#039;templatestyles&#039;, args = { src = cfg.templatestyles }&lt;br /&gt;
	} .. tostring(div:done())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.navbar(frame)&lt;br /&gt;
	return p._navbar(require(&#039;Module:Arguments&#039;).getArgs(frame))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
	<entry>
		<id>https://atmospedia.org/index.php?title=Module:Infobox&amp;diff=210</id>
		<title>Module:Infobox</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Module:Infobox&amp;diff=210"/>
		<updated>2024-07-03T18:32:42Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
local args = {}&lt;br /&gt;
local origArgs = {}&lt;br /&gt;
local root&lt;br /&gt;
local empty_row_categories = {}&lt;br /&gt;
local category_in_empty_row_pattern = &#039;%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]&#039;&lt;br /&gt;
local has_rows = false&lt;br /&gt;
local lists = {&lt;br /&gt;
	plainlist_t = {&lt;br /&gt;
		patterns = {&lt;br /&gt;
			&#039;^plainlist$&#039;,&lt;br /&gt;
			&#039;%splainlist$&#039;,&lt;br /&gt;
			&#039;^plainlist%s&#039;,&lt;br /&gt;
			&#039;%splainlist%s&#039;&lt;br /&gt;
		},&lt;br /&gt;
		found = false,&lt;br /&gt;
		styles = &#039;Plainlist/styles.css&#039;&lt;br /&gt;
	},&lt;br /&gt;
	hlist_t = {&lt;br /&gt;
		patterns = {&lt;br /&gt;
			&#039;^hlist$&#039;,&lt;br /&gt;
			&#039;%shlist$&#039;,&lt;br /&gt;
			&#039;^hlist%s&#039;,&lt;br /&gt;
			&#039;%shlist%s&#039;&lt;br /&gt;
		},&lt;br /&gt;
		found = false,&lt;br /&gt;
		styles = &#039;Hlist/styles.css&#039;&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 &#039;&#039;, 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;
local function fixChildBoxes(sval, tt)&lt;br /&gt;
	local function notempty( s ) return s and s:match( &#039;%S&#039; ) end&lt;br /&gt;
	&lt;br /&gt;
	if notempty(sval) then&lt;br /&gt;
		local marker = &#039;&amp;lt;span class=special_infobox_marker&amp;gt;&#039;&lt;br /&gt;
		local s = sval&lt;br /&gt;
		-- start moving templatestyles and categories inside of table rows&lt;br /&gt;
		local slast = &#039;&#039;&lt;br /&gt;
		while slast ~= s do&lt;br /&gt;
			slast = s&lt;br /&gt;
			s = mw.ustring.gsub(s, &#039;(&amp;lt;/[Tt][Rr]%s*&amp;gt;%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])&#039;, &#039;%2%1&#039;)&lt;br /&gt;
			s = mw.ustring.gsub(s, &#039;(&amp;lt;/[Tt][Rr]%s*&amp;gt;%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)&#039;, &#039;%2%1&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		-- end moving templatestyles and categories inside of table rows&lt;br /&gt;
		s = mw.ustring.gsub(s, &#039;(&amp;lt;%s*[Tt][Rr])&#039;, marker .. &#039;%1&#039;)&lt;br /&gt;
		s = mw.ustring.gsub(s, &#039;(&amp;lt;/[Tt][Rr]%s*&amp;gt;)&#039;, &#039;%1&#039; .. marker)&lt;br /&gt;
		if s:match(marker) then&lt;br /&gt;
			s = mw.ustring.gsub(s, marker .. &#039;%s*&#039; .. marker, &#039;&#039;)&lt;br /&gt;
			s = mw.ustring.gsub(s, &#039;([\r\n]|-[^\r\n]*[\r\n])%s*&#039; .. marker, &#039;%1&#039;)&lt;br /&gt;
			s = mw.ustring.gsub(s, marker .. &#039;%s*([\r\n]|-)&#039;, &#039;%1&#039;)&lt;br /&gt;
			s = mw.ustring.gsub(s, &#039;(&amp;lt;/[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*&amp;gt;%s*)&#039; .. marker, &#039;%1&#039;)&lt;br /&gt;
			s = mw.ustring.gsub(s, &#039;(&amp;lt;%s*[Tt][Aa][Bb][Ll][Ee][^&amp;lt;&amp;gt;]*&amp;gt;%s*)&#039; .. marker, &#039;%1&#039;)&lt;br /&gt;
			s = mw.ustring.gsub(s, &#039;^(%{|[^\r\n]*[\r\n]%s*)&#039; .. marker, &#039;%1&#039;)&lt;br /&gt;
			s = mw.ustring.gsub(s, &#039;([\r\n]%{|[^\r\n]*[\r\n]%s*)&#039; .. marker, &#039;%1&#039;)&lt;br /&gt;
			s = mw.ustring.gsub(s, marker .. &#039;(%s*&amp;lt;/[Tt][Aa][Bb][Ll][Ee]%s*&amp;gt;)&#039;, &#039;%1&#039;)&lt;br /&gt;
			s = mw.ustring.gsub(s, marker .. &#039;(%s*\n|%})&#039;, &#039;%1&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if s:match(marker) then&lt;br /&gt;
			local subcells = mw.text.split(s, marker)&lt;br /&gt;
			s = &#039;&#039;&lt;br /&gt;
			for k = 1, #subcells do&lt;br /&gt;
				if k == 1 then&lt;br /&gt;
					s = s .. subcells[k] .. &#039;&amp;lt;/&#039; .. tt .. &#039;&amp;gt;&amp;lt;/tr&amp;gt;&#039;&lt;br /&gt;
				elseif k == #subcells then&lt;br /&gt;
					local rowstyle = &#039; style=&amp;quot;display:none&amp;quot;&#039;&lt;br /&gt;
					if notempty(subcells[k]) then rowstyle = &#039;&#039;	end&lt;br /&gt;
					s = s .. &#039;&amp;lt;tr&#039; .. rowstyle ..&#039;&amp;gt;&amp;lt;&#039; .. tt .. &#039; colspan=2&amp;gt;\n&#039; ..&lt;br /&gt;
						subcells[k]&lt;br /&gt;
				elseif notempty(subcells[k]) then&lt;br /&gt;
					if (k % 2) == 0 then&lt;br /&gt;
						s = s .. subcells[k]&lt;br /&gt;
					else&lt;br /&gt;
						s = s .. &#039;&amp;lt;tr&amp;gt;&amp;lt;&#039; .. tt .. &#039; colspan=2&amp;gt;\n&#039; ..&lt;br /&gt;
							subcells[k] .. &#039;&amp;lt;/&#039; .. tt .. &#039;&amp;gt;&amp;lt;/tr&amp;gt;&#039;&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- the next two lines add a newline at the end of lists for the PHP parser&lt;br /&gt;
		-- [[Special:Diff/849054481]]&lt;br /&gt;
		-- remove when [[:phab:T191516]] is fixed or OBE&lt;br /&gt;
		s = mw.ustring.gsub(s, &#039;([\r\n][%*#;:][^\r\n]*)$&#039;, &#039;%1\n&#039;)&lt;br /&gt;
		s = mw.ustring.gsub(s, &#039;^([%*#;:][^\r\n]*)$&#039;, &#039;%1\n&#039;)&lt;br /&gt;
		s = mw.ustring.gsub(s, &#039;^([%*#;:])&#039;, &#039;\n%1&#039;)&lt;br /&gt;
		s = mw.ustring.gsub(s, &#039;^(%{%|)&#039;, &#039;\n%1&#039;)&lt;br /&gt;
		return s&lt;br /&gt;
	else&lt;br /&gt;
		return sval&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Cleans empty tables&lt;br /&gt;
local function cleanInfobox()&lt;br /&gt;
	root = tostring(root)&lt;br /&gt;
	if has_rows == false then&lt;br /&gt;
		root = mw.ustring.gsub(root, &#039;&amp;lt;table[^&amp;lt;&amp;gt;]*&amp;gt;%s*&amp;lt;/table&amp;gt;&#039;, &#039;&#039;)&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 &#039;data&#039;, and&lt;br /&gt;
-- &#039;data1&#039;, &#039;data2&#039;, and &#039;data5&#039; exist, it would return {1, 2, 5}.&lt;br /&gt;
local function getArgNums(prefix)&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local num = tostring(k):match(&#039;^&#039; .. prefix .. &#039;([1-9]%d*)$&#039;)&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;
	&lt;br /&gt;
	if rowArgs.header and rowArgs.header ~= &#039;_BLANK_&#039; then&lt;br /&gt;
		has_rows = true&lt;br /&gt;
		has_list_class({ rowArgs.rowclass, rowArgs.class, args.headerclass })&lt;br /&gt;
		&lt;br /&gt;
		root&lt;br /&gt;
			:tag(&#039;tr&#039;)&lt;br /&gt;
				:addClass(rowArgs.rowclass)&lt;br /&gt;
				:cssText(rowArgs.rowstyle)&lt;br /&gt;
				:tag(&#039;th&#039;)&lt;br /&gt;
					:attr(&#039;colspan&#039;, &#039;2&#039;)&lt;br /&gt;
					:addClass(&#039;infobox-header&#039;)&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;
					:wikitext(fixChildBoxes(rowArgs.header, &#039;th&#039;))&lt;br /&gt;
		if rowArgs.data then&lt;br /&gt;
			root:wikitext(&lt;br /&gt;
				&#039;[[Category:Pages using infobox templates with ignored data cells]]&#039;&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
	elseif rowArgs.data and rowArgs.data:gsub(category_in_empty_row_pattern, &#039;&#039;):match(&#039;^%S&#039;) then&lt;br /&gt;
		has_rows = true&lt;br /&gt;
		has_list_class({ rowArgs.rowclass, rowArgs.class })&lt;br /&gt;
		&lt;br /&gt;
		local row = root:tag(&#039;tr&#039;)&lt;br /&gt;
		row:addClass(rowArgs.rowclass)&lt;br /&gt;
		row:cssText(rowArgs.rowstyle)&lt;br /&gt;
		if rowArgs.label then&lt;br /&gt;
			row&lt;br /&gt;
				:tag(&#039;th&#039;)&lt;br /&gt;
					:attr(&#039;scope&#039;, &#039;row&#039;)&lt;br /&gt;
					:addClass(&#039;infobox-label&#039;)&lt;br /&gt;
					-- @deprecated next; target .infobox-&amp;lt;name&amp;gt; .infobox-label&lt;br /&gt;
					:cssText(args.labelstyle)&lt;br /&gt;
					:cssText(rowArgs.rowcellstyle)&lt;br /&gt;
					:wikitext(rowArgs.label)&lt;br /&gt;
					:done()&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local dataCell = row:tag(&#039;td&#039;)&lt;br /&gt;
		dataCell&lt;br /&gt;
			:attr(&#039;colspan&#039;, not rowArgs.label and &#039;2&#039; or nil)&lt;br /&gt;
			:addClass(not rowArgs.label and &#039;infobox-full-data&#039; or &#039;infobox-data&#039;)&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;
			:wikitext(fixChildBoxes(rowArgs.data, &#039;td&#039;))&lt;br /&gt;
	else&lt;br /&gt;
		table.insert(empty_row_categories, rowArgs.data or &#039;&#039;)&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;
&lt;br /&gt;
	has_rows = true&lt;br /&gt;
	has_list_class({args.titleclass})&lt;br /&gt;
	&lt;br /&gt;
	root&lt;br /&gt;
		:tag(&#039;caption&#039;)&lt;br /&gt;
			:addClass(&#039;infobox-title&#039;)&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;
	&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;
&lt;br /&gt;
	has_rows = true&lt;br /&gt;
	has_list_class({ args.aboveclass })&lt;br /&gt;
	&lt;br /&gt;
	root&lt;br /&gt;
		:tag(&#039;tr&#039;)&lt;br /&gt;
			:tag(&#039;th&#039;)&lt;br /&gt;
				:attr(&#039;colspan&#039;, &#039;2&#039;)&lt;br /&gt;
				:addClass(&#039;infobox-above&#039;)&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(fixChildBoxes(args.above,&#039;th&#039;))&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;
&lt;br /&gt;
	has_rows = true&lt;br /&gt;
	has_list_class({ args.belowclass })&lt;br /&gt;
	&lt;br /&gt;
	root&lt;br /&gt;
		:tag(&#039;tr&#039;)&lt;br /&gt;
			:tag(&#039;td&#039;)&lt;br /&gt;
				:attr(&#039;colspan&#039;, &#039;2&#039;)&lt;br /&gt;
				:addClass(&#039;infobox-below&#039;)&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;
				:wikitext(fixChildBoxes(args.below,&#039;td&#039;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function addSubheaderRow(subheaderArgs)&lt;br /&gt;
	if subheaderArgs.data and&lt;br /&gt;
		subheaderArgs.data:gsub(category_in_empty_row_pattern, &#039;&#039;):match(&#039;^%S&#039;) then&lt;br /&gt;
		has_rows = true&lt;br /&gt;
		has_list_class({ subheaderArgs.rowclass, subheaderArgs.class })&lt;br /&gt;
		&lt;br /&gt;
		local row = root:tag(&#039;tr&#039;)&lt;br /&gt;
		row:addClass(subheaderArgs.rowclass)&lt;br /&gt;
&lt;br /&gt;
		local dataCell = row:tag(&#039;td&#039;)&lt;br /&gt;
		dataCell&lt;br /&gt;
			:attr(&#039;colspan&#039;, &#039;2&#039;)&lt;br /&gt;
			:addClass(&#039;infobox-subheader&#039;)&lt;br /&gt;
			:addClass(subheaderArgs.class)&lt;br /&gt;
			:cssText(subheaderArgs.datastyle)&lt;br /&gt;
			:cssText(subheaderArgs.rowcellstyle)&lt;br /&gt;
			:wikitext(fixChildBoxes(subheaderArgs.data, &#039;td&#039;))&lt;br /&gt;
	else&lt;br /&gt;
		table.insert(empty_row_categories, subheaderArgs.data or &#039;&#039;)&lt;br /&gt;
	end&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(&#039;subheader&#039;)&lt;br /&gt;
	for k, num in ipairs(subheadernums) do&lt;br /&gt;
		addSubheaderRow({&lt;br /&gt;
			data = args[&#039;subheader&#039; .. 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[&#039;subheaderstyle&#039; .. tostring(num)],&lt;br /&gt;
			class = args.subheaderclass,&lt;br /&gt;
			rowclass = args[&#039;subheaderrowclass&#039; .. 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;
&lt;br /&gt;
	if imageArgs.data and&lt;br /&gt;
		imageArgs.data:gsub(category_in_empty_row_pattern, &#039;&#039;):match(&#039;^%S&#039;) then&lt;br /&gt;
&lt;br /&gt;
		has_rows = true&lt;br /&gt;
		has_list_class({ imageArgs.rowclass, imageArgs.class })&lt;br /&gt;
		&lt;br /&gt;
		local row = root:tag(&#039;tr&#039;)&lt;br /&gt;
		row:addClass(imageArgs.rowclass)&lt;br /&gt;
&lt;br /&gt;
		local dataCell = row:tag(&#039;td&#039;)&lt;br /&gt;
		dataCell&lt;br /&gt;
			:attr(&#039;colspan&#039;, &#039;2&#039;)&lt;br /&gt;
			:addClass(&#039;infobox-image&#039;)&lt;br /&gt;
			:addClass(imageArgs.class)&lt;br /&gt;
			:cssText(imageArgs.datastyle)&lt;br /&gt;
			:wikitext(fixChildBoxes(imageArgs.data, &#039;td&#039;))&lt;br /&gt;
	else&lt;br /&gt;
		table.insert(empty_row_categories, imageArgs.data or &#039;&#039;)&lt;br /&gt;
	end&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(&#039;image&#039;)&lt;br /&gt;
	for k, num in ipairs(imagenums) do&lt;br /&gt;
		local caption = args[&#039;caption&#039; .. tostring(num)]&lt;br /&gt;
		local data = mw.html.create():wikitext(args[&#039;image&#039; .. tostring(num)])&lt;br /&gt;
		if caption then&lt;br /&gt;
			data&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;infobox-caption&#039;)&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[&#039;imagerowclass&#039; .. tostring(num)]&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- When autoheaders are turned on, preprocesses the rows&lt;br /&gt;
local function preprocessRows()&lt;br /&gt;
	if not args.autoheaders then return end&lt;br /&gt;
	&lt;br /&gt;
	local rownums = union(getArgNums(&#039;header&#039;), getArgNums(&#039;data&#039;))&lt;br /&gt;
	table.sort(rownums)&lt;br /&gt;
	local lastheader&lt;br /&gt;
	for k, num in ipairs(rownums) do&lt;br /&gt;
		if args[&#039;header&#039; .. tostring(num)] then&lt;br /&gt;
			if lastheader then&lt;br /&gt;
				args[&#039;header&#039; .. tostring(lastheader)] = nil&lt;br /&gt;
			end&lt;br /&gt;
			lastheader = num&lt;br /&gt;
		elseif args[&#039;data&#039; .. tostring(num)] and&lt;br /&gt;
			args[&#039;data&#039; .. tostring(num)]:gsub(&lt;br /&gt;
				category_in_empty_row_pattern, &#039;&#039;&lt;br /&gt;
			):match(&#039;^%S&#039;) then&lt;br /&gt;
			local data = args[&#039;data&#039; .. tostring(num)]&lt;br /&gt;
			if data:gsub(category_in_empty_row_pattern, &#039;&#039;):match(&#039;%S&#039;) then&lt;br /&gt;
				lastheader = nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if lastheader then&lt;br /&gt;
		args[&#039;header&#039; .. tostring(lastheader)] = nil&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;
&lt;br /&gt;
	local rownums = union(getArgNums(&#039;header&#039;), getArgNums(&#039;data&#039;))&lt;br /&gt;
	table.sort(rownums)&lt;br /&gt;
	for k, num in ipairs(rownums) do&lt;br /&gt;
		addRow({&lt;br /&gt;
			header = args[&#039;header&#039; .. tostring(num)],&lt;br /&gt;
			label = args[&#039;label&#039; .. tostring(num)],&lt;br /&gt;
			data = args[&#039;data&#039; .. tostring(num)],&lt;br /&gt;
			datastyle = args.datastyle,&lt;br /&gt;
			class = args[&#039;class&#039; .. tostring(num)],&lt;br /&gt;
			rowclass = args[&#039;rowclass&#039; .. tostring(num)],&lt;br /&gt;
			-- @deprecated next; target .infobox-&amp;lt;name&amp;gt; rowclass&lt;br /&gt;
			rowstyle = args[&#039;rowstyle&#039; .. tostring(num)],&lt;br /&gt;
			rowcellstyle = args[&#039;rowcellstyle&#039; .. 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;
	has_rows = true&lt;br /&gt;
	root&lt;br /&gt;
		:tag(&#039;tr&#039;)&lt;br /&gt;
			:tag(&#039;td&#039;)&lt;br /&gt;
				:attr(&#039;colspan&#039;, &#039;2&#039;)&lt;br /&gt;
				:addClass(&#039;infobox-navbar&#039;)&lt;br /&gt;
				:wikitext(require(&#039;Module:Navbar&#039;)._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[&#039;italic title&#039;] and mw.ustring.lower(args[&#039;italic title&#039;])&lt;br /&gt;
	if italicTitle == &#039;&#039; or italicTitle == &#039;force&#039; or italicTitle == &#039;yes&#039; then&lt;br /&gt;
		root:wikitext(require(&#039;Module:Italic title&#039;)._main({}))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Categories in otherwise empty rows are collected in empty_row_categories.&lt;br /&gt;
-- This function adds them to the module output. It is not affected by&lt;br /&gt;
-- args.decat because this module should not prevent module-external categories&lt;br /&gt;
-- from rendering.&lt;br /&gt;
local function renderEmptyRowCategories()&lt;br /&gt;
	for _, s in ipairs(empty_row_categories) do&lt;br /&gt;
		root:wikitext(s)&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;
	if args.decat == &#039;yes&#039; then return end&lt;br /&gt;
	if args.child == &#039;yes&#039; then&lt;br /&gt;
		if args.title then&lt;br /&gt;
			root:wikitext(&lt;br /&gt;
				&#039;[[Category:Pages using embedded infobox templates with the title parameter]]&#039;&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
	elseif #(getArgNums(&#039;data&#039;)) == 0 and mw.title.getCurrentTitle().namespace == 0 then&lt;br /&gt;
		root:wikitext(&#039;[[Category:Articles using infobox templates with no data rows]]&#039;)&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 &#039;raw&#039; 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 = &#039;&#039;&lt;br /&gt;
	if lists.hlist_t.found then&lt;br /&gt;
		hlist_templatestyles = frame:extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;, args = { src = lists.hlist_t.styles }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local plainlist_templatestyles = &#039;&#039;&lt;br /&gt;
	if lists.plainlist_t.found then&lt;br /&gt;
		plainlist_templatestyles = frame:extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;, 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 = &#039;templatestyles&#039;, args = { src = &#039;Module:Infobox/styles.css&#039; }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local templatestyles = &#039;&#039;&lt;br /&gt;
	if args[&#039;templatestyles&#039;] then&lt;br /&gt;
		templatestyles = frame:extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;, args = { src = args[&#039;templatestyles&#039;] }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local child_templatestyles = &#039;&#039;&lt;br /&gt;
	if args[&#039;child templatestyles&#039;] then&lt;br /&gt;
		child_templatestyles = frame:extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;, args = { src = args[&#039;child templatestyles&#039;] }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local grandchild_templatestyles = &#039;&#039;&lt;br /&gt;
	if args[&#039;grandchild templatestyles&#039;] then&lt;br /&gt;
		grandchild_templatestyles = frame:extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;, args = { src = args[&#039;grandchild templatestyles&#039;] }&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;
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 &#039;child&#039; inside another infobox.&lt;br /&gt;
local function _infobox()&lt;br /&gt;
	if args.child ~= &#039;yes&#039; then&lt;br /&gt;
		root = mw.html.create(&#039;table&#039;)&lt;br /&gt;
&lt;br /&gt;
		root&lt;br /&gt;
			:addClass(args.subbox == &#039;yes&#039; and &#039;infobox-subbox&#039; or &#039;infobox&#039;)&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;
		has_list_class({ args.bodyclass })&lt;br /&gt;
&lt;br /&gt;
		renderTitle()&lt;br /&gt;
		renderAboveRow()&lt;br /&gt;
	else&lt;br /&gt;
		root = mw.html.create()&lt;br /&gt;
&lt;br /&gt;
		root&lt;br /&gt;
			:wikitext(args.title)&lt;br /&gt;
	end&lt;br /&gt;
	structure_infobox_common()&lt;br /&gt;
	&lt;br /&gt;
	return loadTemplateStyles() .. root&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- If the argument exists and isn&#039;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] ~= &#039;&#039; 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) ~= &#039;table&#039; 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) ~= &#039;number&#039; 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) ~= &#039;table&#039; or type(v.prefix) ~= &amp;quot;string&amp;quot; or&lt;br /&gt;
			(v.depend and type(v.depend) ~= &#039;table&#039;) then&lt;br /&gt;
			error(&#039;Invalid input detected to preprocessArgs prefix table&#039;, 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) ~= &#039;string&#039; then&lt;br /&gt;
					error(&#039;Invalid &amp;quot;depend&amp;quot; parameter value detected in preprocessArgs&#039;)&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 = 1 -- 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)&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)&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;
&lt;br /&gt;
	preprocessSingleArg(&#039;autoheaders&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;child&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;bodyclass&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;subbox&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;bodystyle&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;title&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;titleclass&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;titlestyle&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;above&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;aboveclass&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;abovestyle&#039;)&lt;br /&gt;
	preprocessArgs({&lt;br /&gt;
		{prefix = &#039;subheader&#039;, depend = {&#039;subheaderstyle&#039;, &#039;subheaderrowclass&#039;}}&lt;br /&gt;
	}, 10)&lt;br /&gt;
	preprocessSingleArg(&#039;subheaderstyle&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;subheaderclass&#039;)&lt;br /&gt;
	preprocessArgs({&lt;br /&gt;
		{prefix = &#039;image&#039;, depend = {&#039;caption&#039;, &#039;imagerowclass&#039;}}&lt;br /&gt;
	}, 10)&lt;br /&gt;
	preprocessSingleArg(&#039;captionstyle&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;imagestyle&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;imageclass&#039;)&lt;br /&gt;
	preprocessArgs({&lt;br /&gt;
		{prefix = &#039;header&#039;},&lt;br /&gt;
		{prefix = &#039;data&#039;, depend = {&#039;label&#039;}},&lt;br /&gt;
		{prefix = &#039;rowclass&#039;},&lt;br /&gt;
		{prefix = &#039;rowstyle&#039;},&lt;br /&gt;
		{prefix = &#039;rowcellstyle&#039;},&lt;br /&gt;
		{prefix = &#039;class&#039;}&lt;br /&gt;
	}, 50)&lt;br /&gt;
	preprocessSingleArg(&#039;headerclass&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;headerstyle&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;labelstyle&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;datastyle&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;below&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;belowclass&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;belowstyle&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;name&#039;)&lt;br /&gt;
	-- different behaviour for italics if blank or absent&lt;br /&gt;
	args[&#039;italic title&#039;] = origArgs[&#039;italic title&#039;]&lt;br /&gt;
	preprocessSingleArg(&#039;decat&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;templatestyles&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;child templatestyles&#039;)&lt;br /&gt;
	preprocessSingleArg(&#039;grandchild templatestyles&#039;)&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)&lt;br /&gt;
	origArgs = {}&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;
return p&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
	<entry>
		<id>https://atmospedia.org/index.php?title=Module:Authority_control&amp;diff=208</id>
		<title>Module:Authority control</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Module:Authority_control&amp;diff=208"/>
		<updated>2024-07-03T18:32:42Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;require(&#039;strict&#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
local arg = mw.getCurrentFrame().args.config&lt;br /&gt;
local configfile = &#039;Module:Authority control/config&#039; .. (arg and arg~=&#039;&#039; and (&#039;/&#039; .. arg) or &#039;&#039;)&lt;br /&gt;
local config = mw.loadData(configfile)&lt;br /&gt;
local title = mw.title.getCurrentTitle()&lt;br /&gt;
local namespace = title.namespace&lt;br /&gt;
local testcases = title.subpageText == config.i18n.testcases&lt;br /&gt;
&lt;br /&gt;
local function needsAttention(sortkey)&lt;br /&gt;
	return &#039;[[&#039; .. config.i18n.category .. &#039;:&#039; .. config.i18n.attentioncat .. &#039;|&#039; .. sortkey .. title.text .. &#039;]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function addCat(cat,sortkey)&lt;br /&gt;
	if cat and cat ~= &#039;&#039; and (namespace == 0 or namespace == 14 or testcases) then&lt;br /&gt;
		local redlinkcat = &#039;&#039;&lt;br /&gt;
		if testcases == false then&lt;br /&gt;
			local success, exists = pcall(function() return mw.title.new(cat, 14).exists end)&lt;br /&gt;
			if success and not exists then &lt;br /&gt;
				redlinkcat = needsAttention(&#039;N&#039;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if sortkey then&lt;br /&gt;
			cat = &#039;[[&#039; .. config.i18n.category .. &#039;:&#039;..cat..&#039;|&#039; .. sortkey .. title.text .. &#039;]]&#039;&lt;br /&gt;
		else&lt;br /&gt;
			cat = &#039;[[&#039; .. config.i18n.category .. &#039;:&#039;..cat..&#039;]]&#039;&lt;br /&gt;
		end&lt;br /&gt;
		cat = cat .. redlinkcat&lt;br /&gt;
		return cat&lt;br /&gt;
	else&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getCatForId(id,faulty)&lt;br /&gt;
	local cat = string.format(&lt;br /&gt;
		config.i18n.cat,&lt;br /&gt;
		(faulty and config.i18n.faulty..&#039; &#039; or &#039;&#039;) .. id&lt;br /&gt;
	)&lt;br /&gt;
	return addCat(cat)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getIdsFromWikidata(qid,property)&lt;br /&gt;
	local function getquals(statement,qualid)&lt;br /&gt;
		if statement.qualifiers and statement.qualifiers[&#039;P&#039;..qualid] then&lt;br /&gt;
			return mw.wikibase.renderSnak(statement.qualifiers[&#039;P&#039;..qualid][1])&lt;br /&gt;
		else&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local ids = {}&lt;br /&gt;
	if qid then&lt;br /&gt;
		for _, statement in ipairs(mw.wikibase.getBestStatements(qid,property)) do&lt;br /&gt;
			if statement.mainsnak.datavalue then&lt;br /&gt;
				local val = statement.mainsnak.datavalue.value&lt;br /&gt;
				if val then&lt;br /&gt;
					local namedas = getquals(statement,1810) or getquals(statement,742) or &#039;&#039;&lt;br /&gt;
					table.insert(ids,{id=val,name=namedas})&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ids&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _makelink = function(conf,val,nextid,qid) --validate values and create a link&lt;br /&gt;
	local function tooltip(text,label)&lt;br /&gt;
		if label and label~=&#039;&#039; then&lt;br /&gt;
			return mw.getCurrentFrame():expandTemplate{title = &amp;quot;Tooltip&amp;quot;, args = {text,label}}&lt;br /&gt;
		else&lt;br /&gt;
			return text&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local link&lt;br /&gt;
	if nextid==1 then&lt;br /&gt;
		if conf.prefix then&lt;br /&gt;
			link = &#039;*&#039; .. conf.prefix .. &#039;\n**&#039;&lt;br /&gt;
		else&lt;br /&gt;
			link = &#039;*&#039;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		link = &#039;\n**&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local valid_value = false&lt;br /&gt;
	if conf.customlink then -- use function to validate and generate link&lt;br /&gt;
		local label = nextid&amp;gt;1 and nextid&lt;br /&gt;
		local newlink= require(config.auxiliary)[conf.customlink](val.id,label)&lt;br /&gt;
		if newlink then&lt;br /&gt;
			link = link .. newlink&lt;br /&gt;
			valid_value = true&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if conf.pattern then -- use pattern to determine validity if defined&lt;br /&gt;
			valid_value = string.match(val.id,&#039;^&#039;..conf.pattern..&#039;$&#039;)&lt;br /&gt;
		elseif conf.patterns then&lt;br /&gt;
			for _,pattern in ipairs(conf.patterns) do&lt;br /&gt;
				valid_value = val.id:match(&#039;^&#039;..pattern..&#039;$&#039;)&lt;br /&gt;
				if valid_value then break end&lt;br /&gt;
			end&lt;br /&gt;
		elseif conf.valid then -- otherwise use function to determine validity&lt;br /&gt;
			valid_value = require(config.auxiliary)[conf.valid](val.id)&lt;br /&gt;
		else -- no validation possible&lt;br /&gt;
			valid_value = val.id&lt;br /&gt;
		end&lt;br /&gt;
		if valid_value then&lt;br /&gt;
			local newlink&lt;br /&gt;
			local label = conf.label&lt;br /&gt;
			if not label or nextid&amp;gt;1 then&lt;br /&gt;
				label = tostring(nextid)&lt;br /&gt;
			end&lt;br /&gt;
			if conf.link then&lt;br /&gt;
				valid_value = valid_value:gsub(&#039;%%&#039;, &#039;%%%%&#039;)&lt;br /&gt;
				newlink = &#039;[&#039; .. mw.ustring.gsub(conf.link,&#039;%$1&#039;,valid_value) .. &#039; &#039; .. label .. &#039;]&#039;&lt;br /&gt;
			else&lt;br /&gt;
				newlink = valid_value&lt;br /&gt;
			end&lt;br /&gt;
			link = link .. &#039;&amp;lt;span class=&amp;quot;uid&amp;quot;&amp;gt;&#039;..tooltip(newlink,val.name)..&#039;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if valid_value then&lt;br /&gt;
		link = link .. getCatForId(conf.category or conf[1])&lt;br /&gt;
	else&lt;br /&gt;
		--local preview = require(&amp;quot;Module:If preview&amp;quot;)&lt;br /&gt;
		local wdlink = qid and &#039;[[:wikidata:&#039; .. qid .. &#039;#P&#039; .. conf.property .. &#039;]]&#039; or &#039;&#039;&lt;br /&gt;
		local tooltip = string.format(&lt;br /&gt;
			config.i18n.idnotvalid,&lt;br /&gt;
			conf[1],&lt;br /&gt;
			val.id&lt;br /&gt;
		)&lt;br /&gt;
		link = link .. &#039;[[File:&#039; .. config.i18n.warningicon .. &#039;|20px|frameless|link=&#039; .. wdlink .. &#039;|&#039; .. tooltip .. &#039;.]]&#039;&lt;br /&gt;
		if conf.errorcat then&lt;br /&gt;
			link = link .. addCat(conf.errorcat)&lt;br /&gt;
		else&lt;br /&gt;
			link = link .. getCatForId(conf.category or conf[1],true)&lt;br /&gt;
		end&lt;br /&gt;
		link = link .. addCat(config.i18n.allfaultycat,conf[1])-- .. preview._warning({&#039;The &#039;..conf[1]..&#039; id &#039;..val..&#039; is not valid.&#039;})&lt;br /&gt;
	end&lt;br /&gt;
	return link&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
--[[                                   Main                                   ]]&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
function p.authorityControl(frame)&lt;br /&gt;
	local function resolveQID(qid)&lt;br /&gt;
		if qid then&lt;br /&gt;
			qid = &#039;Q&#039;..mw.ustring.gsub(qid, &#039;^[Qq]&#039;, &#039;&#039;)&lt;br /&gt;
			if mw.wikibase.isValidEntityId(qid) and mw.wikibase.entityExists(qid) then&lt;br /&gt;
				local sitelink = mw.wikibase.getSitelink(qid)&lt;br /&gt;
				if sitelink then&lt;br /&gt;
					return mw.wikibase.getEntityIdForTitle(sitelink) or mw.wikibase.getEntity(qid).id&lt;br /&gt;
				end&lt;br /&gt;
				return mw.wikibase.getEntity(qid).id&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local conf = config.config&lt;br /&gt;
	local parentArgs = frame:getParent().args&lt;br /&gt;
	local auxCats = &#039;&#039;&lt;br /&gt;
	local rct = false -- boolean to track if there are any links to be returned&lt;br /&gt;
	local qid,topic&lt;br /&gt;
	local wikilink = function(qid,hideifequal)&lt;br /&gt;
		local label,sitelink = mw.wikibase.getLabel(qid),mw.wikibase.getSitelink(qid)&lt;br /&gt;
		if label then&lt;br /&gt;
			if sitelink then&lt;br /&gt;
				local target = mw.title.new(sitelink)&lt;br /&gt;
				if target==title or (target.isRedirect and target.redirectTarget==title) then -- do not link&lt;br /&gt;
					return label&lt;br /&gt;
				else -- make wikilink to article&lt;br /&gt;
					return &#039;[[&#039; .. sitelink .. &#039;|&#039; .. label .. &#039;]]&#039;&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				return label&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			auxCats = auxCats .. needsAttention(&#039;L&#039;)&lt;br /&gt;
			return qid&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if namespace == 0 then&lt;br /&gt;
		qid = mw.wikibase.getEntityIdForCurrentPage()&lt;br /&gt;
	end&lt;br /&gt;
	if qid then -- article is connected to Wikidata item&lt;br /&gt;
		if parentArgs.qid and (resolveQID(parentArgs.qid) ~= qid) then -- non-matching qid parameter&lt;br /&gt;
			auxCats = auxCats .. needsAttention(&#039;D&#039;)&lt;br /&gt;
		end&lt;br /&gt;
	else -- page is not connected to any Wikidata item&lt;br /&gt;
		qid = resolveQID(parentArgs.qid) -- check qid parameter if no wikidata item is connected&lt;br /&gt;
		if qid then -- qid parameter is valid, set topic to display&lt;br /&gt;
			topic = mw.wikibase.getLabel(qid)&lt;br /&gt;
			if topic then&lt;br /&gt;
				if mw.ustring.lower(title.subpageText) == mw.ustring.lower(topic) then -- suppress topic display if subpagename equals topic up to case change&lt;br /&gt;
					topic = nil&lt;br /&gt;
				end&lt;br /&gt;
				if topic and mw.wikibase.getSitelink(qid) then -- make wikilink to article&lt;br /&gt;
					topic = &#039;[[&#039; .. mw.wikibase.getSitelink(qid) .. &#039;|&#039; .. topic .. &#039;]]&#039;&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				auxCats = auxCats .. needsAttention(&#039;L&#039;)&lt;br /&gt;
			end&lt;br /&gt;
		elseif parentArgs.qid and parentArgs.qid~=&#039;&#039; then -- invalid qid has been supplied, add to tracking cat&lt;br /&gt;
			auxCats = auxCats .. needsAttention(&#039;Q&#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local qids = {} -- setup any additional QIDs&lt;br /&gt;
	if parentArgs.additional==&#039;auto&#039; and qid then  -- check P527 for parts to add additional qids&lt;br /&gt;
		local checkparts = function(property)&lt;br /&gt;
			local parts = mw.wikibase.getBestStatements(qid,property)&lt;br /&gt;
			if parts then&lt;br /&gt;
				for _,part in ipairs(parts) do&lt;br /&gt;
					if part.mainsnak.datavalue and part.mainsnak.datavalue.value.id then&lt;br /&gt;
						local resolvedqid = resolveQID(part.mainsnak.datavalue.value.id)&lt;br /&gt;
						if resolvedqid then&lt;br /&gt;
							table.insert(qids,resolvedqid)&lt;br /&gt;
		end end end end end&lt;br /&gt;
		for _,part in ipairs(config.auto_additional) do&lt;br /&gt;
			checkparts(&#039;P&#039;..tostring(part))&lt;br /&gt;
		end&lt;br /&gt;
	elseif parentArgs.additional and parentArgs.additional ~= &#039;&#039; then&lt;br /&gt;
		for _,v in ipairs(mw.text.split(parentArgs.additional,&amp;quot;%s*,%s*&amp;quot;)) do&lt;br /&gt;
			v = resolveQID(v)&lt;br /&gt;
			if v then&lt;br /&gt;
				if v == qid then -- duplicate of qid parameter&lt;br /&gt;
					auxCats = auxCats .. needsAttention(&#039;R&#039;)&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(qids,v)&lt;br /&gt;
			else -- invalid QID specified&lt;br /&gt;
				auxCats = auxCats .. needsAttention(&#039;A&#039;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local sections = {}&lt;br /&gt;
	local localparams = false&lt;br /&gt;
	local numsections = 0&lt;br /&gt;
	for _,_ in ipairs(config.sections) do numsections = numsections + 1 end&lt;br /&gt;
	for _ = 1,#qids+numsections do table.insert(sections,{}) end&lt;br /&gt;
	local qslink = &#039;&#039; -- setup link to add using QuickStatements&lt;br /&gt;
&lt;br /&gt;
	-- check which identifiers to show/suppress in template&lt;br /&gt;
	local show = {} -- setup list&lt;br /&gt;
	local showall = true&lt;br /&gt;
	local function stripP(pid)&lt;br /&gt;
		if pid:match(&amp;quot;^[Pp]%d+$&amp;quot;) then&lt;br /&gt;
			pid = mw.ustring.gsub(pid,&#039;[Pp]&#039;,&#039;&#039;) --strip P from property number&lt;br /&gt;
		end&lt;br /&gt;
		if pid:match(&amp;quot;^%d+$&amp;quot;) then&lt;br /&gt;
			return tonumber(pid)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local function addshowlist(list)&lt;br /&gt;
		if list and list ~= &#039;&#039; then&lt;br /&gt;
			for _,v in ipairs(mw.text.split(string.lower(list),&amp;quot;%s*,%s*&amp;quot;)) do&lt;br /&gt;
				local vprop = stripP(v)&lt;br /&gt;
				if vprop then -- e.g. show=P214 to show one particular property&lt;br /&gt;
					show[vprop] = true&lt;br /&gt;
				else -- e.g. show=arts to use whitelist&lt;br /&gt;
					if config.whitelists[v] then&lt;br /&gt;
						for _,w in ipairs(config.whitelists[v].properties) do&lt;br /&gt;
							show[w] = true&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			showall = false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	addshowlist(frame.args.show) -- check show= parameter on wrapper template&lt;br /&gt;
	addshowlist(parentArgs.show or parentArgs.country) -- check show parameter on article template&lt;br /&gt;
	if parentArgs.suppress then&lt;br /&gt;
		local suppresslist = mw.text.split(parentArgs.suppress,&amp;quot;%s*,%s*&amp;quot;) -- split parameter by comma&lt;br /&gt;
		for _,v in ipairs(suppresslist) do&lt;br /&gt;
			v = stripP(string.upper(v))&lt;br /&gt;
			if v then&lt;br /&gt;
				show[v] = false&lt;br /&gt;
				auxCats = auxCats .. &#039;[[&#039; .. config.i18n.category .. &#039;:&#039; .. config.i18n.suppressedcat .. &#039;]]&#039;&lt;br /&gt;
			else&lt;br /&gt;
				auxCats = auxCats .. needsAttention(&#039;P&#039;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local function makeSections(qid,addit)&lt;br /&gt;
		local tval = {}&lt;br /&gt;
		local function parameter_is_used(property)&lt;br /&gt;
			local used = false&lt;br /&gt;
			if property then&lt;br /&gt;
				if tval[property] then&lt;br /&gt;
					if tval[property][1] then&lt;br /&gt;
						used = true&lt;br /&gt;
					end&lt;br /&gt;
				elseif tval[property] == false then -- property has been manually suppressed&lt;br /&gt;
					used = true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			return used&lt;br /&gt;
		end&lt;br /&gt;
		for _, params in ipairs(conf) do&lt;br /&gt;
			tval[params.property] = getIdsFromWikidata(qid, &#039;P&#039; .. params.property) -- setup table for values with property number as key&lt;br /&gt;
			local showb = true&lt;br /&gt;
			if (show[params.property] == nil) and (show[string.upper(params[1])] == nil ) then&lt;br /&gt;
				showb = showall -- if not specified then depends on showall&lt;br /&gt;
			elseif (show[params.property] == false) or (show[string.upper(params[1])] == false) then -- if either are false then id will be suppressed&lt;br /&gt;
				showb = false&lt;br /&gt;
			end&lt;br /&gt;
			if not showb then&lt;br /&gt;
				tval[params.property] = false -- indicates the identifier is suppressed&lt;br /&gt;
			elseif not addit then&lt;br /&gt;
				local val = parentArgs[mw.ustring.lower(params[1])] or parentArgs[params[1]]&lt;br /&gt;
				if val and val~=&#039;&#039; then -- add local parameter to list if not already in&lt;br /&gt;
					localparams = true&lt;br /&gt;
					local bnew = true&lt;br /&gt;
					for _, w in pairs(tval[params.property]) do&lt;br /&gt;
						if val == w.id then&lt;br /&gt;
							bnew = false&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if bnew then -- add new value to table&lt;br /&gt;
						if qid then&lt;br /&gt;
							qslink = qslink .. &#039;%7C%7C&#039; .. qid .. &#039;%7CP&#039; .. params.property .. &#039;%7C%22&#039; .. mw.uri.encode(val,&amp;quot;PATH&amp;quot;) .. &#039;%22%7CS143%7CQ328&#039;&lt;br /&gt;
						end&lt;br /&gt;
						table.insert(tval[params.property],{id=val,name=&#039;&#039;})&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			local suppress = false&lt;br /&gt;
			if params.suppressedbyproperty then&lt;br /&gt;
				for _,sc in ipairs(params.suppressedbyproperty) do&lt;br /&gt;
					if parameter_is_used(sc) then&lt;br /&gt;
						suppress = true&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if tval[params.property] ~= false and not suppress then&lt;br /&gt;
				local tlinks = {} -- setup table for links&lt;br /&gt;
				local nextIdVal = 1&lt;br /&gt;
				local row = &#039;&#039;&lt;br /&gt;
				for _,val in ipairs(tval[params.property]) do&lt;br /&gt;
					local link = _makelink(params,val,nextIdVal,qid)&lt;br /&gt;
					row = row .. link&lt;br /&gt;
					table.insert(tlinks,link)&lt;br /&gt;
					nextIdVal = nextIdVal + 1&lt;br /&gt;
				end&lt;br /&gt;
				if nextIdVal&amp;gt;=2 then&lt;br /&gt;
					row = row .. &#039;\n&#039;&lt;br /&gt;
					table.insert(sections[addit or params.section],row)&lt;br /&gt;
					rct = true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local function pencil(qid)&lt;br /&gt;
		if not qid then&lt;br /&gt;
			return &#039;&#039;&lt;br /&gt;
		end&lt;br /&gt;
		local args = { pid = &#039;identifiers&#039; } -- #target the list of identifiers&lt;br /&gt;
		args.qid = qid&lt;br /&gt;
		return require(&#039;Module:EditAtWikidata&#039;)._showMessage(args)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	makeSections(qid,false)&lt;br /&gt;
	for c = 1,#qids do&lt;br /&gt;
		makeSections(qids[c],numsections+c)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--configure Navbox&lt;br /&gt;
	local outString = &#039;&#039;&lt;br /&gt;
	if rct or localparams then -- there is at least one link to display&lt;br /&gt;
		local Navbox = require(&#039;Module:Navbox&#039;)&lt;br /&gt;
		local sect,lastsect = 0,0&lt;br /&gt;
		local navboxArgs = {&lt;br /&gt;
			name  = &#039;Authority control&#039;,&lt;br /&gt;
			navboxclass = &#039;authority-control&#039;,&lt;br /&gt;
			bodyclass = &#039;hlist&#039;,&lt;br /&gt;
			state = parentArgs.state or config.i18n.autocollapse,&lt;br /&gt;
			navbar = &#039;off&#039;&lt;br /&gt;
		}&lt;br /&gt;
		for c=1,numsections+#qids do&lt;br /&gt;
			if #sections[c] ~= 0 then -- section is non-empty&lt;br /&gt;
				sect = sect + 1&lt;br /&gt;
				lastsect = c&lt;br /&gt;
				local sectname&lt;br /&gt;
				if c &amp;lt;= numsections then -- regular section&lt;br /&gt;
					sectname = config.sections[c].name&lt;br /&gt;
				else -- section from additional qid&lt;br /&gt;
					local qid = qids[c-numsections]&lt;br /&gt;
					sectname = wikilink(qid) .. pencil(qid)&lt;br /&gt;
				end&lt;br /&gt;
				navboxArgs[&#039;group&#039; .. c] = sectname&lt;br /&gt;
				navboxArgs[&#039;list&#039; .. c] = table.concat(sections[c])&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if localparams then&lt;br /&gt;
			lastsect = lastsect + 1&lt;br /&gt;
			sect = sect + 1&lt;br /&gt;
			navboxArgs[&#039;group&#039; .. lastsect] = config.i18n.warning&lt;br /&gt;
			local warning = frame:expandTemplate{title = config.i18n.errortemplate, args = {config.i18n.localparams}}&lt;br /&gt;
			if qslink ~= &#039;&#039; then&lt;br /&gt;
				warning = warning .. &#039; &#039; .. config.i18n.movetowd .. &#039;&amp;lt;span class=&amp;quot;qs autoconfirmed-show&amp;quot;&amp;gt;&amp;amp;#32;[[File:Commons to Wikidata QuickStatements.svg|20px|link=https://quickstatements.toolforge.org/#/v1=&#039; .. qslink .. &#039;|&#039; .. config.i18n.addtowd .. &#039;]]&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
			elseif not qid then&lt;br /&gt;
				if namespace == 0 then&lt;br /&gt;
					warning = warning .. &#039; &#039; .. config.i18n.connecttowd&lt;br /&gt;
				elseif namespace==14 or namespace==2 or namespace==118 then&lt;br /&gt;
					warning = warning .. &#039; &#039; .. config.i18n.qidcode&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			navboxArgs[&#039;list&#039; .. lastsect] = warning&lt;br /&gt;
		end&lt;br /&gt;
		if topic then -- display in expanded form with topic&lt;br /&gt;
			navboxArgs.title = config.i18n.aclink .. &#039; &amp;amp;ndash; &#039; .. topic .. pencil(qid)&lt;br /&gt;
		elseif sect == 1 then -- special display when only one section&lt;br /&gt;
			if lastsect &amp;lt;= numsections then&lt;br /&gt;
				if config.sections[lastsect].hidelabelwhenalone then -- no special label when only general or other IDs are present&lt;br /&gt;
					navboxArgs[&#039;group&#039; .. lastsect] = config.i18n.aclink .. pencil(qid)&lt;br /&gt;
				else -- other regular section&lt;br /&gt;
					navboxArgs[&#039;group&#039; .. lastsect] = config.i18n.aclink .. &#039;: &#039; .. navboxArgs[&#039;group&#039; .. lastsect] .. pencil(qid)&lt;br /&gt;
				end&lt;br /&gt;
			else -- section from additional qid&lt;br /&gt;
				navboxArgs[&#039;group&#039; .. lastsect] = config.i18n.aclink .. &#039;: &#039; .. navboxArgs[&#039;group&#039; .. lastsect]&lt;br /&gt;
			end&lt;br /&gt;
		else -- add title to navbox&lt;br /&gt;
			navboxArgs.title = config.i18n.aclink .. pencil(qid)&lt;br /&gt;
		end&lt;br /&gt;
		outString = Navbox._navbox(navboxArgs)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if parentArgs.state&lt;br /&gt;
		and parentArgs.state~=&#039;&#039;&lt;br /&gt;
		and parentArgs.state~=config.i18n.collapsed&lt;br /&gt;
		and parentArgs.state~=config.i18n.expanded&lt;br /&gt;
		and parentArgs.state~=config.i18n.autocollapse then --invalid state parameter&lt;br /&gt;
		auxCats = auxCats .. needsAttention(&#039;S&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if testcases then&lt;br /&gt;
		auxCats = mw.ustring.gsub(auxCats, &#039;(%[%[)(&#039; .. config.i18n.category .. &#039;)&#039;, &#039;%1:%2&#039;) --for easier checking&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--out&lt;br /&gt;
	outString = outString..auxCats&lt;br /&gt;
	if namespace ~= 0 then&lt;br /&gt;
		outString = mw.ustring.gsub(outString,&#039;(%[%[)(&#039; .. config.i18n.category .. &#039;:&#039; .. config.i18n.Articles .. &#039;)([^%|%]]+)%|?[^%|%]]*(%]%])&#039;,&#039;%1:%2%3%4&#039;)&lt;br /&gt;
		outString = mw.ustring.gsub(outString,&#039;(%[%[)(&#039; .. config.i18n.category .. &#039;:&#039; .. config.i18n.All_articles .. &#039;)([^%|%]]+)%|?[^%|%]]*(%]%])&#039;,&#039;%1:%2%3%4&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	local check = require(&#039;Module:Check for unknown parameters&#039;)._check&lt;br /&gt;
	local sortkey&lt;br /&gt;
	if namespace == 0 then&lt;br /&gt;
		sortkey = &#039;*&#039; .. title.text&lt;br /&gt;
	else&lt;br /&gt;
		sortkey = title.fullText&lt;br /&gt;
	end&lt;br /&gt;
	outString = outString .. check({&lt;br /&gt;
		[&#039;unknown&#039;] = &#039;[[&#039; .. config.i18n.category .. &#039;:&#039; .. config.i18n.pageswithparams .. &#039;|&#039; .. sortkey .. &#039;]]&#039;,&lt;br /&gt;
		[&#039;preview&#039;] = config.i18n.previewwarning, &#039;show&#039;, &#039;country&#039;, &#039;suppress&#039;, &#039;additional&#039;, &#039;qid&#039;, &#039;state&#039;&lt;br /&gt;
		}, parentArgs)&lt;br /&gt;
	return outString&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.makelink = function(conf,val,nextid,qid)&lt;br /&gt;
	return _makelink(conf,val,nextid,qid)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
	<entry>
		<id>https://atmospedia.org/index.php?title=Module:Yesno&amp;diff=206</id>
		<title>Module:Yesno</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Module:Yesno&amp;diff=206"/>
		<updated>2024-07-03T18:32:42Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Function allowing for consistent treatment of boolean-like wikitext input.&lt;br /&gt;
-- It works similarly to the template {{yesno}}.&lt;br /&gt;
&lt;br /&gt;
return function (val, default)&lt;br /&gt;
	-- If your wiki uses non-ascii characters for any of &amp;quot;yes&amp;quot;, &amp;quot;no&amp;quot;, etc., you&lt;br /&gt;
	-- should replace &amp;quot;val:lower()&amp;quot; with &amp;quot;mw.ustring.lower(val)&amp;quot; in the&lt;br /&gt;
	-- following line.&lt;br /&gt;
	val = type(val) == &#039;string&#039; and val:lower() or val&lt;br /&gt;
	if val == nil then&lt;br /&gt;
		return nil&lt;br /&gt;
	elseif val == true &lt;br /&gt;
		or val == &#039;yes&#039;&lt;br /&gt;
		or val == &#039;y&#039;&lt;br /&gt;
		or val == &#039;true&#039;&lt;br /&gt;
		or val == &#039;t&#039;&lt;br /&gt;
		or val == &#039;on&#039;&lt;br /&gt;
		or tonumber(val) == 1&lt;br /&gt;
	then&lt;br /&gt;
		return true&lt;br /&gt;
	elseif val == false&lt;br /&gt;
		or val == &#039;no&#039;&lt;br /&gt;
		or val == &#039;n&#039;&lt;br /&gt;
		or val == &#039;false&#039;&lt;br /&gt;
		or val == &#039;f&#039;&lt;br /&gt;
		or val == &#039;off&#039;&lt;br /&gt;
		or tonumber(val) == 0&lt;br /&gt;
	then&lt;br /&gt;
		return false&lt;br /&gt;
	else&lt;br /&gt;
		return default&lt;br /&gt;
	end&lt;br /&gt;
end&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
	<entry>
		<id>https://atmospedia.org/index.php?title=Module:Arguments&amp;diff=204</id>
		<title>Module:Arguments</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Module:Arguments&amp;diff=204"/>
		<updated>2024-07-03T18:32:42Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module provides easy processing of arguments passed to Scribunto from&lt;br /&gt;
-- #invoke. It is intended for use by other Lua modules, and should not be&lt;br /&gt;
-- called from #invoke directly.&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&#039;libraryUtil&#039;)&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
&lt;br /&gt;
local arguments = {}&lt;br /&gt;
&lt;br /&gt;
-- Generate four different tidyVal functions, so that we don&#039;t have to check the&lt;br /&gt;
-- options every time we call it.&lt;br /&gt;
&lt;br /&gt;
local function tidyValDefault(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		val = val:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
		if val == &#039;&#039; then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return val&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValTrimOnly(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		return val:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValRemoveBlanksOnly(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		if val:find(&#039;%S&#039;) then&lt;br /&gt;
			return val&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValNoChange(key, val)&lt;br /&gt;
	return val&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function matchesTitle(given, title)&lt;br /&gt;
	local tp = type( given )&lt;br /&gt;
	return (tp == &#039;string&#039; or tp == &#039;number&#039;) and mw.title.new( given ).prefixedText == title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local translate_mt = { __index = function(t, k) return k end }&lt;br /&gt;
&lt;br /&gt;
function arguments.getArgs(frame, options)&lt;br /&gt;
	checkType(&#039;getArgs&#039;, 1, frame, &#039;table&#039;, true)&lt;br /&gt;
	checkType(&#039;getArgs&#039;, 2, options, &#039;table&#039;, true)&lt;br /&gt;
	frame = frame or {}&lt;br /&gt;
	options = options or {}&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Set up argument translation.&lt;br /&gt;
	--]]&lt;br /&gt;
	options.translate = options.translate or {}&lt;br /&gt;
	if getmetatable(options.translate) == nil then&lt;br /&gt;
		setmetatable(options.translate, translate_mt)&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate == nil then&lt;br /&gt;
		options.backtranslate = {}&lt;br /&gt;
		for k,v in pairs(options.translate) do&lt;br /&gt;
			options.backtranslate[v] = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate and getmetatable(options.backtranslate) == nil then&lt;br /&gt;
		setmetatable(options.backtranslate, {&lt;br /&gt;
			__index = function(t, k)&lt;br /&gt;
				if options.translate[k] ~= k then&lt;br /&gt;
					return nil&lt;br /&gt;
				else&lt;br /&gt;
					return k&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Get the argument tables. If we were passed a valid frame object, get the&lt;br /&gt;
	-- frame arguments (fargs) and the parent frame arguments (pargs), depending&lt;br /&gt;
	-- on the options set and on the parent frame&#039;s availability. If we weren&#039;t&lt;br /&gt;
	-- passed a valid frame object, we are being called from another Lua module&lt;br /&gt;
	-- or from the debug console, so assume that we were passed a table of args&lt;br /&gt;
	-- directly, and assign it to a new variable (luaArgs).&lt;br /&gt;
	--]]&lt;br /&gt;
	local fargs, pargs, luaArgs&lt;br /&gt;
	if type(frame.args) == &#039;table&#039; and type(frame.getParent) == &#039;function&#039; then&lt;br /&gt;
		if options.wrappers then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- The wrappers option makes Module:Arguments look up arguments in&lt;br /&gt;
			-- either the frame argument table or the parent argument table, but&lt;br /&gt;
			-- not both. This means that users can use either the #invoke syntax&lt;br /&gt;
			-- or a wrapper template without the loss of performance associated&lt;br /&gt;
			-- with looking arguments up in both the frame and the parent frame.&lt;br /&gt;
			-- Module:Arguments will look up arguments in the parent frame&lt;br /&gt;
			-- if it finds the parent frame&#039;s title in options.wrapper;&lt;br /&gt;
			-- otherwise it will look up arguments in the frame object passed&lt;br /&gt;
			-- to getArgs.&lt;br /&gt;
			--]]&lt;br /&gt;
			local parent = frame:getParent()&lt;br /&gt;
			if not parent then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			else&lt;br /&gt;
				local title = parent:getTitle():gsub(&#039;/sandbox$&#039;, &#039;&#039;)&lt;br /&gt;
				local found = false&lt;br /&gt;
				if matchesTitle(options.wrappers, title) then&lt;br /&gt;
					found = true&lt;br /&gt;
				elseif type(options.wrappers) == &#039;table&#039; then&lt;br /&gt;
					for _,v in pairs(options.wrappers) do&lt;br /&gt;
						if matchesTitle(v, title) then&lt;br /&gt;
							found = true&lt;br /&gt;
							break&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				-- We test for false specifically here so that nil (the default) acts like true.&lt;br /&gt;
				if found or options.frameOnly == false then&lt;br /&gt;
					pargs = parent.args&lt;br /&gt;
				end&lt;br /&gt;
				if not found or options.parentOnly == false then&lt;br /&gt;
					fargs = frame.args&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- options.wrapper isn&#039;t set, so check the other options.&lt;br /&gt;
			if not options.parentOnly then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			end&lt;br /&gt;
			if not options.frameOnly then&lt;br /&gt;
				local parent = frame:getParent()&lt;br /&gt;
				pargs = parent and parent.args or nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if options.parentFirst then&lt;br /&gt;
			fargs, pargs = pargs, fargs&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		luaArgs = frame&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the order of precedence of the argument tables. If the variables are&lt;br /&gt;
	-- nil, nothing will be added to the table, which is how we avoid clashes&lt;br /&gt;
	-- between the frame/parent args and the Lua args.&lt;br /&gt;
	local argTables = {fargs}&lt;br /&gt;
	argTables[#argTables + 1] = pargs&lt;br /&gt;
	argTables[#argTables + 1] = luaArgs&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generate the tidyVal function. If it has been specified by the user, we&lt;br /&gt;
	-- use that; if not, we choose one of four functions depending on the&lt;br /&gt;
	-- options chosen. This is so that we don&#039;t have to call the options table&lt;br /&gt;
	-- every time the function is called.&lt;br /&gt;
	--]]&lt;br /&gt;
	local tidyVal = options.valueFunc&lt;br /&gt;
	if tidyVal then&lt;br /&gt;
		if type(tidyVal) ~= &#039;function&#039; then&lt;br /&gt;
			error(&lt;br /&gt;
				&amp;quot;bad value assigned to option &#039;valueFunc&#039;&amp;quot;&lt;br /&gt;
					.. &#039;(function expected, got &#039;&lt;br /&gt;
					.. type(tidyVal)&lt;br /&gt;
					.. &#039;)&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
	elseif options.trim ~= false then&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValDefault&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValTrimOnly&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValRemoveBlanksOnly&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValNoChange&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Set up the args, metaArgs and nilArgs tables. args will be the one&lt;br /&gt;
	-- accessed from functions, and metaArgs will hold the actual arguments. Nil&lt;br /&gt;
	-- arguments are memoized in nilArgs, and the metatable connects all of them&lt;br /&gt;
	-- together.&lt;br /&gt;
	--]]&lt;br /&gt;
	local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}&lt;br /&gt;
	setmetatable(args, metatable)&lt;br /&gt;
&lt;br /&gt;
	local function mergeArgs(tables)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Accepts multiple tables as input and merges their keys and values&lt;br /&gt;
		-- into one table. If a value is already present it is not overwritten;&lt;br /&gt;
		-- tables listed earlier have precedence. We are also memoizing nil&lt;br /&gt;
		-- values, which can be overwritten if they are &#039;s&#039; (soft).&lt;br /&gt;
		--]]&lt;br /&gt;
		for _, t in ipairs(tables) do&lt;br /&gt;
			for key, val in pairs(t) do&lt;br /&gt;
				if metaArgs[key] == nil and nilArgs[key] ~= &#039;h&#039; then&lt;br /&gt;
					local tidiedVal = tidyVal(key, val)&lt;br /&gt;
					if tidiedVal == nil then&lt;br /&gt;
						nilArgs[key] = &#039;s&#039;&lt;br /&gt;
					else&lt;br /&gt;
						metaArgs[key] = tidiedVal&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Define metatable behaviour. Arguments are memoized in the metaArgs table,&lt;br /&gt;
	-- and are only fetched from the argument tables once. Fetching arguments&lt;br /&gt;
	-- from the argument tables is the most resource-intensive step in this&lt;br /&gt;
	-- module, so we try and avoid it where possible. For this reason, nil&lt;br /&gt;
	-- arguments are also memoized, in the nilArgs table. Also, we keep a record&lt;br /&gt;
	-- in the metatable of when pairs and ipairs have been called, so we do not&lt;br /&gt;
	-- run pairs and ipairs on the argument tables more than once. We also do&lt;br /&gt;
	-- not run ipairs on fargs and pargs if pairs has already been run, as all&lt;br /&gt;
	-- the arguments will already have been copied over.&lt;br /&gt;
	--]]&lt;br /&gt;
&lt;br /&gt;
	metatable.__index = function (t, key)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Fetches an argument when the args table is indexed. First we check&lt;br /&gt;
		-- to see if the value is memoized, and if not we try and fetch it from&lt;br /&gt;
		-- the argument tables. When we check memoization, we need to check&lt;br /&gt;
		-- metaArgs before nilArgs, as both can be non-nil at the same time.&lt;br /&gt;
		-- If the argument is not present in metaArgs, we also check whether&lt;br /&gt;
		-- pairs has been run yet. If pairs has already been run, we return nil.&lt;br /&gt;
		-- This is because all the arguments will have already been copied into&lt;br /&gt;
		-- metaArgs by the mergeArgs function, meaning that any other arguments&lt;br /&gt;
		-- must be nil.&lt;br /&gt;
		--]]&lt;br /&gt;
		if type(key) == &#039;string&#039; then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		local val = metaArgs[key]&lt;br /&gt;
		if val ~= nil then&lt;br /&gt;
			return val&lt;br /&gt;
		elseif metatable.donePairs or nilArgs[key] then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		for _, argTable in ipairs(argTables) do&lt;br /&gt;
			local argTableVal = tidyVal(key, argTable[key])&lt;br /&gt;
			if argTableVal ~= nil then&lt;br /&gt;
				metaArgs[key] = argTableVal&lt;br /&gt;
				return argTableVal&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		nilArgs[key] = &#039;h&#039;&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__newindex = function (t, key, val)&lt;br /&gt;
		-- This function is called when a module tries to add a new value to the&lt;br /&gt;
		-- args table, or tries to change an existing value.&lt;br /&gt;
		if type(key) == &#039;string&#039; then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		if options.readOnly then&lt;br /&gt;
			error(&lt;br /&gt;
				&#039;could not write to argument table key &amp;quot;&#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &#039;&amp;quot;; the table is read-only&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif options.noOverwrite and args[key] ~= nil then&lt;br /&gt;
			error(&lt;br /&gt;
				&#039;could not write to argument table key &amp;quot;&#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &#039;&amp;quot;; overwriting existing arguments is not permitted&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif val == nil then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- If the argument is to be overwritten with nil, we need to erase&lt;br /&gt;
			-- the value in metaArgs, so that __index, __pairs and __ipairs do&lt;br /&gt;
			-- not use a previous existing value, if present; and we also need&lt;br /&gt;
			-- to memoize the nil in nilArgs, so that the value isn&#039;t looked&lt;br /&gt;
			-- up in the argument tables if it is accessed again.&lt;br /&gt;
			--]]&lt;br /&gt;
			metaArgs[key] = nil&lt;br /&gt;
			nilArgs[key] = &#039;h&#039;&lt;br /&gt;
		else&lt;br /&gt;
			metaArgs[key] = val&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function translatenext(invariant)&lt;br /&gt;
		local k, v = next(invariant.t, invariant.k)&lt;br /&gt;
		invariant.k = k&lt;br /&gt;
		if k == nil then&lt;br /&gt;
			return nil&lt;br /&gt;
		elseif type(k) ~= &#039;string&#039; or not options.backtranslate then&lt;br /&gt;
			return k, v&lt;br /&gt;
		else&lt;br /&gt;
			local backtranslate = options.backtranslate[k]&lt;br /&gt;
			if backtranslate == nil then&lt;br /&gt;
				-- Skip this one. This is a tail call, so this won&#039;t cause stack overflow&lt;br /&gt;
				return translatenext(invariant)&lt;br /&gt;
			else&lt;br /&gt;
				return backtranslate, v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__pairs = function ()&lt;br /&gt;
		-- Called when pairs is run on the args table.&lt;br /&gt;
		if not metatable.donePairs then&lt;br /&gt;
			mergeArgs(argTables)&lt;br /&gt;
			metatable.donePairs = true&lt;br /&gt;
		end&lt;br /&gt;
		return translatenext, { t = metaArgs }&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function inext(t, i)&lt;br /&gt;
		-- This uses our __index metamethod&lt;br /&gt;
		local v = t[i + 1]&lt;br /&gt;
		if v ~= nil then&lt;br /&gt;
			return i + 1, v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__ipairs = function (t)&lt;br /&gt;
		-- Called when ipairs is run on the args table.&lt;br /&gt;
		return inext, t, 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return arguments&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
	<entry>
		<id>https://atmospedia.org/index.php?title=Module:Navbox&amp;diff=202</id>
		<title>Module:Navbox</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Module:Navbox&amp;diff=202"/>
		<updated>2024-07-03T18:32:42Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;require(&#039;strict&#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
local navbar = require(&#039;Module:Navbar&#039;)._navbar&lt;br /&gt;
local cfg = mw.loadData(&#039;Module:Navbox/configuration&#039;)&lt;br /&gt;
local getArgs -- lazily initialized&lt;br /&gt;
local args&lt;br /&gt;
local format = string.format&lt;br /&gt;
&lt;br /&gt;
local function striped(wikitext, border)&lt;br /&gt;
	-- Return wikitext with markers replaced for odd/even striping.&lt;br /&gt;
	-- Child (subgroup) navboxes are flagged with a category that is removed&lt;br /&gt;
	-- by parent navboxes. The result is that the category shows all pages&lt;br /&gt;
	-- where a child navbox is not contained in a parent navbox.&lt;br /&gt;
	local orphanCat = cfg.category.orphan&lt;br /&gt;
	if border == cfg.keyword.border_subgroup and args[cfg.arg.orphan] ~= cfg.keyword.orphan_yes then&lt;br /&gt;
		-- No change; striping occurs in outermost navbox.&lt;br /&gt;
		return wikitext .. orphanCat&lt;br /&gt;
	end&lt;br /&gt;
	local first, second = cfg.class.navbox_odd_part, cfg.class.navbox_even_part&lt;br /&gt;
	if args[cfg.arg.evenodd] then&lt;br /&gt;
		if args[cfg.arg.evenodd] == cfg.keyword.evenodd_swap then&lt;br /&gt;
			first, second = second, first&lt;br /&gt;
		else&lt;br /&gt;
			first = args[cfg.arg.evenodd]&lt;br /&gt;
			second = first&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local changer&lt;br /&gt;
	if first == second then&lt;br /&gt;
		changer = first&lt;br /&gt;
	else&lt;br /&gt;
		local index = 0&lt;br /&gt;
		changer = function (code)&lt;br /&gt;
			if code == &#039;0&#039; then&lt;br /&gt;
				-- Current occurrence is for a group before a nested table.&lt;br /&gt;
				-- Set it to first as a valid although pointless class.&lt;br /&gt;
				-- The next occurrence will be the first row after a title&lt;br /&gt;
				-- in a subgroup and will also be first.&lt;br /&gt;
				index = 0&lt;br /&gt;
				return first&lt;br /&gt;
			end&lt;br /&gt;
			index = index + 1&lt;br /&gt;
			return index % 2 == 1 and first or second&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local regex = orphanCat:gsub(&#039;([%[%]])&#039;, &#039;%%%1&#039;)&lt;br /&gt;
	return (wikitext:gsub(regex, &#039;&#039;):gsub(cfg.marker.regex, changer)) -- () omits gsub count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function processItem(item, nowrapitems)&lt;br /&gt;
	if item:sub(1, 2) == &#039;{|&#039; then&lt;br /&gt;
		-- Applying nowrap to lines in a table does not make sense.&lt;br /&gt;
		-- Add newlines to compensate for trim of x in |parm=x in a template.&lt;br /&gt;
		return &#039;\n&#039; .. item ..&#039;\n&#039;&lt;br /&gt;
	end&lt;br /&gt;
	if nowrapitems == cfg.keyword.nowrapitems_yes then&lt;br /&gt;
		local lines = {}&lt;br /&gt;
		for line in (item .. &#039;\n&#039;):gmatch(&#039;([^\n]*)\n&#039;) do&lt;br /&gt;
			local prefix, content = line:match(&#039;^([*:;#]+)%s*(.*)&#039;)&lt;br /&gt;
			if prefix and not content:match(cfg.pattern.nowrap) then&lt;br /&gt;
				line = format(cfg.nowrap_item, prefix, content)&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(lines, line)&lt;br /&gt;
		end&lt;br /&gt;
		item = table.concat(lines, &#039;\n&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if item:match(&#039;^[*:;#]&#039;) then&lt;br /&gt;
		return &#039;\n&#039; .. item ..&#039;\n&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return item&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function has_navbar()&lt;br /&gt;
	return args[cfg.arg.navbar] ~= cfg.keyword.navbar_off&lt;br /&gt;
		and args[cfg.arg.navbar] ~= cfg.keyword.navbar_plain&lt;br /&gt;
		and (&lt;br /&gt;
			args[cfg.arg.name]&lt;br /&gt;
			or mw.getCurrentFrame():getParent():getTitle():gsub(cfg.pattern.sandbox, &#039;&#039;)&lt;br /&gt;
				~= cfg.pattern.navbox&lt;br /&gt;
		)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- extract text color from css, which is the only permitted inline CSS for the navbar&lt;br /&gt;
local function extract_color(css_str)&lt;br /&gt;
	-- return nil because navbar takes its argument into mw.html which handles&lt;br /&gt;
	-- nil gracefully, removing the associated style attribute&lt;br /&gt;
	return mw.ustring.match(&#039;;&#039; .. css_str .. &#039;;&#039;, &#039;.*;%s*([Cc][Oo][Ll][Oo][Rr]%s*:%s*.-)%s*;&#039;) or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderNavBar(titleCell)&lt;br /&gt;
	if has_navbar() then&lt;br /&gt;
		titleCell:wikitext(navbar{&lt;br /&gt;
			[cfg.navbar.name] = args[cfg.arg.name],&lt;br /&gt;
			[cfg.navbar.mini] = 1,&lt;br /&gt;
			[cfg.navbar.fontstyle] = extract_color(&lt;br /&gt;
				(args[cfg.arg.basestyle] or &#039;&#039;) .. &#039;;&#039; .. (args[cfg.arg.titlestyle] or &#039;&#039;)&lt;br /&gt;
			)&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTitleRow(tbl)&lt;br /&gt;
	if not args[cfg.arg.title] then return end&lt;br /&gt;
&lt;br /&gt;
	local titleRow = tbl:tag(&#039;tr&#039;)&lt;br /&gt;
&lt;br /&gt;
	local titleCell = titleRow:tag(&#039;th&#039;):attr(&#039;scope&#039;, &#039;col&#039;)&lt;br /&gt;
&lt;br /&gt;
	local titleColspan = 2&lt;br /&gt;
	if args[cfg.arg.imageleft] then titleColspan = titleColspan + 1 end&lt;br /&gt;
	if args[cfg.arg.image] then titleColspan = titleColspan + 1 end&lt;br /&gt;
&lt;br /&gt;
	titleCell&lt;br /&gt;
		:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
		:cssText(args[cfg.arg.titlestyle])&lt;br /&gt;
		:addClass(cfg.class.navbox_title)&lt;br /&gt;
		:attr(&#039;colspan&#039;, titleColspan)&lt;br /&gt;
&lt;br /&gt;
	renderNavBar(titleCell)&lt;br /&gt;
&lt;br /&gt;
	titleCell&lt;br /&gt;
		:tag(&#039;div&#039;)&lt;br /&gt;
			-- id for aria-labelledby attribute&lt;br /&gt;
			:attr(&#039;id&#039;, mw.uri.anchorEncode(args[cfg.arg.title]))&lt;br /&gt;
			:addClass(args[cfg.arg.titleclass])&lt;br /&gt;
			:css(&#039;font-size&#039;, &#039;114%&#039;)&lt;br /&gt;
			:css(&#039;margin&#039;, &#039;0 4em&#039;)&lt;br /&gt;
			:wikitext(processItem(args[cfg.arg.title]))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getAboveBelowColspan()&lt;br /&gt;
	local ret = 2&lt;br /&gt;
	if args[cfg.arg.imageleft] then ret = ret + 1 end&lt;br /&gt;
	if args[cfg.arg.image] then ret = ret + 1 end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderAboveRow(tbl)&lt;br /&gt;
	if not args[cfg.arg.above] then return end&lt;br /&gt;
&lt;br /&gt;
	tbl:tag(&#039;tr&#039;)&lt;br /&gt;
		:tag(&#039;td&#039;)&lt;br /&gt;
			:addClass(cfg.class.navbox_abovebelow)&lt;br /&gt;
			:addClass(args[cfg.arg.aboveclass])&lt;br /&gt;
			:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
			:cssText(args[cfg.arg.abovestyle])&lt;br /&gt;
			:attr(&#039;colspan&#039;, getAboveBelowColspan())&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
				-- id for aria-labelledby attribute, if no title&lt;br /&gt;
				:attr(&#039;id&#039;, (not args[cfg.arg.title]) and mw.uri.anchorEncode(args[cfg.arg.above]) or nil)&lt;br /&gt;
				:wikitext(processItem(args[cfg.arg.above], args[cfg.arg.nowrapitems]))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBelowRow(tbl)&lt;br /&gt;
	if not args[cfg.arg.below] then return end&lt;br /&gt;
&lt;br /&gt;
	tbl:tag(&#039;tr&#039;)&lt;br /&gt;
		:tag(&#039;td&#039;)&lt;br /&gt;
			:addClass(cfg.class.navbox_abovebelow)&lt;br /&gt;
			:addClass(args[cfg.arg.belowclass])&lt;br /&gt;
			:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
			:cssText(args[cfg.arg.belowstyle])&lt;br /&gt;
			:attr(&#039;colspan&#039;, getAboveBelowColspan())&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
				:wikitext(processItem(args[cfg.arg.below], args[cfg.arg.nowrapitems]))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderListRow(tbl, index, listnum, listnums_size)&lt;br /&gt;
	local row = tbl:tag(&#039;tr&#039;)&lt;br /&gt;
&lt;br /&gt;
	if index == 1 and args[cfg.arg.imageleft] then&lt;br /&gt;
		row&lt;br /&gt;
			:tag(&#039;td&#039;)&lt;br /&gt;
				:addClass(cfg.class.noviewer)&lt;br /&gt;
				:addClass(cfg.class.navbox_image)&lt;br /&gt;
				:addClass(args[cfg.arg.imageclass])&lt;br /&gt;
				:css(&#039;width&#039;, &#039;1px&#039;)               -- Minimize width&lt;br /&gt;
				:css(&#039;padding&#039;, &#039;0 2px 0 0&#039;)&lt;br /&gt;
				:cssText(args[cfg.arg.imageleftstyle])&lt;br /&gt;
				:attr(&#039;rowspan&#039;, listnums_size)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:wikitext(processItem(args[cfg.arg.imageleft]))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local group_and_num = format(cfg.arg.group_and_num, listnum)&lt;br /&gt;
	local groupstyle_and_num = format(cfg.arg.groupstyle_and_num, listnum)&lt;br /&gt;
	if args[group_and_num] then&lt;br /&gt;
		local groupCell = row:tag(&#039;th&#039;)&lt;br /&gt;
&lt;br /&gt;
		-- id for aria-labelledby attribute, if lone group with no title or above&lt;br /&gt;
		if listnum == 1 and not (args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group2]) then&lt;br /&gt;
			groupCell&lt;br /&gt;
				:attr(&#039;id&#039;, mw.uri.anchorEncode(args[cfg.arg.group1]))&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		groupCell&lt;br /&gt;
			:attr(&#039;scope&#039;, &#039;row&#039;)&lt;br /&gt;
			:addClass(cfg.class.navbox_group)&lt;br /&gt;
			:addClass(args[cfg.arg.groupclass])&lt;br /&gt;
			:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
			-- If groupwidth not specified, minimize width&lt;br /&gt;
			:css(&#039;width&#039;, args[cfg.arg.groupwidth] or &#039;1%&#039;)&lt;br /&gt;
&lt;br /&gt;
		groupCell&lt;br /&gt;
			:cssText(args[cfg.arg.groupstyle])&lt;br /&gt;
			:cssText(args[groupstyle_and_num])&lt;br /&gt;
			:wikitext(args[group_and_num])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local listCell = row:tag(&#039;td&#039;)&lt;br /&gt;
&lt;br /&gt;
	if args[group_and_num] then&lt;br /&gt;
		listCell&lt;br /&gt;
			:addClass(cfg.class.navbox_list_with_group)&lt;br /&gt;
	else&lt;br /&gt;
		listCell:attr(&#039;colspan&#039;, 2)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not args[cfg.arg.groupwidth] then&lt;br /&gt;
		listCell:css(&#039;width&#039;, &#039;100%&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local rowstyle  -- usually nil so cssText(rowstyle) usually adds nothing&lt;br /&gt;
	if index % 2 == 1 then&lt;br /&gt;
		rowstyle = args[cfg.arg.oddstyle]&lt;br /&gt;
	else&lt;br /&gt;
		rowstyle = args[cfg.arg.evenstyle]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local list_and_num = format(cfg.arg.list_and_num, listnum)&lt;br /&gt;
	local listText = args[list_and_num]&lt;br /&gt;
	local oddEven = cfg.marker.oddeven&lt;br /&gt;
	if listText:sub(1, 12) == &#039;&amp;lt;/div&amp;gt;&amp;lt;table&#039; then&lt;br /&gt;
		-- Assume list text is for a subgroup navbox so no automatic striping for this row.&lt;br /&gt;
		oddEven = listText:find(cfg.pattern.navbox_title) and cfg.marker.restart or cfg.class.navbox_odd_part&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local liststyle_and_num = format(cfg.arg.liststyle_and_num, listnum)&lt;br /&gt;
	local listclass_and_num = format(cfg.arg.listclass_and_num, listnum)&lt;br /&gt;
	listCell&lt;br /&gt;
		:css(&#039;padding&#039;, &#039;0&#039;)&lt;br /&gt;
		:cssText(args[cfg.arg.liststyle])&lt;br /&gt;
		:cssText(rowstyle)&lt;br /&gt;
		:cssText(args[liststyle_and_num])&lt;br /&gt;
		:addClass(cfg.class.navbox_list)&lt;br /&gt;
		:addClass(cfg.class.navbox_part .. oddEven)&lt;br /&gt;
		:addClass(args[cfg.arg.listclass])&lt;br /&gt;
		:addClass(args[listclass_and_num])&lt;br /&gt;
		:tag(&#039;div&#039;)&lt;br /&gt;
			:css(&#039;padding&#039;,&lt;br /&gt;
				(index == 1 and args[cfg.arg.list1padding]) or args[cfg.arg.listpadding] or &#039;0 0.25em&#039;&lt;br /&gt;
			)&lt;br /&gt;
			:wikitext(processItem(listText, args[cfg.arg.nowrapitems]))&lt;br /&gt;
&lt;br /&gt;
	if index == 1 and args[cfg.arg.image] then&lt;br /&gt;
		row&lt;br /&gt;
			:tag(&#039;td&#039;)&lt;br /&gt;
				:addClass(cfg.class.noviewer)&lt;br /&gt;
				:addClass(cfg.class.navbox_image)&lt;br /&gt;
				:addClass(args[cfg.arg.imageclass])&lt;br /&gt;
				:css(&#039;width&#039;, &#039;1px&#039;)               -- Minimize width&lt;br /&gt;
				:css(&#039;padding&#039;, &#039;0 0 0 2px&#039;)&lt;br /&gt;
				:cssText(args[cfg.arg.imagestyle])&lt;br /&gt;
				:attr(&#039;rowspan&#039;, listnums_size)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:wikitext(processItem(args[cfg.arg.image]))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function has_list_class(htmlclass)&lt;br /&gt;
	local patterns = {&lt;br /&gt;
		&#039;^&#039; .. htmlclass .. &#039;$&#039;,&lt;br /&gt;
		&#039;%s&#039; .. htmlclass .. &#039;$&#039;,&lt;br /&gt;
		&#039;^&#039; .. htmlclass .. &#039;%s&#039;,&lt;br /&gt;
		&#039;%s&#039; .. htmlclass .. &#039;%s&#039;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for arg, _ in pairs(args) do&lt;br /&gt;
		if type(arg) == &#039;string&#039; and mw.ustring.find(arg, cfg.pattern.class) then&lt;br /&gt;
			for _, pattern in ipairs(patterns) do&lt;br /&gt;
				if mw.ustring.find(args[arg] or &#039;&#039;, pattern) then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- there are a lot of list classes in the wild, so we add their TemplateStyles&lt;br /&gt;
local function add_list_styles()&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	local function add_list_templatestyles(htmlclass, templatestyles)&lt;br /&gt;
		if has_list_class(htmlclass) then&lt;br /&gt;
			return frame:extensionTag{&lt;br /&gt;
				name = &#039;templatestyles&#039;, args = { src = templatestyles }&lt;br /&gt;
			}&lt;br /&gt;
		else&lt;br /&gt;
			return &#039;&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local hlist_styles = add_list_templatestyles(&#039;hlist&#039;, cfg.hlist_templatestyles)&lt;br /&gt;
	local plainlist_styles = add_list_templatestyles(&#039;plainlist&#039;, cfg.plainlist_templatestyles)&lt;br /&gt;
	&lt;br /&gt;
	-- a second workaround for [[phab:T303378]]&lt;br /&gt;
	-- when that issue is fixed, we can actually use has_navbar not to emit the&lt;br /&gt;
	-- tag here if we want&lt;br /&gt;
	if has_navbar() and hlist_styles == &#039;&#039; then&lt;br /&gt;
		hlist_styles = frame:extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;, args = { src = cfg.hlist_templatestyles }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- hlist -&amp;gt; plainlist is best-effort to preserve old Common.css ordering.&lt;br /&gt;
	-- this ordering is not a guarantee because most navboxes will emit only&lt;br /&gt;
	-- one of these classes [hlist_note]&lt;br /&gt;
	return hlist_styles .. plainlist_styles&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function needsHorizontalLists(border)&lt;br /&gt;
	if border == cfg.keyword.border_subgroup or args[cfg.arg.tracking] == cfg.keyword.tracking_no then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return not has_list_class(cfg.pattern.hlist) and not has_list_class(cfg.pattern.plainlist)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hasBackgroundColors()&lt;br /&gt;
	for _, key in ipairs({cfg.arg.titlestyle, cfg.arg.groupstyle,&lt;br /&gt;
		cfg.arg.basestyle, cfg.arg.abovestyle, cfg.arg.belowstyle}) do&lt;br /&gt;
		if tostring(args[key]):find(&#039;background&#039;, 1, true) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hasBorders()&lt;br /&gt;
	for _, key in ipairs({cfg.arg.groupstyle, cfg.arg.basestyle,&lt;br /&gt;
		cfg.arg.abovestyle, cfg.arg.belowstyle}) do&lt;br /&gt;
		if tostring(args[key]):find(&#039;border&#039;, 1, true) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isIllegible()&lt;br /&gt;
	local styleratio = require(&#039;Module:Color contrast&#039;)._styleratio&lt;br /&gt;
	for key, style in pairs(args) do&lt;br /&gt;
		if tostring(key):match(cfg.pattern.style) then&lt;br /&gt;
			if styleratio{mw.text.unstripNoWiki(style)} &amp;lt; 4.5 then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getTrackingCategories(border)&lt;br /&gt;
	local cats = {}&lt;br /&gt;
	if needsHorizontalLists(border) then table.insert(cats, cfg.category.horizontal_lists) end&lt;br /&gt;
	if hasBackgroundColors() then table.insert(cats, cfg.category.background_colors) end&lt;br /&gt;
	if isIllegible() then table.insert(cats, cfg.category.illegible) end&lt;br /&gt;
	if hasBorders() then table.insert(cats, cfg.category.borders) end&lt;br /&gt;
	return cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTrackingCategories(builder, border)&lt;br /&gt;
	local title = mw.title.getCurrentTitle()&lt;br /&gt;
	if title.namespace ~= 10 then return end -- not in template space&lt;br /&gt;
	local subpage = title.subpageText&lt;br /&gt;
	if subpage == cfg.keyword.subpage_doc or subpage == cfg.keyword.subpage_sandbox&lt;br /&gt;
		or subpage == cfg.keyword.subpage_testcases then return end&lt;br /&gt;
&lt;br /&gt;
	for _, cat in ipairs(getTrackingCategories(border)) do&lt;br /&gt;
		builder:wikitext(&#039;[[Category:&#039; .. cat .. &#039;]]&#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMainTable(border, listnums)&lt;br /&gt;
	local tbl = mw.html.create(&#039;table&#039;)&lt;br /&gt;
		:addClass(cfg.class.nowraplinks)&lt;br /&gt;
		:addClass(args[cfg.arg.bodyclass])&lt;br /&gt;
&lt;br /&gt;
	local state = args[cfg.arg.state]&lt;br /&gt;
	if args[cfg.arg.title] and state ~= cfg.keyword.state_plain and state ~= cfg.keyword.state_off then&lt;br /&gt;
		if state == cfg.keyword.state_collapsed then&lt;br /&gt;
			state = cfg.class.collapsed&lt;br /&gt;
		end&lt;br /&gt;
		tbl&lt;br /&gt;
			:addClass(cfg.class.collapsible)&lt;br /&gt;
			:addClass(state or cfg.class.autocollapse)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl:css(&#039;border-spacing&#039;, 0)&lt;br /&gt;
	if border == cfg.keyword.border_subgroup or border == cfg.keyword.border_none then&lt;br /&gt;
		tbl&lt;br /&gt;
			:addClass(cfg.class.navbox_subgroup)&lt;br /&gt;
			:cssText(args[cfg.arg.bodystyle])&lt;br /&gt;
			:cssText(args[cfg.arg.style])&lt;br /&gt;
	else  -- regular navbox - bodystyle and style will be applied to the wrapper table&lt;br /&gt;
		tbl&lt;br /&gt;
			:addClass(cfg.class.navbox_inner)&lt;br /&gt;
			:css(&#039;background&#039;, &#039;transparent&#039;)&lt;br /&gt;
			:css(&#039;color&#039;, &#039;inherit&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	tbl:cssText(args[cfg.arg.innerstyle])&lt;br /&gt;
&lt;br /&gt;
	renderTitleRow(tbl)&lt;br /&gt;
	renderAboveRow(tbl)&lt;br /&gt;
	local listnums_size = #listnums&lt;br /&gt;
	for i, listnum in ipairs(listnums) do&lt;br /&gt;
		renderListRow(tbl, i, listnum, listnums_size)&lt;br /&gt;
	end&lt;br /&gt;
	renderBelowRow(tbl)&lt;br /&gt;
&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function add_navbox_styles(hiding_templatestyles)&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- This is a lambda so that it doesn&#039;t need the frame as a parameter&lt;br /&gt;
	local function add_user_styles(templatestyles)&lt;br /&gt;
		if templatestyles and templatestyles ~= &#039;&#039; then&lt;br /&gt;
			return frame:extensionTag{&lt;br /&gt;
				name = &#039;templatestyles&#039;, args = { src = templatestyles }&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- get templatestyles. load base from config so that Lua only needs to do&lt;br /&gt;
	-- the work once of parser tag expansion&lt;br /&gt;
	local base_templatestyles = cfg.templatestyles&lt;br /&gt;
	local templatestyles = add_user_styles(args[cfg.arg.templatestyles])&lt;br /&gt;
	local child_templatestyles = add_user_styles(args[cfg.arg.child_templatestyles])&lt;br /&gt;
&lt;br /&gt;
	-- The &#039;navbox-styles&#039; div exists to wrap the styles to work around T200206&lt;br /&gt;
	-- more elegantly. Instead of combinatorial rules, this ends up being linear&lt;br /&gt;
	-- number of CSS rules.&lt;br /&gt;
	return mw.html.create(&#039;div&#039;)&lt;br /&gt;
		:addClass(cfg.class.navbox_styles)&lt;br /&gt;
		:wikitext(&lt;br /&gt;
			add_list_styles() .. -- see [hlist_note] applied to &#039;before base_templatestyles&#039;&lt;br /&gt;
			base_templatestyles ..&lt;br /&gt;
			templatestyles ..&lt;br /&gt;
			child_templatestyles ..&lt;br /&gt;
			table.concat(hiding_templatestyles)&lt;br /&gt;
		)&lt;br /&gt;
		:done()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- work around [[phab:T303378]]&lt;br /&gt;
-- for each arg: find all the templatestyles strip markers, insert them into a&lt;br /&gt;
-- table. then remove all templatestyles markers from the arg&lt;br /&gt;
local function move_hiding_templatestyles(args)&lt;br /&gt;
	local gfind = string.gfind&lt;br /&gt;
	local gsub = string.gsub&lt;br /&gt;
	local templatestyles_markers = {}&lt;br /&gt;
	local strip_marker_pattern = &#039;(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)&#039;&lt;br /&gt;
	for k, arg in pairs(args) do&lt;br /&gt;
		for marker in gfind(arg, strip_marker_pattern) do&lt;br /&gt;
			table.insert(templatestyles_markers, marker)&lt;br /&gt;
		end&lt;br /&gt;
		args[k] = gsub(arg, strip_marker_pattern, &#039;&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	return templatestyles_markers&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._navbox(navboxArgs)&lt;br /&gt;
	args = navboxArgs&lt;br /&gt;
	local hiding_templatestyles = move_hiding_templatestyles(args)&lt;br /&gt;
	local listnums = {}&lt;br /&gt;
&lt;br /&gt;
	for k, _ in pairs(args) do&lt;br /&gt;
		if type(k) == &#039;string&#039; then&lt;br /&gt;
			local listnum = k:match(cfg.pattern.listnum)&lt;br /&gt;
			if listnum then table.insert(listnums, tonumber(listnum)) end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(listnums)&lt;br /&gt;
&lt;br /&gt;
	local border = mw.text.trim(args[cfg.arg.border] or args[1] or &#039;&#039;)&lt;br /&gt;
	if border == cfg.keyword.border_child then&lt;br /&gt;
		border = cfg.keyword.border_subgroup&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- render the main body of the navbox&lt;br /&gt;
	local tbl = renderMainTable(border, listnums)&lt;br /&gt;
&lt;br /&gt;
	local res = mw.html.create()&lt;br /&gt;
	-- render the appropriate wrapper for the navbox, based on the border param&lt;br /&gt;
&lt;br /&gt;
	if border == cfg.keyword.border_none then&lt;br /&gt;
		res:node(add_navbox_styles(hiding_templatestyles))&lt;br /&gt;
		local nav = res:tag(&#039;div&#039;)&lt;br /&gt;
			:attr(&#039;role&#039;, &#039;navigation&#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
		-- aria-labelledby title, otherwise above, otherwise lone group&lt;br /&gt;
		if args[cfg.arg.title] or args[cfg.arg.above] or (args[cfg.arg.group1]&lt;br /&gt;
			and not args[cfg.arg.group2]) then&lt;br /&gt;
			nav:attr(&lt;br /&gt;
				&#039;aria-labelledby&#039;,&lt;br /&gt;
				mw.uri.anchorEncode(&lt;br /&gt;
					args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group1]&lt;br /&gt;
				)&lt;br /&gt;
			)&lt;br /&gt;
		else&lt;br /&gt;
			nav:attr(&#039;aria-label&#039;, cfg.aria_label)&lt;br /&gt;
		end&lt;br /&gt;
	elseif border == cfg.keyword.border_subgroup then&lt;br /&gt;
		-- We assume that this navbox is being rendered in a list cell of a&lt;br /&gt;
		-- parent navbox, and is therefore inside a div with padding:0em 0.25em.&lt;br /&gt;
		-- We start with a &amp;lt;/div&amp;gt; to avoid the padding being applied, and at the&lt;br /&gt;
		-- end add a &amp;lt;div&amp;gt; to balance out the parent&#039;s &amp;lt;/div&amp;gt;&lt;br /&gt;
		res&lt;br /&gt;
			:wikitext(&#039;&amp;lt;/div&amp;gt;&#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
			:wikitext(&#039;&amp;lt;div&amp;gt;&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		res:node(add_navbox_styles(hiding_templatestyles))&lt;br /&gt;
		local nav = res:tag(&#039;div&#039;)&lt;br /&gt;
			:attr(&#039;role&#039;, &#039;navigation&#039;)&lt;br /&gt;
			:addClass(cfg.class.navbox)&lt;br /&gt;
			:addClass(args[cfg.arg.navboxclass])&lt;br /&gt;
			:cssText(args[cfg.arg.bodystyle])&lt;br /&gt;
			:cssText(args[cfg.arg.style])&lt;br /&gt;
			:css(&#039;padding&#039;, &#039;3px&#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
		-- aria-labelledby title, otherwise above, otherwise lone group&lt;br /&gt;
		if args[cfg.arg.title] or args[cfg.arg.above]&lt;br /&gt;
			or (args[cfg.arg.group1] and not args[cfg.arg.group2]) then&lt;br /&gt;
			nav:attr(&lt;br /&gt;
				&#039;aria-labelledby&#039;,&lt;br /&gt;
				mw.uri.anchorEncode(args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group1])&lt;br /&gt;
			)&lt;br /&gt;
		else&lt;br /&gt;
			nav:attr(&#039;aria-label&#039;, cfg.aria_label)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (args[cfg.arg.nocat] or cfg.keyword.nocat_false):lower() == cfg.keyword.nocat_false then&lt;br /&gt;
		renderTrackingCategories(res, border)&lt;br /&gt;
	end&lt;br /&gt;
	return striped(tostring(res), border)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.navbox(frame)&lt;br /&gt;
	if not getArgs then&lt;br /&gt;
		getArgs = require(&#039;Module:Arguments&#039;).getArgs&lt;br /&gt;
	end&lt;br /&gt;
	args = getArgs(frame, {wrappers = {cfg.pattern.navbox}})&lt;br /&gt;
&lt;br /&gt;
	-- Read the arguments in the order they&#039;ll be output in, to make references&lt;br /&gt;
	-- number in the right order.&lt;br /&gt;
	local _&lt;br /&gt;
	_ = args[cfg.arg.title]&lt;br /&gt;
	_ = args[cfg.arg.above]&lt;br /&gt;
	-- Limit this to 20 as covering &#039;most&#039; cases (that&#039;s a SWAG) and because&lt;br /&gt;
	-- iterator approach won&#039;t work here&lt;br /&gt;
	for i = 1, 20 do&lt;br /&gt;
		_ = args[format(cfg.arg.group_and_num, i)]&lt;br /&gt;
		_ = args[format(cfg.arg.list_and_num, i)]&lt;br /&gt;
	end&lt;br /&gt;
	_ = args[cfg.arg.below]&lt;br /&gt;
&lt;br /&gt;
	return p._navbox(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
	<entry>
		<id>https://atmospedia.org/index.php?title=Module:Message_box&amp;diff=200</id>
		<title>Module:Message box</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Module:Message_box&amp;diff=200"/>
		<updated>2024-07-03T18:32:42Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This is a meta-module for producing message box templates, including&lt;br /&gt;
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.&lt;br /&gt;
&lt;br /&gt;
-- Load necessary modules.&lt;br /&gt;
require(&#039;strict&#039;)&lt;br /&gt;
local getArgs&lt;br /&gt;
local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
&lt;br /&gt;
-- Get a language object for formatDate and ucfirst.&lt;br /&gt;
local lang = mw.language.getContentLanguage()&lt;br /&gt;
&lt;br /&gt;
-- Define constants&lt;br /&gt;
local CONFIG_MODULE = &#039;Module:Message box/configuration&#039;&lt;br /&gt;
local DEMOSPACES = {talk = &#039;tmbox&#039;, image = &#039;imbox&#039;, file = &#039;imbox&#039;, category = &#039;cmbox&#039;, article = &#039;ambox&#039;, main = &#039;ambox&#039;}&lt;br /&gt;
local TEMPLATE_STYLES = &#039;Module:Message box/%s.css&#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function getTitleObject(...)&lt;br /&gt;
	-- Get the title object, passing the function through pcall&lt;br /&gt;
	-- in case we are over the expensive function count limit.&lt;br /&gt;
	local success, title = pcall(mw.title.new, ...)&lt;br /&gt;
	if success then&lt;br /&gt;
		return title&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function union(t1, t2)&lt;br /&gt;
	-- Returns the union of two arrays.&lt;br /&gt;
	local vals = {}&lt;br /&gt;
	for i, v in ipairs(t1) do&lt;br /&gt;
		vals[v] = true&lt;br /&gt;
	end&lt;br /&gt;
	for i, v in ipairs(t2) do&lt;br /&gt;
		vals[v] = true&lt;br /&gt;
	end&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for k in pairs(vals) do&lt;br /&gt;
		table.insert(ret, k)&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(ret)&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getArgNums(args, prefix)&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local num = mw.ustring.match(tostring(k), &#039;^&#039; .. prefix .. &#039;([1-9]%d*)$&#039;)&lt;br /&gt;
		if num then&lt;br /&gt;
			table.insert(nums, tonumber(num))&lt;br /&gt;
		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;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Box class definition&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local MessageBox = {}&lt;br /&gt;
MessageBox.__index = MessageBox&lt;br /&gt;
&lt;br /&gt;
function MessageBox.new(boxType, args, cfg)&lt;br /&gt;
	args = args or {}&lt;br /&gt;
	local obj = {}&lt;br /&gt;
&lt;br /&gt;
	obj.boxType = boxType&lt;br /&gt;
&lt;br /&gt;
	-- Set the title object and the namespace.&lt;br /&gt;
	obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
	-- Set the config for our box type.&lt;br /&gt;
	obj.cfg = cfg[boxType]&lt;br /&gt;
	if not obj.cfg then&lt;br /&gt;
		local ns = obj.title.namespace&lt;br /&gt;
		-- boxType is &amp;quot;mbox&amp;quot; or invalid input&lt;br /&gt;
		if args.demospace and args.demospace ~= &#039;&#039; then&lt;br /&gt;
			-- implement demospace parameter of mbox&lt;br /&gt;
			local demospace = string.lower(args.demospace)&lt;br /&gt;
			if DEMOSPACES[demospace] then&lt;br /&gt;
				-- use template from DEMOSPACES&lt;br /&gt;
				obj.cfg = cfg[DEMOSPACES[demospace]]&lt;br /&gt;
				obj.boxType = DEMOSPACES[demospace]&lt;br /&gt;
			elseif string.find( demospace, &#039;talk&#039; ) then&lt;br /&gt;
				-- demo as a talk page&lt;br /&gt;
				obj.cfg = cfg.tmbox&lt;br /&gt;
				obj.boxType = &#039;tmbox&#039;&lt;br /&gt;
			else&lt;br /&gt;
				-- default to ombox&lt;br /&gt;
				obj.cfg = cfg.ombox&lt;br /&gt;
				obj.boxType = &#039;ombox&#039;&lt;br /&gt;
			end&lt;br /&gt;
		elseif ns == 0 then&lt;br /&gt;
			obj.cfg = cfg.ambox -- main namespace&lt;br /&gt;
			obj.boxType = &#039;ambox&#039;&lt;br /&gt;
		elseif ns == 6 then&lt;br /&gt;
			obj.cfg = cfg.imbox -- file namespace&lt;br /&gt;
			obj.boxType = &#039;imbox&#039;&lt;br /&gt;
		elseif ns == 14 then&lt;br /&gt;
			obj.cfg = cfg.cmbox -- category namespace&lt;br /&gt;
			obj.boxType = &#039;cmbox&#039;&lt;br /&gt;
		else&lt;br /&gt;
			local nsTable = mw.site.namespaces[ns]&lt;br /&gt;
			if nsTable and nsTable.isTalk then&lt;br /&gt;
				obj.cfg = cfg.tmbox -- any talk namespace&lt;br /&gt;
				obj.boxType = &#039;tmbox&#039;&lt;br /&gt;
			else&lt;br /&gt;
				obj.cfg = cfg.ombox -- other namespaces or invalid input&lt;br /&gt;
				obj.boxType = &#039;ombox&#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the arguments, and remove all blank arguments except for the ones&lt;br /&gt;
	-- listed in cfg.allowBlankParams.&lt;br /&gt;
	do&lt;br /&gt;
		local newArgs = {}&lt;br /&gt;
		for k, v in pairs(args) do&lt;br /&gt;
			if v ~= &#039;&#039; then&lt;br /&gt;
				newArgs[k] = v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for i, param in ipairs(obj.cfg.allowBlankParams or {}) do&lt;br /&gt;
			newArgs[param] = args[param]&lt;br /&gt;
		end&lt;br /&gt;
		obj.args = newArgs&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Define internal data structure.&lt;br /&gt;
	obj.categories = {}&lt;br /&gt;
	obj.classes = {}&lt;br /&gt;
	-- For lazy loading of [[Module:Category handler]].&lt;br /&gt;
	obj.hasCategories = false&lt;br /&gt;
&lt;br /&gt;
	return setmetatable(obj, MessageBox)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:addCat(ns, cat, sort)&lt;br /&gt;
	if not cat then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if sort then&lt;br /&gt;
		cat = string.format(&#039;[[Category:%s|%s]]&#039;, cat, sort)&lt;br /&gt;
	else&lt;br /&gt;
		cat = string.format(&#039;[[Category:%s]]&#039;, cat)&lt;br /&gt;
	end&lt;br /&gt;
	self.hasCategories = true&lt;br /&gt;
	self.categories[ns] = self.categories[ns] or {}&lt;br /&gt;
	table.insert(self.categories[ns], cat)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:addClass(class)&lt;br /&gt;
	if not class then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	self.classes[class] = 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:removeClass(class)&lt;br /&gt;
	if not class then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	self.classes[class] = nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setParameters()&lt;br /&gt;
	local args = self.args&lt;br /&gt;
	local cfg = self.cfg&lt;br /&gt;
&lt;br /&gt;
	-- Get type data.&lt;br /&gt;
	self.type = args.type&lt;br /&gt;
	local typeData = cfg.types[self.type]&lt;br /&gt;
	self.invalidTypeError = cfg.showInvalidTypeError&lt;br /&gt;
		and self.type&lt;br /&gt;
		and not typeData&lt;br /&gt;
	typeData = typeData or cfg.types[cfg.default]&lt;br /&gt;
	self.typeClass = typeData.class&lt;br /&gt;
	self.typeImage = typeData.image&lt;br /&gt;
&lt;br /&gt;
	-- Find if the box has been wrongly substituted.&lt;br /&gt;
	self.isSubstituted = cfg.substCheck and args.subst == &#039;SUBST&#039;&lt;br /&gt;
&lt;br /&gt;
	-- Find whether we are using a small message box.&lt;br /&gt;
	self.isSmall = cfg.allowSmall and (&lt;br /&gt;
		cfg.smallParam and args.small == cfg.smallParam&lt;br /&gt;
		or not cfg.smallParam and yesno(args.small)&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
	-- Add attributes, classes and styles.&lt;br /&gt;
	self.id = args.id&lt;br /&gt;
	self.name = args.name&lt;br /&gt;
	for _, class in ipairs(cfg.classes or {}) do&lt;br /&gt;
		self:addClass(class)&lt;br /&gt;
	end&lt;br /&gt;
	if self.name then&lt;br /&gt;
		self:addClass(&#039;box-&#039; .. string.gsub(self.name,&#039; &#039;,&#039;_&#039;))&lt;br /&gt;
	end&lt;br /&gt;
	local plainlinks = yesno(args.plainlinks)&lt;br /&gt;
	if plainlinks == true then&lt;br /&gt;
		self:addClass(&#039;plainlinks&#039;)&lt;br /&gt;
	elseif plainlinks == false then&lt;br /&gt;
		self:removeClass(&#039;plainlinks&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if self.isSmall then&lt;br /&gt;
		self:addClass(cfg.smallClass or &#039;mbox-small&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	self:addClass(self.typeClass)&lt;br /&gt;
	self:addClass(args.class)&lt;br /&gt;
	self.style = args.style&lt;br /&gt;
	self.attrs = args.attrs&lt;br /&gt;
&lt;br /&gt;
	-- Set text style.&lt;br /&gt;
	self.textstyle = args.textstyle&lt;br /&gt;
&lt;br /&gt;
	-- Find if we are on the template page or not. This functionality is only&lt;br /&gt;
	-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory&lt;br /&gt;
	-- and cfg.templateCategoryRequireName are set.&lt;br /&gt;
	self.useCollapsibleTextFields = cfg.useCollapsibleTextFields&lt;br /&gt;
	if self.useCollapsibleTextFields&lt;br /&gt;
		or cfg.templateCategory&lt;br /&gt;
		and cfg.templateCategoryRequireName&lt;br /&gt;
	then&lt;br /&gt;
		if self.name then&lt;br /&gt;
			local templateName = mw.ustring.match(&lt;br /&gt;
				self.name,&lt;br /&gt;
				&#039;^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$&#039;&lt;br /&gt;
			) or self.name&lt;br /&gt;
			templateName = &#039;Template:&#039; .. templateName&lt;br /&gt;
			self.templateTitle = getTitleObject(templateName)&lt;br /&gt;
		end&lt;br /&gt;
		self.isTemplatePage = self.templateTitle&lt;br /&gt;
			and mw.title.equals(self.title, self.templateTitle)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Process data for collapsible text fields. At the moment these are only&lt;br /&gt;
	-- used in {{ambox}}.&lt;br /&gt;
	if self.useCollapsibleTextFields then&lt;br /&gt;
		-- Get the self.issue value.&lt;br /&gt;
		if self.isSmall and args.smalltext then&lt;br /&gt;
			self.issue = args.smalltext&lt;br /&gt;
		else&lt;br /&gt;
			local sect&lt;br /&gt;
			if args.sect == &#039;&#039; then&lt;br /&gt;
				sect = &#039;This &#039; .. (cfg.sectionDefault or &#039;page&#039;)&lt;br /&gt;
			elseif type(args.sect) == &#039;string&#039; then&lt;br /&gt;
				sect = &#039;This &#039; .. args.sect&lt;br /&gt;
			end&lt;br /&gt;
			local issue = args.issue&lt;br /&gt;
			issue = type(issue) == &#039;string&#039; and issue ~= &#039;&#039; and issue or nil&lt;br /&gt;
			local text = args.text&lt;br /&gt;
			text = type(text) == &#039;string&#039; and text or nil&lt;br /&gt;
			local issues = {}&lt;br /&gt;
			table.insert(issues, sect)&lt;br /&gt;
			table.insert(issues, issue)&lt;br /&gt;
			table.insert(issues, text)&lt;br /&gt;
			self.issue = table.concat(issues, &#039; &#039;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Get the self.talk value.&lt;br /&gt;
		local talk = args.talk&lt;br /&gt;
		-- Show talk links on the template page or template subpages if the talk&lt;br /&gt;
		-- parameter is blank.&lt;br /&gt;
		if talk == &#039;&#039;&lt;br /&gt;
			and self.templateTitle&lt;br /&gt;
			and (&lt;br /&gt;
				mw.title.equals(self.templateTitle, self.title)&lt;br /&gt;
				or self.title:isSubpageOf(self.templateTitle)&lt;br /&gt;
			)&lt;br /&gt;
		then&lt;br /&gt;
			talk = &#039;#&#039;&lt;br /&gt;
		elseif talk == &#039;&#039; then&lt;br /&gt;
			talk = nil&lt;br /&gt;
		end&lt;br /&gt;
		if talk then&lt;br /&gt;
			-- If the talk value is a talk page, make a link to that page. Else&lt;br /&gt;
			-- assume that it&#039;s a section heading, and make a link to the talk&lt;br /&gt;
			-- page of the current page with that section heading.&lt;br /&gt;
			local talkTitle = getTitleObject(talk)&lt;br /&gt;
			local talkArgIsTalkPage = true&lt;br /&gt;
			if not talkTitle or not talkTitle.isTalkPage then&lt;br /&gt;
				talkArgIsTalkPage = false&lt;br /&gt;
				talkTitle = getTitleObject(&lt;br /&gt;
					self.title.text,&lt;br /&gt;
					mw.site.namespaces[self.title.namespace].talk.id&lt;br /&gt;
				)&lt;br /&gt;
			end&lt;br /&gt;
			if talkTitle and talkTitle.exists then&lt;br /&gt;
				local talkText = &#039;Relevant discussion may be found on&#039;&lt;br /&gt;
				if talkArgIsTalkPage then&lt;br /&gt;
					talkText = string.format(&lt;br /&gt;
						&#039;%s [[%s|%s]].&#039;,&lt;br /&gt;
						talkText,&lt;br /&gt;
						talk,&lt;br /&gt;
						talkTitle.prefixedText&lt;br /&gt;
					)&lt;br /&gt;
				else&lt;br /&gt;
					talkText = string.format(&lt;br /&gt;
						&#039;%s the [[%s#%s|talk page]].&#039;,&lt;br /&gt;
						talkText,&lt;br /&gt;
						talkTitle.prefixedText,&lt;br /&gt;
						talk&lt;br /&gt;
					)&lt;br /&gt;
				end&lt;br /&gt;
				self.talk = talkText&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Get other values.&lt;br /&gt;
		self.fix = args.fix ~= &#039;&#039; and args.fix or nil&lt;br /&gt;
		local date&lt;br /&gt;
		if args.date and args.date ~= &#039;&#039; then&lt;br /&gt;
			date = args.date&lt;br /&gt;
		elseif args.date == &#039;&#039; and self.isTemplatePage then&lt;br /&gt;
			date = lang:formatDate(&#039;F Y&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if date then&lt;br /&gt;
			self.date = string.format(&amp;quot; &amp;lt;small class=&#039;date-container&#039;&amp;gt;&#039;&#039;(&amp;lt;span class=&#039;date&#039;&amp;gt;%s&amp;lt;/span&amp;gt;)&#039;&#039;&amp;lt;/small&amp;gt;&amp;quot;, date)&lt;br /&gt;
		end&lt;br /&gt;
		self.info = args.info&lt;br /&gt;
		if yesno(args.removalnotice) then&lt;br /&gt;
			self.removalNotice = cfg.removalNotice&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the non-collapsible text field. At the moment this is used by all box&lt;br /&gt;
	-- types other than ambox, and also by ambox when small=yes.&lt;br /&gt;
	if self.isSmall then&lt;br /&gt;
		self.text = args.smalltext or args.text&lt;br /&gt;
	else&lt;br /&gt;
		self.text = args.text&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the below row.&lt;br /&gt;
	self.below = cfg.below and args.below&lt;br /&gt;
&lt;br /&gt;
	-- General image settings.&lt;br /&gt;
	self.imageCellDiv = not self.isSmall and cfg.imageCellDiv&lt;br /&gt;
	self.imageEmptyCell = cfg.imageEmptyCell&lt;br /&gt;
	if cfg.imageEmptyCellStyle then&lt;br /&gt;
		self.imageEmptyCellStyle = &#039;border:none;padding:0px;width:1px&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Left image settings.&lt;br /&gt;
	local imageLeft = self.isSmall and args.smallimage or args.image&lt;br /&gt;
	if cfg.imageCheckBlank and imageLeft ~= &#039;blank&#039; and imageLeft ~= &#039;none&#039;&lt;br /&gt;
		or not cfg.imageCheckBlank and imageLeft ~= &#039;none&#039;&lt;br /&gt;
	then&lt;br /&gt;
		self.imageLeft = imageLeft&lt;br /&gt;
		if not imageLeft then&lt;br /&gt;
			local imageSize = self.isSmall&lt;br /&gt;
				and (cfg.imageSmallSize or &#039;30x30px&#039;)&lt;br /&gt;
				or &#039;40x40px&#039;&lt;br /&gt;
			self.imageLeft = string.format(&#039;[[File:%s|%s|link=|alt=]]&#039;, self.typeImage&lt;br /&gt;
				or &#039;Information icon4.svg&#039;, imageSize)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Right image settings.&lt;br /&gt;
	local imageRight = self.isSmall and args.smallimageright or args.imageright&lt;br /&gt;
	if not (cfg.imageRightNone and imageRight == &#039;none&#039;) then&lt;br /&gt;
		self.imageRight = imageRight&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setMainspaceCategories()&lt;br /&gt;
	local args = self.args&lt;br /&gt;
	local cfg = self.cfg&lt;br /&gt;
&lt;br /&gt;
	if not cfg.allowMainspaceCategories then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for _, prefix in ipairs{&#039;cat&#039;, &#039;category&#039;, &#039;all&#039;} do&lt;br /&gt;
		args[prefix .. &#039;1&#039;] = args[prefix]&lt;br /&gt;
		nums = union(nums, getArgNums(args, prefix))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- The following is roughly equivalent to the old {{Ambox/category}}.&lt;br /&gt;
	local date = args.date&lt;br /&gt;
	date = type(date) == &#039;string&#039; and date&lt;br /&gt;
	local preposition = &#039;from&#039;&lt;br /&gt;
	for _, num in ipairs(nums) do&lt;br /&gt;
		local mainCat = args[&#039;cat&#039; .. tostring(num)]&lt;br /&gt;
			or args[&#039;category&#039; .. tostring(num)]&lt;br /&gt;
		local allCat = args[&#039;all&#039; .. tostring(num)]&lt;br /&gt;
		mainCat = type(mainCat) == &#039;string&#039; and mainCat&lt;br /&gt;
		allCat = type(allCat) == &#039;string&#039; and allCat&lt;br /&gt;
		if mainCat and date and date ~= &#039;&#039; then&lt;br /&gt;
			local catTitle = string.format(&#039;%s %s %s&#039;, mainCat, preposition, date)&lt;br /&gt;
			self:addCat(0, catTitle)&lt;br /&gt;
			catTitle = getTitleObject(&#039;Category:&#039; .. catTitle)&lt;br /&gt;
			if not catTitle or not catTitle.exists then&lt;br /&gt;
				self:addCat(0, &#039;Articles with invalid date parameter in template&#039;)&lt;br /&gt;
			end&lt;br /&gt;
		elseif mainCat and (not date or date == &#039;&#039;) then&lt;br /&gt;
			self:addCat(0, mainCat)&lt;br /&gt;
		end&lt;br /&gt;
		if allCat then&lt;br /&gt;
			self:addCat(0, allCat)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setTemplateCategories()&lt;br /&gt;
	local args = self.args&lt;br /&gt;
	local cfg = self.cfg&lt;br /&gt;
&lt;br /&gt;
	-- Add template categories.&lt;br /&gt;
	if cfg.templateCategory then&lt;br /&gt;
		if cfg.templateCategoryRequireName then&lt;br /&gt;
			if self.isTemplatePage then&lt;br /&gt;
				self:addCat(10, cfg.templateCategory)&lt;br /&gt;
			end&lt;br /&gt;
		elseif not self.title.isSubpage then&lt;br /&gt;
			self:addCat(10, cfg.templateCategory)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add template error categories.&lt;br /&gt;
	if cfg.templateErrorCategory then&lt;br /&gt;
		local templateErrorCategory = cfg.templateErrorCategory&lt;br /&gt;
		local templateCat, templateSort&lt;br /&gt;
		if not self.name and not self.title.isSubpage then&lt;br /&gt;
			templateCat = templateErrorCategory&lt;br /&gt;
		elseif self.isTemplatePage then&lt;br /&gt;
			local paramsToCheck = cfg.templateErrorParamsToCheck or {}&lt;br /&gt;
			local count = 0&lt;br /&gt;
			for i, param in ipairs(paramsToCheck) do&lt;br /&gt;
				if not args[param] then&lt;br /&gt;
					count = count + 1&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if count &amp;gt; 0 then&lt;br /&gt;
				templateCat = templateErrorCategory&lt;br /&gt;
				templateSort = tostring(count)&lt;br /&gt;
			end&lt;br /&gt;
			if self.categoryNums and #self.categoryNums &amp;gt; 0 then&lt;br /&gt;
				templateCat = templateErrorCategory&lt;br /&gt;
				templateSort = &#039;C&#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self:addCat(10, templateCat, templateSort)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setAllNamespaceCategories()&lt;br /&gt;
	-- Set categories for all namespaces.&lt;br /&gt;
	if self.isSubstituted then&lt;br /&gt;
		self:addCat(&#039;all&#039;, &#039;Pages with incorrectly substituted templates&#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setCategories()&lt;br /&gt;
	if self.title.namespace == 0 then&lt;br /&gt;
		self:setMainspaceCategories()&lt;br /&gt;
	elseif self.title.namespace == 10 then&lt;br /&gt;
		self:setTemplateCategories()&lt;br /&gt;
	end&lt;br /&gt;
	self:setAllNamespaceCategories()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:renderCategories()&lt;br /&gt;
	if not self.hasCategories then&lt;br /&gt;
		-- No categories added, no need to pass them to Category handler so,&lt;br /&gt;
		-- if it was invoked, it would return the empty string.&lt;br /&gt;
		-- So we shortcut and return the empty string.&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	-- Convert category tables to strings and pass them through&lt;br /&gt;
	-- [[Module:Category handler]].&lt;br /&gt;
	return require(&#039;Module:Category handler&#039;)._main{&lt;br /&gt;
		main = table.concat(self.categories[0] or {}),&lt;br /&gt;
		template = table.concat(self.categories[10] or {}),&lt;br /&gt;
		all = table.concat(self.categories.all or {}),&lt;br /&gt;
		nocat = self.args.nocat,&lt;br /&gt;
		page = self.args.page&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:export()&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
&lt;br /&gt;
	-- Add the subst check error.&lt;br /&gt;
	if self.isSubstituted and self.name then&lt;br /&gt;
		root:tag(&#039;b&#039;)&lt;br /&gt;
			:addClass(&#039;error&#039;)&lt;br /&gt;
			:wikitext(string.format(&lt;br /&gt;
				&#039;Template &amp;lt;code&amp;gt;%s[[Template:%s|%s]]%s&amp;lt;/code&amp;gt; has been incorrectly substituted.&#039;,&lt;br /&gt;
				mw.text.nowiki(&#039;{{&#039;), self.name, self.name, mw.text.nowiki(&#039;}}&#039;)&lt;br /&gt;
			))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add TemplateStyles&lt;br /&gt;
	root:wikitext(mw.getCurrentFrame():extensionTag{&lt;br /&gt;
		name = &#039;templatestyles&#039;,&lt;br /&gt;
		args = { src = TEMPLATE_STYLES:format(self.boxType) },&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	-- Create the box table.&lt;br /&gt;
	local boxTable&lt;br /&gt;
	-- Check for fmbox because not all interface messages have mw-parser-output&lt;br /&gt;
	-- which is necessary for TemplateStyles. Add the wrapper class if it is and&lt;br /&gt;
	-- then start the actual mbox, else start the mbox.&lt;br /&gt;
	if self.boxType == &#039;fmbox&#039; then&lt;br /&gt;
		boxTable = root:tag(&#039;div&#039;)&lt;br /&gt;
			:addClass(&#039;mw-parser-output&#039;)&lt;br /&gt;
			:tag(&#039;table&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		boxTable = root:tag(&#039;table&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	boxTable:attr(&#039;id&#039;, self.id or nil)&lt;br /&gt;
	for class, _ in pairs(self.classes or {}) do&lt;br /&gt;
		boxTable:addClass(class or nil)&lt;br /&gt;
	end&lt;br /&gt;
	boxTable&lt;br /&gt;
		:cssText(self.style or nil)&lt;br /&gt;
		:attr(&#039;role&#039;, &#039;presentation&#039;)&lt;br /&gt;
&lt;br /&gt;
	if self.attrs then&lt;br /&gt;
		boxTable:attr(self.attrs)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the left-hand image.&lt;br /&gt;
	local row = boxTable:tag(&#039;tr&#039;)&lt;br /&gt;
	if self.imageLeft then&lt;br /&gt;
		local imageLeftCell = row:tag(&#039;td&#039;):addClass(&#039;mbox-image&#039;)&lt;br /&gt;
		if self.imageCellDiv then&lt;br /&gt;
			-- If we are using a div, redefine imageLeftCell so that the image&lt;br /&gt;
			-- is inside it. Divs use style=&amp;quot;width: 52px;&amp;quot;, which limits the&lt;br /&gt;
			-- image width to 52px. If any images in a div are wider than that,&lt;br /&gt;
			-- they may overlap with the text or cause other display problems.&lt;br /&gt;
			imageLeftCell = imageLeftCell:tag(&#039;div&#039;):css(&#039;width&#039;, &#039;52px&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		imageLeftCell:wikitext(self.imageLeft or nil)&lt;br /&gt;
	elseif self.imageEmptyCell then&lt;br /&gt;
		-- Some message boxes define an empty cell if no image is specified, and&lt;br /&gt;
		-- some don&#039;t. The old template code in templates where empty cells are&lt;br /&gt;
		-- specified gives the following hint: &amp;quot;No image. Cell with some width&lt;br /&gt;
		-- or padding necessary for text cell to have 100% width.&amp;quot;&lt;br /&gt;
		row:tag(&#039;td&#039;)&lt;br /&gt;
			:addClass(&#039;mbox-empty-cell&#039;)&lt;br /&gt;
			:cssText(self.imageEmptyCellStyle or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the text.&lt;br /&gt;
	local textCell = row:tag(&#039;td&#039;):addClass(&#039;mbox-text&#039;)&lt;br /&gt;
	if self.useCollapsibleTextFields then&lt;br /&gt;
		-- The message box uses advanced text parameters that allow things to be&lt;br /&gt;
		-- collapsible. At the moment, only ambox uses this.&lt;br /&gt;
		textCell:cssText(self.textstyle or nil)&lt;br /&gt;
		local textCellDiv = textCell:tag(&#039;div&#039;)&lt;br /&gt;
		textCellDiv&lt;br /&gt;
			:addClass(&#039;mbox-text-span&#039;)&lt;br /&gt;
			:wikitext(self.issue or nil)&lt;br /&gt;
		if (self.talk or self.fix) and not self.isSmall then&lt;br /&gt;
			textCellDiv:tag(&#039;span&#039;)&lt;br /&gt;
				:addClass(&#039;hide-when-compact&#039;)&lt;br /&gt;
				:wikitext(self.talk and (&#039; &#039; .. self.talk) or nil)&lt;br /&gt;
				:wikitext(self.fix and (&#039; &#039; .. self.fix) or nil)&lt;br /&gt;
		end&lt;br /&gt;
		textCellDiv:wikitext(self.date and (&#039; &#039; .. self.date) or nil)&lt;br /&gt;
		if self.info and not self.isSmall then&lt;br /&gt;
			textCellDiv&lt;br /&gt;
				:tag(&#039;span&#039;)&lt;br /&gt;
				:addClass(&#039;hide-when-compact&#039;)&lt;br /&gt;
				:wikitext(self.info and (&#039; &#039; .. self.info) or nil)&lt;br /&gt;
		end&lt;br /&gt;
		if self.removalNotice then&lt;br /&gt;
			textCellDiv:tag(&#039;small&#039;)&lt;br /&gt;
				:addClass(&#039;hide-when-compact&#039;)&lt;br /&gt;
				:tag(&#039;i&#039;)&lt;br /&gt;
					:wikitext(string.format(&amp;quot; (%s)&amp;quot;, self.removalNotice))&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		-- Default text formatting - anything goes.&lt;br /&gt;
		textCell&lt;br /&gt;
			:cssText(self.textstyle or nil)&lt;br /&gt;
			:wikitext(self.text or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the right-hand image.&lt;br /&gt;
	if self.imageRight then&lt;br /&gt;
		local imageRightCell = row:tag(&#039;td&#039;):addClass(&#039;mbox-imageright&#039;)&lt;br /&gt;
		if self.imageCellDiv then&lt;br /&gt;
			-- If we are using a div, redefine imageRightCell so that the image&lt;br /&gt;
			-- is inside it.&lt;br /&gt;
			imageRightCell = imageRightCell:tag(&#039;div&#039;):css(&#039;width&#039;, &#039;52px&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		imageRightCell&lt;br /&gt;
			:wikitext(self.imageRight or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the below row.&lt;br /&gt;
	if self.below then&lt;br /&gt;
		boxTable:tag(&#039;tr&#039;)&lt;br /&gt;
			:tag(&#039;td&#039;)&lt;br /&gt;
				:attr(&#039;colspan&#039;, self.imageRight and &#039;3&#039; or &#039;2&#039;)&lt;br /&gt;
				:addClass(&#039;mbox-text&#039;)&lt;br /&gt;
				:cssText(self.textstyle or nil)&lt;br /&gt;
				:wikitext(self.below or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add error message for invalid type parameters.&lt;br /&gt;
	if self.invalidTypeError then&lt;br /&gt;
		root:tag(&#039;div&#039;)&lt;br /&gt;
			:css(&#039;text-align&#039;, &#039;center&#039;)&lt;br /&gt;
			:wikitext(string.format(&lt;br /&gt;
				&#039;This message box is using an invalid &amp;quot;type=%s&amp;quot; parameter and needs fixing.&#039;,&lt;br /&gt;
				self.type or &#039;&#039;&lt;br /&gt;
			))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add categories.&lt;br /&gt;
	root:wikitext(self:renderCategories() or nil)&lt;br /&gt;
&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exports&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p, mt = {}, {}&lt;br /&gt;
&lt;br /&gt;
function p._exportClasses()&lt;br /&gt;
	-- For testing.&lt;br /&gt;
	return {&lt;br /&gt;
		MessageBox = MessageBox&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(boxType, args, cfgTables)&lt;br /&gt;
	local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))&lt;br /&gt;
	box:setParameters()&lt;br /&gt;
	box:setCategories()&lt;br /&gt;
	return box:export()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function mt.__index(t, k)&lt;br /&gt;
	return function (frame)&lt;br /&gt;
		if not getArgs then&lt;br /&gt;
			getArgs = require(&#039;Module:Arguments&#039;).getArgs&lt;br /&gt;
		end&lt;br /&gt;
		return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return setmetatable(p, mt)&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
	<entry>
		<id>https://atmospedia.org/index.php?title=Module:Sidebar&amp;diff=198</id>
		<title>Module:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Module:Sidebar&amp;diff=198"/>
		<updated>2024-07-03T18:32:42Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;require(&#039;strict&#039;)&lt;br /&gt;
local cfg = mw.loadData(&#039;Module:Sidebar/configuration&#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local getArgs = require(&#039;Module:Arguments&#039;).getArgs&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Categorizes calling templates and modules with a &#039;style&#039; parameter of any sort&lt;br /&gt;
for tracking to convert to TemplateStyles.&lt;br /&gt;
&lt;br /&gt;
TODO after a long cleanup: Catch sidebars in other namespaces than Template and Module.&lt;br /&gt;
TODO would probably want to remove /log and /archive as CS1 does&lt;br /&gt;
]]&lt;br /&gt;
local function categorizeTemplatesWithInlineStyles(args)&lt;br /&gt;
	local title = mw.title.getCurrentTitle()&lt;br /&gt;
	if title.namespace ~= 10 and title.namespace ~= 828 then return &#039;&#039; end&lt;br /&gt;
	for _, pattern in ipairs (cfg.i18n.pattern.uncategorized_conversion_titles) do&lt;br /&gt;
		if title.text:match(pattern) then return &#039;&#039; end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for key, _ in pairs(args) do&lt;br /&gt;
		if mw.ustring.find(key, cfg.i18n.pattern.style_conversion) or key == &#039;width&#039; then&lt;br /&gt;
			return cfg.i18n.category.conversion&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
For compatibility with the original {{sidebar with collapsible lists}}&lt;br /&gt;
implementation, which passed some parameters through {{#if}} to trim their&lt;br /&gt;
whitespace. This also triggered the automatic newline behavior.&lt;br /&gt;
]]&lt;br /&gt;
-- See ([[meta:Help:Newlines and spaces#Automatic newline]])&lt;br /&gt;
local function trimAndAddAutomaticNewline(s)&lt;br /&gt;
	s = mw.ustring.gsub(s, &amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
	if mw.ustring.find(s, &#039;^[#*:;]&#039;) or mw.ustring.find(s, &#039;^{|&#039;) then&lt;br /&gt;
		return &#039;\n&#039; .. s&lt;br /&gt;
	else&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Finds whether a sidebar has a subgroup sidebar.&lt;br /&gt;
]]&lt;br /&gt;
local function hasSubgroup(s)&lt;br /&gt;
	if mw.ustring.find(s, cfg.i18n.pattern.subgroup) then&lt;br /&gt;
		return true&lt;br /&gt;
	else&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function has_navbar(navbar_mode, sidebar_name)&lt;br /&gt;
	return navbar_mode ~= cfg.i18n.navbar_none and&lt;br /&gt;
		navbar_mode ~= cfg.i18n.navbar_off and&lt;br /&gt;
		(&lt;br /&gt;
			sidebar_name or&lt;br /&gt;
			mw.getCurrentFrame():getParent():getTitle():gsub(cfg.i18n.pattern.sandbox, &#039;&#039;) ~=&lt;br /&gt;
			cfg.i18n.title_not_to_add_navbar&lt;br /&gt;
		)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function has_list_class(args, htmlclass)&lt;br /&gt;
	local patterns = {&lt;br /&gt;
		&#039;^&#039; .. htmlclass .. &#039;$&#039;,&lt;br /&gt;
		&#039;%s&#039; .. htmlclass .. &#039;$&#039;,&lt;br /&gt;
		&#039;^&#039; .. htmlclass .. &#039;%s&#039;,&lt;br /&gt;
		&#039;%s&#039; .. htmlclass .. &#039;%s&#039;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for arg, value in pairs(args) do&lt;br /&gt;
		if type(arg) == &#039;string&#039; and mw.ustring.find(arg, &#039;class&#039;) then&lt;br /&gt;
			for _, pattern in ipairs(patterns) do&lt;br /&gt;
				if mw.ustring.find(args[arg] or &#039;&#039;, pattern) then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- there are a lot of list classes in the wild, so we add their TemplateStyles&lt;br /&gt;
local function add_list_styles(args)&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	local function add_list_templatestyles(htmlclass, templatestyles)&lt;br /&gt;
		if has_list_class(args, htmlclass) then&lt;br /&gt;
			return frame:extensionTag{&lt;br /&gt;
				name = &#039;templatestyles&#039;, args = { src = templatestyles }&lt;br /&gt;
			}&lt;br /&gt;
		else&lt;br /&gt;
			return &#039;&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local plainlist_styles = add_list_templatestyles(&#039;plainlist&#039;, cfg.i18n.plainlist_templatestyles)&lt;br /&gt;
	local hlist_styles = add_list_templatestyles(&#039;hlist&#039;, cfg.i18n.hlist_templatestyles)&lt;br /&gt;
	&lt;br /&gt;
	-- a second workaround for [[phab:T303378]]&lt;br /&gt;
	-- when that issue is fixed, we can actually use has_navbar not to emit the&lt;br /&gt;
	-- tag here if we want&lt;br /&gt;
	if has_navbar(args.navbar, args.name) and hlist_styles == &#039;&#039; then&lt;br /&gt;
		hlist_styles = frame:extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;, args = { src = cfg.i18n.hlist_templatestyles}&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- hlist -&amp;gt; plainlist is best-effort to preserve old Common.css ordering. [hlist_note]&lt;br /&gt;
	return hlist_styles .. plainlist_styles&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- work around [[phab:T303378]]&lt;br /&gt;
-- for each arg: find all the templatestyles strip markers, insert them into a&lt;br /&gt;
-- table. then remove all templatestyles markers from the arg&lt;br /&gt;
local function move_hiding_templatestyles(args)&lt;br /&gt;
	local gfind = string.gfind&lt;br /&gt;
	local gsub = string.gsub&lt;br /&gt;
	local templatestyles_markers = {}&lt;br /&gt;
	local strip_marker_pattern = &#039;(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)&#039;&lt;br /&gt;
	for k, arg in pairs(args) do&lt;br /&gt;
		for marker in gfind(arg, strip_marker_pattern) do&lt;br /&gt;
			table.insert(templatestyles_markers, marker)&lt;br /&gt;
		end&lt;br /&gt;
		args[k] = gsub(arg, strip_marker_pattern, &#039;&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	return templatestyles_markers&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Main sidebar function. Takes the frame, args, and an optional collapsibleClass.&lt;br /&gt;
The collapsibleClass is and should be used only for sidebars with collapsible&lt;br /&gt;
lists, as in p.collapsible.&lt;br /&gt;
]]&lt;br /&gt;
function p.sidebar(frame, args, collapsibleClass)&lt;br /&gt;
	if not args then&lt;br /&gt;
		args = getArgs(frame)&lt;br /&gt;
	end&lt;br /&gt;
	local hiding_templatestyles = table.concat(move_hiding_templatestyles(args))&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
	local child = args.child and mw.text.trim(args.child) == cfg.i18n.child_yes&lt;br /&gt;
&lt;br /&gt;
	root = root:tag(&#039;table&#039;)&lt;br /&gt;
	if not child then&lt;br /&gt;
		root &lt;br /&gt;
			:addClass(cfg.i18n.class.sidebar)&lt;br /&gt;
			-- force collapsibleclass to be sidebar-collapse otherwise output nothing&lt;br /&gt;
			:addClass(collapsibleClass == cfg.i18n.class.collapse and cfg.i18n.class.collapse or nil)&lt;br /&gt;
			:addClass(&#039;nomobile&#039;)&lt;br /&gt;
			:addClass(args.float == cfg.i18n.float_none and cfg.i18n.class.float_none or nil)&lt;br /&gt;
			:addClass(args.float == cfg.i18n.float_left and cfg.i18n.class.float_left or nil)&lt;br /&gt;
			:addClass(args.wraplinks ~= cfg.i18n.wrap_true and cfg.i18n.class.wraplinks or nil)&lt;br /&gt;
			:addClass(args.bodyclass or args.class)&lt;br /&gt;
			:css(&#039;width&#039;, args.width or nil)&lt;br /&gt;
			:cssText(args.bodystyle or args.style)&lt;br /&gt;
&lt;br /&gt;
		if args.outertitle then&lt;br /&gt;
			root&lt;br /&gt;
				:tag(&#039;caption&#039;)&lt;br /&gt;
					:addClass(cfg.i18n.class.outer_title)&lt;br /&gt;
					:addClass(args.outertitleclass)&lt;br /&gt;
					:cssText(args.outertitlestyle)&lt;br /&gt;
					:wikitext(args.outertitle)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if args.topimage then&lt;br /&gt;
			local imageCell = root:tag(&#039;tr&#039;):tag(&#039;td&#039;)&lt;br /&gt;
&lt;br /&gt;
			imageCell&lt;br /&gt;
				:addClass(cfg.i18n.class.top_image)&lt;br /&gt;
				:addClass(args.topimageclass)&lt;br /&gt;
				:cssText(args.topimagestyle)&lt;br /&gt;
				:wikitext(args.topimage)&lt;br /&gt;
&lt;br /&gt;
			if args.topcaption then&lt;br /&gt;
				imageCell&lt;br /&gt;
					:tag(&#039;div&#039;)&lt;br /&gt;
						:addClass(cfg.i18n.class.top_caption)&lt;br /&gt;
						:cssText(args.topcaptionstyle)&lt;br /&gt;
						:wikitext(args.topcaption)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if args.pretitle then&lt;br /&gt;
			root&lt;br /&gt;
				:tag(&#039;tr&#039;)&lt;br /&gt;
					:tag(&#039;td&#039;)&lt;br /&gt;
						:addClass(args.topimage and cfg.i18n.class.pretitle_with_top_image&lt;br /&gt;
							or cfg.i18n.class.pretitle)&lt;br /&gt;
						:addClass(args.pretitleclass)&lt;br /&gt;
						:cssText(args.basestyle)&lt;br /&gt;
						:cssText(args.pretitlestyle)&lt;br /&gt;
						:wikitext(args.pretitle)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		root&lt;br /&gt;
			:addClass(cfg.i18n.class.subgroup)&lt;br /&gt;
			:addClass(args.bodyclass or args.class)&lt;br /&gt;
			:cssText(args.bodystyle or args.style)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args.title then&lt;br /&gt;
		if child then&lt;br /&gt;
			root&lt;br /&gt;
				:wikitext(args.title)&lt;br /&gt;
		else&lt;br /&gt;
			root&lt;br /&gt;
				:tag(&#039;tr&#039;)&lt;br /&gt;
					:tag(&#039;th&#039;)&lt;br /&gt;
						:addClass(args.pretitle and cfg.i18n.class.title_with_pretitle&lt;br /&gt;
							or cfg.i18n.class.title)&lt;br /&gt;
						:addClass(args.titleclass)&lt;br /&gt;
						:cssText(args.basestyle)&lt;br /&gt;
						:cssText(args.titlestyle)&lt;br /&gt;
						:wikitext(args.title)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args.image then&lt;br /&gt;
		local imageCell = root:tag(&#039;tr&#039;):tag(&#039;td&#039;)&lt;br /&gt;
&lt;br /&gt;
		imageCell&lt;br /&gt;
			:addClass(cfg.i18n.class.image)&lt;br /&gt;
			:addClass(args.imageclass)&lt;br /&gt;
			:cssText(args.imagestyle)&lt;br /&gt;
			:wikitext(args.image)&lt;br /&gt;
&lt;br /&gt;
		if args.caption then&lt;br /&gt;
			imageCell&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(cfg.i18n.class.caption)&lt;br /&gt;
					:cssText(args.captionstyle)&lt;br /&gt;
					:wikitext(args.caption)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args.above then&lt;br /&gt;
		root&lt;br /&gt;
			:tag(&#039;tr&#039;)&lt;br /&gt;
				:tag(&#039;td&#039;)&lt;br /&gt;
					:addClass(cfg.i18n.class.above)&lt;br /&gt;
					:addClass(args.aboveclass)&lt;br /&gt;
					:cssText(args.abovestyle)&lt;br /&gt;
					:newline() -- newline required for bullet-points to work&lt;br /&gt;
					:wikitext(args.above)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local rowNums = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		k = &#039;&#039; .. k&lt;br /&gt;
		local num = k:match(&#039;^heading(%d+)$&#039;) or k:match(&#039;^content(%d+)$&#039;)&lt;br /&gt;
		if num then table.insert(rowNums, tonumber(num)) end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(rowNums)&lt;br /&gt;
	-- remove duplicates from the list (e.g. 3 will be duplicated if both heading3&lt;br /&gt;
	-- and content3 are specified)&lt;br /&gt;
	for i = #rowNums, 1, -1 do&lt;br /&gt;
		if rowNums[i] == rowNums[i - 1] then&lt;br /&gt;
			table.remove(rowNums, i)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for i, num in ipairs(rowNums) do&lt;br /&gt;
		local heading = args[&#039;heading&#039; .. num]&lt;br /&gt;
		if heading then&lt;br /&gt;
			root&lt;br /&gt;
				:tag(&#039;tr&#039;)&lt;br /&gt;
					:tag(&#039;th&#039;)&lt;br /&gt;
						:addClass(cfg.i18n.class.heading)&lt;br /&gt;
						:addClass(args.headingclass)&lt;br /&gt;
						:addClass(args[&#039;heading&#039; .. num .. &#039;class&#039;])&lt;br /&gt;
						:cssText(args.basestyle)&lt;br /&gt;
						:cssText(args.headingstyle)&lt;br /&gt;
						:cssText(args[&#039;heading&#039; .. num .. &#039;style&#039;])&lt;br /&gt;
						:newline()&lt;br /&gt;
						:wikitext(heading)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local content = args[&#039;content&#039; .. num]&lt;br /&gt;
		if content then&lt;br /&gt;
			root&lt;br /&gt;
				:tag(&#039;tr&#039;)&lt;br /&gt;
					:tag(&#039;td&#039;)&lt;br /&gt;
						:addClass(hasSubgroup(content) and cfg.i18n.class.content_with_subgroup&lt;br /&gt;
							or cfg.i18n.class.content)&lt;br /&gt;
						:addClass(args.contentclass)&lt;br /&gt;
						:addClass(args[&#039;content&#039; .. num .. &#039;class&#039;])&lt;br /&gt;
						:cssText(args.contentstyle)&lt;br /&gt;
						:cssText(args[&#039;content&#039; .. num .. &#039;style&#039;])&lt;br /&gt;
						:newline()&lt;br /&gt;
						:wikitext(content)&lt;br /&gt;
						:done()&lt;br /&gt;
					 -- Without a linebreak after the &amp;lt;/td&amp;gt;, a nested list like&lt;br /&gt;
					 -- &amp;quot;* {{hlist| ...}}&amp;quot; doesn&#039;t parse correctly.&lt;br /&gt;
					:newline()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args.below then&lt;br /&gt;
		root&lt;br /&gt;
			:tag(&#039;tr&#039;)&lt;br /&gt;
				:tag(&#039;td&#039;)&lt;br /&gt;
					:addClass(cfg.i18n.class.below)&lt;br /&gt;
					:addClass(args.belowclass)&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;
	if not child and has_navbar(args.navbar, args.name) then&lt;br /&gt;
		root&lt;br /&gt;
			:tag(&#039;tr&#039;)&lt;br /&gt;
				:tag(&#039;td&#039;)&lt;br /&gt;
					:addClass(cfg.i18n.class.navbar)&lt;br /&gt;
					:cssText(args.navbarstyle)&lt;br /&gt;
					:wikitext(require(&#039;Module:Navbar&#039;)._navbar{&lt;br /&gt;
						args.name,&lt;br /&gt;
						mini = 1,&lt;br /&gt;
						fontstyle = args.navbarfontstyle&lt;br /&gt;
					})&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local base_templatestyles = frame:extensionTag{&lt;br /&gt;
		name = &#039;templatestyles&#039;, args = { src = cfg.i18n.templatestyles }&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local templatestyles = &#039;&#039;&lt;br /&gt;
	if args[&#039;templatestyles&#039;] and args[&#039;templatestyles&#039;] ~= &#039;&#039; then&lt;br /&gt;
		templatestyles = frame:extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;, args = { src = args[&#039;templatestyles&#039;] }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local child_templatestyles = &#039;&#039;&lt;br /&gt;
	if args[&#039;child templatestyles&#039;] and args[&#039;child templatestyles&#039;] ~= &#039;&#039; then&lt;br /&gt;
		child_templatestyles = frame:extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;, args = { src = args[&#039;child templatestyles&#039;] }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local grandchild_templatestyles = &#039;&#039;&lt;br /&gt;
	if args[&#039;grandchild templatestyles&#039;] and args[&#039;grandchild templatestyles&#039;] ~= &#039;&#039; then&lt;br /&gt;
		grandchild_templatestyles = frame:extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;, args = { src = args[&#039;grandchild templatestyles&#039;] }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat({&lt;br /&gt;
		add_list_styles(args), -- see [hlist_note] above about ordering&lt;br /&gt;
		base_templatestyles,&lt;br /&gt;
		templatestyles,&lt;br /&gt;
		child_templatestyles,&lt;br /&gt;
		grandchild_templatestyles,&lt;br /&gt;
		hiding_templatestyles,&lt;br /&gt;
		tostring(root),&lt;br /&gt;
		(child and cfg.i18n.category.child or &#039;&#039;),&lt;br /&gt;
		categorizeTemplatesWithInlineStyles(args)&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function list_title(args, is_centered_list_titles, num)&lt;br /&gt;
	&lt;br /&gt;
	local title_text = trimAndAddAutomaticNewline(args[&#039;list&#039; .. num .. &#039;title&#039;]&lt;br /&gt;
		or cfg.i18n.default_list_title)&lt;br /&gt;
&lt;br /&gt;
	local title&lt;br /&gt;
	if is_centered_list_titles then&lt;br /&gt;
		-- collapsible can be finicky, so provide some CSS/HTML to support&lt;br /&gt;
		title = mw.html.create(&#039;div&#039;)&lt;br /&gt;
			:addClass(cfg.i18n.class.list_title_centered)&lt;br /&gt;
			:wikitext(title_text)&lt;br /&gt;
	else&lt;br /&gt;
		title = mw.html.create()&lt;br /&gt;
			:wikitext(title_text)&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	local title_container = mw.html.create(&#039;div&#039;)&lt;br /&gt;
		:addClass(cfg.i18n.class.list_title)&lt;br /&gt;
		-- don&#039;t /need/ a listnumtitleclass because you can do&lt;br /&gt;
		-- .templateclass .listnumclass .sidebar-list-title&lt;br /&gt;
		:addClass(args.listtitleclass)&lt;br /&gt;
		:cssText(args.basestyle)&lt;br /&gt;
		:cssText(args.listtitlestyle)&lt;br /&gt;
		:cssText(&#039;color: var(--color-base)&#039;)&lt;br /&gt;
		:cssText(args[&#039;list&#039; .. num .. &#039;titlestyle&#039;])&lt;br /&gt;
		:node(title)&lt;br /&gt;
		:done()&lt;br /&gt;
	&lt;br /&gt;
	return title_container&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Main entry point for sidebar with collapsible lists.&lt;br /&gt;
Does the work of creating the collapsible lists themselves and including them&lt;br /&gt;
into the args.&lt;br /&gt;
]]&lt;br /&gt;
function p.collapsible(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	if not args.name and&lt;br /&gt;
		frame:getParent():getTitle():gsub(cfg.i18n.pattern.collapse_sandbox, &#039;&#039;) ==&lt;br /&gt;
		cfg.i18n.collapse_title_not_to_add_navbar then&lt;br /&gt;
		args.navbar = cfg.i18n.navbar_none&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local contentArgs = {}&lt;br /&gt;
	&lt;br /&gt;
	local is_centered_list_titles = false&lt;br /&gt;
	if args[&#039;centered list titles&#039;] and args[&#039;centered list titles&#039;] ~= &#039;&#039; then&lt;br /&gt;
		is_centered_list_titles = true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local num = string.match(k, &#039;^list(%d+)$&#039;)&lt;br /&gt;
		if num then&lt;br /&gt;
			local expand = args.expanded and&lt;br /&gt;
				(args.expanded == &#039;all&#039; or args.expanded == args[&#039;list&#039; .. num .. &#039;name&#039;])&lt;br /&gt;
			local row = mw.html.create(&#039;div&#039;)&lt;br /&gt;
			row&lt;br /&gt;
				:addClass(cfg.i18n.class.list)&lt;br /&gt;
				:addClass(&#039;mw-collapsible&#039;)&lt;br /&gt;
				:addClass((not expand) and &#039;mw-collapsed&#039; or nil)&lt;br /&gt;
				:addClass(args[&#039;list&#039; .. num .. &#039;class&#039;])&lt;br /&gt;
				:cssText(args.listframestyle)&lt;br /&gt;
				:cssText(args[&#039;list&#039; .. num .. &#039;framestyle&#039;])&lt;br /&gt;
				:node(list_title(args, is_centered_list_titles, num))&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(cfg.i18n.class.list_content)&lt;br /&gt;
					:addClass(&#039;mw-collapsible-content&#039;)&lt;br /&gt;
					-- don&#039;t /need/ a listnumstyleclass because you can do&lt;br /&gt;
					-- .templatename .listnumclass .sidebar-list&lt;br /&gt;
					:addClass(args.listclass)&lt;br /&gt;
					:cssText(args.liststyle)&lt;br /&gt;
					:cssText(args[&#039;list&#039; .. num .. &#039;style&#039;])&lt;br /&gt;
					:wikitext(trimAndAddAutomaticNewline(args[&#039;list&#039; .. num]))&lt;br /&gt;
&lt;br /&gt;
			contentArgs[&#039;content&#039; .. num] = tostring(row)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs(contentArgs) do&lt;br /&gt;
		args[k] = v&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return p.sidebar(frame, args, cfg.i18n.class.collapse)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
	<entry>
		<id>https://atmospedia.org/index.php?title=Module:Unsubst&amp;diff=196</id>
		<title>Module:Unsubst</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Module:Unsubst&amp;diff=196"/>
		<updated>2024-07-03T18:32:42Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local checkType = require(&#039;libraryUtil&#039;).checkType&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local BODY_PARAM = &#039;$B&#039;&lt;br /&gt;
&lt;br /&gt;
local specialParams = {&lt;br /&gt;
	[&#039;$params&#039;] = &#039;parameter list&#039;,&lt;br /&gt;
	[&#039;$aliases&#039;] = &#039;parameter aliases&#039;,&lt;br /&gt;
	[&#039;$flags&#039;] = &#039;flags&#039;,&lt;br /&gt;
	[&#039;$B&#039;] = &#039;template content&#039;,&lt;br /&gt;
	[&#039;$template-name&#039;] = &#039;template invocation name override&#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame, body)&lt;br /&gt;
	-- If we are substing, this function returns a template invocation, and if&lt;br /&gt;
	-- not, it returns the template body. The template body can be specified in&lt;br /&gt;
	-- the body parameter, or in the template parameter defined in the&lt;br /&gt;
	-- BODY_PARAM variable. This function can be called from Lua or from&lt;br /&gt;
	-- #invoke.&lt;br /&gt;
&lt;br /&gt;
	-- Return the template body if we aren&#039;t substing.&lt;br /&gt;
	if not mw.isSubsting() then&lt;br /&gt;
		if body ~= nil then&lt;br /&gt;
			return body&lt;br /&gt;
		elseif frame.args[BODY_PARAM] ~= nil then&lt;br /&gt;
			return frame.args[BODY_PARAM]&lt;br /&gt;
		else&lt;br /&gt;
			error(string.format(&lt;br /&gt;
				&amp;quot;no template content specified (use parameter &#039;%s&#039; from #invoke)&amp;quot;,&lt;br /&gt;
				BODY_PARAM&lt;br /&gt;
			), 2)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Sanity check for the frame object.&lt;br /&gt;
	if type(frame) ~= &#039;table&#039;&lt;br /&gt;
		or type(frame.getParent) ~= &#039;function&#039;&lt;br /&gt;
		or not frame:getParent()&lt;br /&gt;
	then&lt;br /&gt;
		error(&lt;br /&gt;
			&amp;quot;argument #1 to &#039;main&#039; must be a frame object with a parent &amp;quot; ..&lt;br /&gt;
			&amp;quot;frame available&amp;quot;,&lt;br /&gt;
			2&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Find the invocation name.&lt;br /&gt;
	local mTemplateInvocation = require(&#039;Module:Template invocation&#039;)&lt;br /&gt;
	local name&lt;br /&gt;
&lt;br /&gt;
	if frame.args[&#039;$template-name&#039;] and &#039;&#039; ~= frame.args[&#039;$template-name&#039;] then&lt;br /&gt;
		name = frame.args[&#039;$template-name&#039;]										-- override whatever the template name is with this name&lt;br /&gt;
	else&lt;br /&gt;
		name = mTemplateInvocation.name(frame:getParent():getTitle())&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Combine passed args with passed defaults&lt;br /&gt;
	local args = {}&lt;br /&gt;
	if string.find( &#039;,&#039;..(frame.args[&#039;$flags&#039;] or &#039;&#039;)..&#039;,&#039;, &#039;,%s*override%s*,&#039; ) then&lt;br /&gt;
		for k, v in pairs( frame:getParent().args ) do&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
		for k, v in pairs( frame.args ) do&lt;br /&gt;
			if not specialParams[k] then&lt;br /&gt;
				if v == &#039;__DATE__&#039; then&lt;br /&gt;
					v = mw.getContentLanguage():formatDate( &#039;F Y&#039; )&lt;br /&gt;
				end&lt;br /&gt;
				args[k] = v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		for k, v in pairs( frame.args ) do&lt;br /&gt;
			if not specialParams[k] then&lt;br /&gt;
				if v == &#039;__DATE__&#039; then&lt;br /&gt;
					v = mw.getContentLanguage():formatDate( &#039;F Y&#039; )&lt;br /&gt;
				end&lt;br /&gt;
				args[k] = v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for k, v in pairs( frame:getParent().args ) do&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Trim parameters, if not specified otherwise&lt;br /&gt;
	if not string.find( &#039;,&#039;..(frame.args[&#039;$flags&#039;] or &#039;&#039;)..&#039;,&#039;, &#039;,%s*keep%-whitespace%s*,&#039; ) then&lt;br /&gt;
		for k, v in pairs( args ) do args[k] = mw.ustring.match(v, &#039;^%s*(.*)%s*$&#039;) or &#039;&#039; end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Pull information from parameter aliases&lt;br /&gt;
	local aliases = {}&lt;br /&gt;
	if frame.args[&#039;$aliases&#039;] then&lt;br /&gt;
		local list = mw.text.split( frame.args[&#039;$aliases&#039;], &#039;%s*,%s*&#039; )&lt;br /&gt;
		for k, v in ipairs( list ) do&lt;br /&gt;
			local tmp = mw.text.split( v, &#039;%s*&amp;gt;%s*&#039; )&lt;br /&gt;
			aliases[tonumber(mw.ustring.match(tmp[1], &#039;^[1-9][0-9]*$&#039;)) or tmp[1]] = ((tonumber(mw.ustring.match(tmp[2], &#039;^[1-9][0-9]*$&#039;))) or tmp[2])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs( aliases ) do&lt;br /&gt;
		if args[k] and ( not args[v] or args[v] == &#039;&#039; ) then&lt;br /&gt;
			args[v] = args[k]&lt;br /&gt;
		end&lt;br /&gt;
		args[k] = nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Remove empty parameters, if specified&lt;br /&gt;
	if string.find( &#039;,&#039;..(frame.args[&#039;$flags&#039;] or &#039;&#039;)..&#039;,&#039;, &#039;,%s*remove%-empty%s*,&#039; ) then&lt;br /&gt;
		local tmp = 0&lt;br /&gt;
		for k, v in ipairs( args ) do&lt;br /&gt;
			if v ~= &#039;&#039; or ( args[k+1] and args[k+1] ~= &#039;&#039; ) or ( args[k+2] and args[k+2] ~= &#039;&#039; ) then&lt;br /&gt;
				tmp = k&lt;br /&gt;
			else&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for k, v in pairs( args ) do&lt;br /&gt;
			if v == &#039;&#039; then&lt;br /&gt;
				if not (type(k) == &#039;number&#039; and k &amp;lt; tmp) then args[k] = nil end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Order parameters&lt;br /&gt;
	if frame.args[&#039;$params&#039;] then&lt;br /&gt;
		local params, tmp = mw.text.split( frame.args[&#039;$params&#039;], &#039;%s*,%s*&#039; ), {}&lt;br /&gt;
		for k, v in ipairs(params) do&lt;br /&gt;
			v = tonumber(mw.ustring.match(v, &#039;^[1-9][0-9]*$&#039;)) or v&lt;br /&gt;
			if args[v] then tmp[v], args[v] = args[v], nil end&lt;br /&gt;
		end&lt;br /&gt;
		for k, v in pairs(args) do tmp[k], args[k] = args[k], nil end&lt;br /&gt;
		args = tmp&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return mTemplateInvocation.invocation(name, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;&#039;] = p.main -- For backwards compatibility&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
	<entry>
		<id>https://atmospedia.org/index.php?title=Module:Hatnote&amp;diff=194</id>
		<title>Module:Hatnote</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Module:Hatnote&amp;diff=194"/>
		<updated>2024-07-03T18:32:42Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--                              Module:Hatnote                                --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- This module produces hatnote links and links to related articles. It       --&lt;br /&gt;
-- implements the {{hatnote}} and {{format link}} meta-templates and includes --&lt;br /&gt;
-- helper functions for other Lua hatnote modules.                            --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&#039;libraryUtil&#039;)&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg&lt;br /&gt;
local mArguments -- lazily initialise [[Module:Arguments]]&lt;br /&gt;
local yesno -- lazily initialise [[Module:Yesno]]&lt;br /&gt;
local formatLink -- lazily initialise [[Module:Format link]] ._formatLink&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function getArgs(frame)&lt;br /&gt;
	-- Fetches the arguments from the parent frame. Whitespace is trimmed and&lt;br /&gt;
	-- blanks are removed.&lt;br /&gt;
	mArguments = require(&#039;Module:Arguments&#039;)&lt;br /&gt;
	return mArguments.getArgs(frame, {parentOnly = true})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function removeInitialColon(s)&lt;br /&gt;
	-- Removes the initial colon from a string, if present.&lt;br /&gt;
	return s:match(&#039;^:?(.*)&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.defaultClasses(inline)&lt;br /&gt;
	-- Provides the default hatnote classes as a space-separated string; useful&lt;br /&gt;
	-- for hatnote-manipulation modules like [[Module:Hatnote group]].&lt;br /&gt;
	return&lt;br /&gt;
		(inline == 1 and &#039;hatnote-inline&#039; or &#039;hatnote&#039;) .. &#039; &#039; ..&lt;br /&gt;
		&#039;navigation-not-searchable&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.disambiguate(page, disambiguator)&lt;br /&gt;
	-- Formats a page title with a disambiguation parenthetical,&lt;br /&gt;
	-- i.e. &amp;quot;Example&amp;quot; → &amp;quot;Example (disambiguation)&amp;quot;.&lt;br /&gt;
	checkType(&#039;disambiguate&#039;, 1, page, &#039;string&#039;)&lt;br /&gt;
	checkType(&#039;disambiguate&#039;, 2, disambiguator, &#039;string&#039;, true)&lt;br /&gt;
	disambiguator = disambiguator or &#039;disambiguation&#039;&lt;br /&gt;
	return mw.ustring.format(&#039;%s (%s)&#039;, page, disambiguator)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.findNamespaceId(link, removeColon)&lt;br /&gt;
	-- Finds the namespace id (namespace number) of a link or a pagename. This&lt;br /&gt;
	-- function will not work if the link is enclosed in double brackets. Colons&lt;br /&gt;
	-- are trimmed from the start of the link by default. To skip colon&lt;br /&gt;
	-- trimming, set the removeColon parameter to false.&lt;br /&gt;
	checkType(&#039;findNamespaceId&#039;, 1, link, &#039;string&#039;)&lt;br /&gt;
	checkType(&#039;findNamespaceId&#039;, 2, removeColon, &#039;boolean&#039;, true)&lt;br /&gt;
	if removeColon ~= false then&lt;br /&gt;
		link = removeInitialColon(link)&lt;br /&gt;
	end&lt;br /&gt;
	local namespace = link:match(&#039;^(.-):&#039;)&lt;br /&gt;
	if namespace then&lt;br /&gt;
		local nsTable = mw.site.namespaces[namespace]&lt;br /&gt;
		if nsTable then&lt;br /&gt;
			return nsTable.id&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeWikitextError(msg, helpLink, addTrackingCategory, title)&lt;br /&gt;
	-- Formats an error message to be returned to wikitext. If&lt;br /&gt;
	-- addTrackingCategory is not false after being returned from&lt;br /&gt;
	-- [[Module:Yesno]], and if we are not on a talk page, a tracking category&lt;br /&gt;
	-- is added.&lt;br /&gt;
	checkType(&#039;makeWikitextError&#039;, 1, msg, &#039;string&#039;)&lt;br /&gt;
	checkType(&#039;makeWikitextError&#039;, 2, helpLink, &#039;string&#039;, true)&lt;br /&gt;
	yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
	title = title or mw.title.getCurrentTitle()&lt;br /&gt;
	-- Make the help link text.&lt;br /&gt;
	local helpText&lt;br /&gt;
	if helpLink then&lt;br /&gt;
		helpText = &#039; ([[&#039; .. helpLink .. &#039;|help]])&#039;&lt;br /&gt;
	else&lt;br /&gt;
		helpText = &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	-- Make the category text.&lt;br /&gt;
	local category&lt;br /&gt;
	if not title.isTalkPage -- Don&#039;t categorise talk pages&lt;br /&gt;
		and title.namespace ~= 2 -- Don&#039;t categorise userspace&lt;br /&gt;
		and yesno(addTrackingCategory) ~= false -- Allow opting out&lt;br /&gt;
	then&lt;br /&gt;
		category = &#039;Hatnote templates with errors&#039;&lt;br /&gt;
		category = mw.ustring.format(&lt;br /&gt;
			&#039;[[%s:%s]]&#039;,&lt;br /&gt;
			mw.site.namespaces[14].name,&lt;br /&gt;
			category&lt;br /&gt;
		)&lt;br /&gt;
	else&lt;br /&gt;
		category = &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return mw.ustring.format(&lt;br /&gt;
		&#039;&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;Error: %s%s.&amp;lt;/strong&amp;gt;%s&#039;,&lt;br /&gt;
		msg,&lt;br /&gt;
		helpText,&lt;br /&gt;
		category&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local curNs = mw.title.getCurrentTitle().namespace&lt;br /&gt;
p.missingTargetCat =&lt;br /&gt;
	--Default missing target category, exported for use in related modules&lt;br /&gt;
	((curNs ==  0) or (curNs == 14)) and&lt;br /&gt;
	&#039;Articles with hatnote templates targeting a nonexistent page&#039; or nil&lt;br /&gt;
&lt;br /&gt;
function p.quote(title)&lt;br /&gt;
	--Wraps titles in quotation marks. If the title starts/ends with a quotation&lt;br /&gt;
	--mark, kerns that side as with {{-&#039;}}&lt;br /&gt;
	local quotationMarks = {&lt;br /&gt;
		[&amp;quot;&#039;&amp;quot;]=true, [&#039;&amp;quot;&#039;]=true, [&#039;“&#039;]=true, [&amp;quot;‘&amp;quot;]=true, [&#039;”&#039;]=true, [&amp;quot;’&amp;quot;]=true&lt;br /&gt;
	}&lt;br /&gt;
	local quoteLeft, quoteRight = -- Test if start/end are quotation marks&lt;br /&gt;
		quotationMarks[string.sub(title,  1,  1)],&lt;br /&gt;
		quotationMarks[string.sub(title, -1, -1)]&lt;br /&gt;
	if quoteLeft or quoteRight then&lt;br /&gt;
		title = mw.html.create(&amp;quot;span&amp;quot;):wikitext(title)&lt;br /&gt;
	end&lt;br /&gt;
	if quoteLeft  then title:css(&amp;quot;padding-left&amp;quot;,  &amp;quot;0.15em&amp;quot;) end&lt;br /&gt;
	if quoteRight then title:css(&amp;quot;padding-right&amp;quot;, &amp;quot;0.15em&amp;quot;) end&lt;br /&gt;
	return &#039;&amp;quot;&#039; .. tostring(title) .. &#039;&amp;quot;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Hatnote&lt;br /&gt;
--&lt;br /&gt;
-- Produces standard hatnote text. Implements the {{hatnote}} template.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.hatnote(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	local s = args[1]&lt;br /&gt;
	if not s then&lt;br /&gt;
		return p.makeWikitextError(&lt;br /&gt;
			&#039;no text specified&#039;,&lt;br /&gt;
			&#039;Template:Hatnote#Errors&#039;,&lt;br /&gt;
			args.category&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	return p._hatnote(s, {&lt;br /&gt;
		extraclasses = args.extraclasses,&lt;br /&gt;
		selfref = args.selfref&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._hatnote(s, options)&lt;br /&gt;
	checkType(&#039;_hatnote&#039;, 1, s, &#039;string&#039;)&lt;br /&gt;
	checkType(&#039;_hatnote&#039;, 2, options, &#039;table&#039;, true)&lt;br /&gt;
	options = options or {}&lt;br /&gt;
	local inline = options.inline&lt;br /&gt;
	local hatnote = mw.html.create(inline == 1 and &#039;span&#039; or &#039;div&#039;)&lt;br /&gt;
	local extraclasses&lt;br /&gt;
	if type(options.extraclasses) == &#039;string&#039; then&lt;br /&gt;
		extraclasses = options.extraclasses&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	hatnote&lt;br /&gt;
		:attr(&#039;role&#039;, &#039;note&#039;)&lt;br /&gt;
		:addClass(p.defaultClasses(inline))&lt;br /&gt;
		:addClass(extraclasses)&lt;br /&gt;
		:addClass(options.selfref and &#039;selfref&#039; or nil)&lt;br /&gt;
		:wikitext(s)&lt;br /&gt;
&lt;br /&gt;
	return mw.getCurrentFrame():extensionTag{&lt;br /&gt;
		name = &#039;templatestyles&#039;, args = { src = &#039;Module:Hatnote/styles.css&#039; }&lt;br /&gt;
	} .. tostring(hatnote)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
	<entry>
		<id>https://atmospedia.org/index.php?title=Module:Citation&amp;diff=192</id>
		<title>Module:Citation</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Module:Citation&amp;diff=192"/>
		<updated>2024-07-03T18:32:42Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;error(&#039;This module is retained for historical and structural reasons; consider using [[Module:Citation/CS1]].&#039;)&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
	<entry>
		<id>https://atmospedia.org/index.php?title=Template:Infobox/doc&amp;diff=190</id>
		<title>Template:Infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Template:Infobox/doc&amp;diff=190"/>
		<updated>2024-07-03T18:32:42Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Documentation subpage}}&lt;br /&gt;
&amp;lt;!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --&amp;gt;&lt;br /&gt;
{{Distinguish|Template:Userbox}}&lt;br /&gt;
{{#ifeq:{{SUBPAGENAME}}|sandbox||{{High-use}}}}&lt;br /&gt;
{{Lua|Module:Infobox}}&lt;br /&gt;
{{Parameter names example&lt;br /&gt;
 |name={{PAGENAME}} &amp;lt;!--|child |subbox |decat--&amp;gt; |title |above |subheader |subheader1 |subheader2={{{subheader2}}}&amp;lt;br/&amp;gt;......&lt;br /&gt;
 |image|caption |image1|caption1 |image2|caption2={{{caption2}}}&amp;lt;br/&amp;gt;......&lt;br /&gt;
 |header1=&amp;lt;div style=&amp;quot;border-top:1px dashed #ccc;&amp;quot;&amp;gt;{{{header1}}}&amp;lt;br/&amp;gt;{{nobold|( &#039;&#039;or&#039;&#039; )}}&amp;lt;/div&amp;gt;&lt;br /&gt;
 |label2={{{label1}}} |data2={{{data1}}}&lt;br /&gt;
 |data3=( &#039;&#039;or&#039;&#039; )&amp;lt;br/&amp;gt;&amp;lt;div style=&amp;quot;padding-bottom:0.25em;border-bottom:1px dashed #ccc;&amp;quot;&amp;gt;{{{data1}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
 |header5={{{header2}}}&amp;lt;br/&amp;gt;&amp;lt;div style=&amp;quot;padding:0.75em 0 0.5em;&amp;quot;&amp;gt;{{nobold|( &#039;&#039;or&#039;&#039; )}}&amp;lt;/div&amp;gt;&lt;br /&gt;
 |label6={{{label2}}} |data6={{{data2}}}&lt;br /&gt;
 |data7=( &#039;&#039;or&#039;&#039; )&amp;lt;br/&amp;gt;&amp;lt;div style=&amp;quot;padding-bottom:0.25em;border-bottom:1px dashed #ccc;&amp;quot;&amp;gt;{{{data2}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
 |data9=&amp;lt;div style=&amp;quot;padding:0.75em 0 0.5em;&amp;quot;&amp;gt;( &#039;&#039;etc&#039;&#039; )&amp;lt;/div&amp;gt;&lt;br /&gt;
 |below&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[[Template:Infobox]]&#039;&#039;&#039; is intended as a meta template: a template used for constructing other templates. &#039;&#039;&#039;Note&#039;&#039;&#039;: In general, it is not meant for use directly in an article, but can be used on a one-off basis if required. [[Help:Infobox]] contains an introduction about the recommended content and design of infoboxes; [[Wikipedia:Manual of Style/Infoboxes]] contains additional style guidelines. See [[WP:List of infoboxes]] and [[:Category:Infobox templates]] for lists of prepared topic-specific infoboxes.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
{{tlf|Infobox}} is a meta-template: used to organise an actual &amp;lt;nowiki&amp;gt;{{Infobox sometopic}}&amp;lt;/nowiki&amp;gt; template (like {{tl|Infobox building}}). &lt;br /&gt;
&lt;br /&gt;
For &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[Template:Infobox sometopic]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, template code then looks like this, simplified:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot;&amp;gt;&lt;br /&gt;
{{Infobox&lt;br /&gt;
| name     = {{{name|{{PAGENAME}}}}}&lt;br /&gt;
| image    = {{{image|}}}&lt;br /&gt;
| caption1 = {{{caption|}}}&lt;br /&gt;
&lt;br /&gt;
| label1   = Former names&lt;br /&gt;
|  data1   = {{{former_names|}}}&lt;br /&gt;
&lt;br /&gt;
| header2  = General information&lt;br /&gt;
&lt;br /&gt;
| label3   = Status&lt;br /&gt;
|  data3   = {{{status|}}}&lt;br /&gt;
... &amp;lt;!-- etc. --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optional control parameters ==&lt;br /&gt;
; name : If this parameter is present, &amp;quot;view, talk and edit&amp;quot; links will be added to the bottom of the infobox pointing to the named page, prefixed by &amp;lt;code&amp;gt;Template:&amp;lt;/code&amp;gt; if no namespace is specified. You may use the value &amp;lt;nowiki&amp;gt;{{subst:PAGENAME}}&amp;lt;/nowiki&amp;gt;; however, this is rarely what you want because it will send users clicking these links in an infobox to the template code rather than the data in the infobox they probably want to change.&lt;br /&gt;
; child :  See the [[#Embedding|Embedding]] section for details. If this is set to &amp;quot;yes&amp;quot;, this child infobox should be titled but have no name parameter. This parameter is empty by default, set it to &amp;quot;yes&amp;quot; to activate it.&lt;br /&gt;
; subbox :  See the [[#Subboxes|Subboxes]] section for details. If this is set to &amp;quot;yes&amp;quot;, this subbox should be titled but have no name parameter. This parameter is empty by default, set to &amp;quot;yes&amp;quot; to activate it. It has no effect if the {{para|child}} parameter is also set to &amp;quot;yes&amp;quot;.&lt;br /&gt;
; decat : If this is set to &amp;quot;yes&amp;quot;, the current page will not be autocategorized in a maintenance category when the generated infobox has some problems or no visible data section. Leave empty by default or set to &amp;quot;yes&amp;quot; to activate it.&lt;br /&gt;
; autoheaders: If this is set to any non-blank value, headers which are not followed by data fields are suppressed.  See the &amp;quot;[[#Hiding headers when all its data fields are empty|hiding headers when all its data fields are empty]]&amp;quot; section for more details.&lt;br /&gt;
&lt;br /&gt;
== Content parameters ==&lt;br /&gt;
&lt;br /&gt;
=== Title ===&lt;br /&gt;
There are two different ways to put a title on an infobox. One contains the title inside the infobox&#039;s border in the uppermost cell of the table, the other puts it as a caption on top of the table. You can use them both together, or just one or the other, or neither (though this is not recommended):&lt;br /&gt;
&lt;br /&gt;
; title : Text to put in the caption over the top of the table (or as section header before the whole content of this table, if this is a child infobox). For [[Wikipedia:Manual of Style/Accessibility#Tables|accessibility reasons]], this is the most recommended alternative.&lt;br /&gt;
; above : Text to put within the uppermost cell of the table.&lt;br /&gt;
; subheader(n) : additional title fields which fit below {{para|title}}} and {{para|above}}}, but before images.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
{{Infobox&lt;br /&gt;
 | name       = Infobox/doc&lt;br /&gt;
 | title      = Text in caption over infobox&lt;br /&gt;
 | subheader  = Subheader of the infobox&lt;br /&gt;
 | header     = (the rest of the infobox goes here)&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{Infobox&lt;br /&gt;
 | name       = {{subst:PAGENAME}}&lt;br /&gt;
 | title      = Text in caption over infobox&lt;br /&gt;
 | subheader  = Subheader of the infobox&lt;br /&gt;
 | header     = (the rest of the infobox goes here)&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Infobox&lt;br /&gt;
 | name       = Infobox/doc&lt;br /&gt;
 | above      = Text in uppermost cell of infobox&lt;br /&gt;
 | subheader  = Subheader of the infobox&lt;br /&gt;
 | subheader2 = Second subheader of the infobox&lt;br /&gt;
 | header     = (the rest of the infobox goes here)&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{Infobox&lt;br /&gt;
 | name       = {{subst:PAGENAME}}&lt;br /&gt;
 | above      = Text in uppermost cell of infobox&lt;br /&gt;
 | subheader  = Subheader of the infobox&lt;br /&gt;
 | subheader2 = Second subheader of the infobox&lt;br /&gt;
 | header     = (the rest of the infobox goes here)&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
=== Illustration images ===&lt;br /&gt;
; image(n) : images to display at the top of the template. Use full image syntax, for example &amp;lt;nowiki&amp;gt;[[File:example.png|200px|alt=Example alt text]]&amp;lt;/nowiki&amp;gt;. Image is centered by default. See [[WP:ALT]] for more on alt text.&lt;br /&gt;
; caption(n) : Text to put underneath the images.&lt;br /&gt;
&lt;br /&gt;
=== Main data ===&lt;br /&gt;
; header(n) : Text to use as a header in row n.&lt;br /&gt;
; label(n) : Text to use as a label in row n.&lt;br /&gt;
; data(n) : Text to display as data in row n.&lt;br /&gt;
&lt;br /&gt;
Note: for any given value for (n), not all combinations of parameters are permitted. The presence of a {{para|header&#039;&#039;(n)&#039;&#039;}} will cause the corresponding {{para|data&#039;&#039;(n)&#039;&#039;}} (and {{para|rowclass&#039;&#039;(n)&#039;&#039;}} {{para|label&#039;&#039;(n)&#039;&#039;}}, see below) to be ignored; the absence of a {{para|data&#039;&#039;(n)&#039;&#039;}} will cause the corresponding {{para|label&#039;&#039;(n)&#039;&#039;}} to be ignored. Valid combinations for any single row are:&lt;br /&gt;
&lt;br /&gt;
* {{para|class&#039;&#039;(n)&#039;&#039;}} {{para|header&#039;&#039;(n)&#039;&#039;}}&lt;br /&gt;
* {{para|rowclass&#039;&#039;(n)&#039;&#039;}} {{para|class&#039;&#039;(n)&#039;&#039;}} {{para|data&#039;&#039;(n)&#039;&#039;}}&lt;br /&gt;
* {{para|rowclass&#039;&#039;(n)&#039;&#039;}} {{para|label&#039;&#039;(n)&#039;&#039;}} {{para|class&#039;&#039;(n)&#039;&#039;}} {{para|data&#039;&#039;(n)&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
See the rendering of header4, label4, and data4 in the [[#Examples|Examples]] section below.&lt;br /&gt;
&lt;br /&gt;
==== Number ranges ====&lt;br /&gt;
To allow flexibility when the layout of an infobox is changed, it may be helpful when developing an infobox to use non-contiguous numbers for header and label/data rows. Parameters for new rows can then be inserted in future without having to renumber existing parameters. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
 | header3  = Section 1&lt;br /&gt;
 |  label5  = Label A&lt;br /&gt;
 |   data5  = Data A&lt;br /&gt;
 |  label7  = Label C&lt;br /&gt;
 |   data7  = Data C&lt;br /&gt;
 | header10 = Section 2&lt;br /&gt;
 |  label12 = Label D&lt;br /&gt;
 |   data12 = Data D&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
It is also possible to automatically renumber parameter names by using [[User:Frietjes/infoboxgap.js]] or [[Module:IncrementParams]].&lt;br /&gt;
&lt;br /&gt;
There is no upper limit on numbers but there must be at most 50 between each used number.&lt;br /&gt;
&lt;br /&gt;
==== Making data fields optional ====&lt;br /&gt;
A row with a label but no data is not displayed. This allows for the easy creation of optional infobox content rows. To make a row optional use a parameter that defaults to an empty string, like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
 | label5 = Population&lt;br /&gt;
 |  data5 = {{{population|}}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
This way if an article doesn&#039;t define the population parameter in its infobox the row won&#039;t be displayed.&lt;br /&gt;
&lt;br /&gt;
For more complex fields with pre-formatted contents that would still be present even if the parameter wasn&#039;t set, you can wrap it all in an &amp;quot;#if&amp;quot; statement to make the whole thing vanish when the parameter is not used. For instance, the &amp;quot;#if&amp;quot; statement in the following example reads &amp;quot;#if:the parameter &#039;&#039;mass&#039;&#039; has been supplied |then display it, followed by &#039;kg&#039;&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
 | label6 = Mass&lt;br /&gt;
 |  data6 = {{ #if: {{{mass|}}} | {{{mass}}} kg }}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
For more on #if, see [[meta:ParserFunctions##if:|here]].&lt;br /&gt;
&lt;br /&gt;
==== Hiding headers when all its data fields are empty ====&lt;br /&gt;
You can also make headers automatically hide when their section is empty (has no data-row showing).&lt;br /&gt;
&lt;br /&gt;
Consider this situation:&lt;br /&gt;
{{Infobox&lt;br /&gt;
 | title   = Example: header with &amp;amp; without data&lt;br /&gt;
 | headerstyle = background: lightgrey&lt;br /&gt;
&lt;br /&gt;
 | header1 = Header1 with empty section&lt;br /&gt;
 |  label2 = label2 text |  data2 =&lt;br /&gt;
 |  label3 = label3 text |  data3 =&lt;br /&gt;
 |  label4 = label4 text |  data4 =&lt;br /&gt;
&lt;br /&gt;
 | header5 = Header5 with data below&lt;br /&gt;
 |  label6 = label6 text |  data6 = Some value&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{Infobox&lt;br /&gt;
 | title   = Example: header with &amp;amp; without data&lt;br /&gt;
 | headerstyle = background: lightgrey&lt;br /&gt;
&lt;br /&gt;
 | header1 = Header1 with empty section&lt;br /&gt;
 |  label2 = label2 text |  data2 =&lt;br /&gt;
 |  label3 = label3 text |  data3 =&lt;br /&gt;
 |  label4 = label4 text |  data4 =&lt;br /&gt;
&lt;br /&gt;
 | header5 = Header5 with data below&lt;br /&gt;
 |  label6 = label6 text |   data6 = Some value&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
If you want hide the header when no {{para|data&#039;&#039;N&#039;&#039;}} values are present, use {{para|autoheaders|y}}:&lt;br /&gt;
&lt;br /&gt;
{{Infobox&lt;br /&gt;
 | title   = Example: header with &amp;amp; without data&lt;br /&gt;
 | autoheaders = y&lt;br /&gt;
 | headerstyle = background: lightgrey&lt;br /&gt;
&lt;br /&gt;
 | header1 = Header1 with empty section&lt;br /&gt;
 |  label2 = label2 text |  data2 =&lt;br /&gt;
 |  label3 = label3 text |  data3 =&lt;br /&gt;
 |  label4 = label4 text |  data4 =&lt;br /&gt;
&lt;br /&gt;
 | header5 = Header5 with data below&lt;br /&gt;
 |  label6 = label6 text |  data6 = Some value&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{Infobox&lt;br /&gt;
 | title   = Example: header with &amp;amp; without data&lt;br /&gt;
 | autoheaders = y&lt;br /&gt;
 | headerstyle = background: lightgrey&lt;br /&gt;
&lt;br /&gt;
 | header1 = Header1 with empty section&lt;br /&gt;
 |  label2 = label2 text |  data2 =&lt;br /&gt;
 |  label3 = label3 text |  data3 =&lt;br /&gt;
 |  label4 = label4 text |  data4 =&lt;br /&gt;
&lt;br /&gt;
 | header5 = Header5 with data below&lt;br /&gt;
 |  label6 = label6 text |  data6 = Some value&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
So, header1 will be shown if any of item1, item2, or item3 is defined. If none of the three parameters are defined the header won&#039;t be shown and no empty row appears before the next visible content.&lt;br /&gt;
&lt;br /&gt;
Note: if the data has empty css elements, like {{para|data|2=&amp;amp;lt;span style=&amp;quot;background:yellow;&amp;quot;&amp;gt;&amp;amp;lt;/span&amp;gt;}}, this will be treated as non-empty (having data).&lt;br /&gt;
&lt;br /&gt;
If {{para|autoheaders|y}} but there are items that you {{em|do not}} want to trigger a header, place {{para|headerX|_BLANK_}}. This will serve as an empty header and separate it from the subsequent items.&lt;br /&gt;
&lt;br /&gt;
{{Infobox&lt;br /&gt;
 | title   = Example: blank header with &amp;amp; without data&lt;br /&gt;
 | autoheaders = y&lt;br /&gt;
 | headerstyle = background: lightgrey&lt;br /&gt;
&lt;br /&gt;
 | header1 = Header1 with empty section&lt;br /&gt;
 |  label2 = label2 text |  data2 =&lt;br /&gt;
 |  label3 = label3 text |  data3 =&lt;br /&gt;
 |  label4 = label4 text |  data4 =&lt;br /&gt;
&lt;br /&gt;
 | header5 = _BLANK_&lt;br /&gt;
 |  label6 = label6 text |  data6 = Some value, but does not trigger header1 or show header5&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{Infobox&lt;br /&gt;
 | title   = Example: blank header with &amp;amp; without data&lt;br /&gt;
 | autoheaders = y&lt;br /&gt;
 | headerstyle = background: lightgrey&lt;br /&gt;
&lt;br /&gt;
 | header1 = Header1 with empty section&lt;br /&gt;
 |  label2 = label2 text |  data2 =&lt;br /&gt;
 |  label3 = label3 text |  data3 =&lt;br /&gt;
 |  label4 = label4 text |  data4 =&lt;br /&gt;
&lt;br /&gt;
 | header5 = _BLANK_&lt;br /&gt;
 |  label6 = label6 text |  data6 = Some value, but does not trigger header1 or show header5&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
=== Footer ===&lt;br /&gt;
; below : Text to put in the bottom cell. The bottom cell is intended for footnotes, see-also, and other such information.&lt;br /&gt;
&lt;br /&gt;
== Presentation parameters ==&lt;br /&gt;
&lt;br /&gt;
=== Italic titles ===&lt;br /&gt;
Titles of articles with infoboxes may be made italic, in line with [[WP:ITALICTITLE]], by passing the &amp;lt;code&amp;gt;italic title&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
* Turn on italic titles by passing {{para|italic title|&amp;lt;nowiki&amp;gt;{{{italic title|}}}&amp;lt;/nowiki&amp;gt;}} from the infobox.&lt;br /&gt;
* Turn off by default (notably because only Latin script may be safely rendered in this style and italic may be needed to distinguish foreign language from local English language only in that script, but would be difficult to read for other scripts) but allow some instances to be made italic by passing {{para|italic title|&amp;lt;nowiki&amp;gt;{{{italic title|no}}}&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
* Do not make any titles italic by not passing the parameter at all.&lt;br /&gt;
&lt;br /&gt;
=== CSS styling ===&lt;br /&gt;
{{div col}}&lt;br /&gt;
; bodystyle : Applies to the infobox table as a whole&lt;br /&gt;
; titlestyle : Applies only to the title caption. Adding a background color is usually inadvisable since the text is rendered &amp;quot;outside&amp;quot; the infobox.&lt;br /&gt;
; abovestyle : Applies only to the &amp;quot;above&amp;quot; cell at the top. The default style has font-size:125%; since this cell is usually used for a title, if you want to use the above cell for regular-sized text include &amp;quot;font-size:100%;&amp;quot; in the abovestyle.&lt;br /&gt;
; imagestyle : Applies to the cell the image is in. This includes the text of the image caption, but you should set text properties with captionstyle instead of imagestyle in case the caption is moved out of this cell in the future.&lt;br /&gt;
; captionstyle : Applies to the text of the image caption.&lt;br /&gt;
; rowstyle(n) : This parameter is inserted into the &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; attribute for the specified row.&lt;br /&gt;
; headerstyle : Applies to all header cells&lt;br /&gt;
; subheaderstyle : Applies to all subheader cells&lt;br /&gt;
; labelstyle : Applies to all label cells&lt;br /&gt;
; datastyle : Applies to all data cells&lt;br /&gt;
; belowstyle : Applies only to the below cell&lt;br /&gt;
{{div col end}}&lt;br /&gt;
&lt;br /&gt;
=== HTML classes and microformats ===&lt;br /&gt;
{{div col}}&lt;br /&gt;
; bodyclass : This parameter is inserted into the &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; attribute for the infobox as a whole.&lt;br /&gt;
; titleclass : This parameter is inserted into the &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; attribute for the infobox&#039;s &#039;&#039;&#039;title&#039;&#039;&#039; caption.&lt;br /&gt;
&amp;lt;!-- currently not implemented in Lua module&lt;br /&gt;
; aboverowclass : This parameter is inserted into the &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; attribute for the complete table row the &#039;&#039;&#039;above&#039;&#039;&#039; cell is on.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
; aboveclass : This parameter is inserted into the &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; attribute for the infobox&#039;s &#039;&#039;&#039;above&#039;&#039;&#039; cell.&lt;br /&gt;
; subheaderrowclass(n) : This parameter is inserted into the &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; attribute for the complete table row the &#039;&#039;&#039;subheader&#039;&#039;&#039; is on.&lt;br /&gt;
; subheaderclass(n) : This parameter is inserted into the &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; attribute for the infobox&#039;s &#039;&#039;&#039;subheader&#039;&#039;&#039;.&lt;br /&gt;
; imagerowclass(n) : These parameters are inserted into the &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; attribute for the complete table row their respective &#039;&#039;&#039;image&#039;&#039;&#039; is on.&lt;br /&gt;
; imageclass : This parameter is inserted into the &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; attribute for the &#039;&#039;&#039;image&#039;&#039;&#039;.&lt;br /&gt;
; rowclass(n) : This parameter is inserted into the &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; attribute for the specified row including the &#039;&#039;&#039;label&#039;&#039;&#039; and &#039;&#039;&#039;data&#039;&#039;&#039; cells.&lt;br /&gt;
; class(n) : This parameter is inserted into the &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; attribute for the &#039;&#039;&#039;data&#039;&#039;&#039; cell of the specified row. If there&#039;s no &#039;&#039;&#039;data&#039;&#039;&#039; cell it has no effect.&lt;br /&gt;
&amp;lt;!-- currently not implemented in Lua module&lt;br /&gt;
; belowrowclass : This parameter is inserted into the &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; attribute for the complete table row the &#039;&#039;&#039;below&#039;&#039;&#039; cell is on.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
; belowclass : This parameter is inserted into the &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; attribute for the infobox&#039;s &#039;&#039;&#039;below&#039;&#039;&#039; cell.&lt;br /&gt;
{{div col end}}&lt;br /&gt;
&lt;br /&gt;
This template supports the addition of microformat information. This is done by adding &amp;quot;class&amp;quot; attributes to various data cells, indicating what kind of information is contained within. Multiple class names may be specified, separated by spaces, some of them being used as selectors for custom styling according to a project policy or to the skin selected in user preferences, others being used for microformats.&lt;br /&gt;
&lt;br /&gt;
To flag an infobox as containing [[hCard]] information, for example, add the following parameter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
 | bodyclass = vcard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
And for each row containing a data cell that&#039;s part of the vcard, add a corresponding class parameter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
 | class1 = fn&lt;br /&gt;
 | class2 = org&lt;br /&gt;
 | class3 = tel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
...and so forth. &amp;quot;above&amp;quot; and &amp;quot;title&amp;quot; can also be given classes, since these are usually used to display the name of the subject of the infobox.&lt;br /&gt;
&lt;br /&gt;
See [[Wikipedia:WikiProject Microformats]] for more information on adding microformat information to Wikipedia, and [[microformat]] for more information on microformats in general.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Notice how the row doesn&#039;t appear in the displayed infobox when a &#039;&#039;&#039;label&#039;&#039;&#039; is defined without an accompanying &#039;&#039;&#039;data&#039;&#039;&#039; cell, and how all of them are displayed when a &#039;&#039;&#039;header&#039;&#039;&#039; is defined on the same row as a &#039;&#039;&#039;data&#039;&#039;&#039; cell. Also notice that &#039;&#039;&#039;subheaders&#039;&#039;&#039; are not bold by default like the &#039;&#039;&#039;headers&#039;&#039;&#039; used to split the main data section, because this role is meant to be for the &#039;&#039;&#039;above&#039;&#039;&#039; cell :&lt;br /&gt;
{{Suppress categories|&lt;br /&gt;
{{Infobox&lt;br /&gt;
 |name         = Infobox/doc&lt;br /&gt;
 |bodystyle    = &lt;br /&gt;
&lt;br /&gt;
 |titlestyle   = &lt;br /&gt;
 |abovestyle   = background: #cfc;&lt;br /&gt;
 |subheaderstyle =&lt;br /&gt;
 |title        = Test Infobox&lt;br /&gt;
 |above        = Above text&lt;br /&gt;
 |subheader    = Subheader above image&lt;br /&gt;
 |subheader2   = Second subheader&lt;br /&gt;
&lt;br /&gt;
 |imagestyle   = &lt;br /&gt;
 |captionstyle = &lt;br /&gt;
 |image        = [[File:Example-serious.jpg|200px|alt=Example alt text]]&lt;br /&gt;
 |caption      = Caption displayed below File:Example-serious.jpg&lt;br /&gt;
&lt;br /&gt;
 |headerstyle  = background: #ccf;&lt;br /&gt;
 |labelstyle   = background: #ddf;&lt;br /&gt;
 |datastyle    = &lt;br /&gt;
&lt;br /&gt;
 |header1 = Header defined alone&lt;br /&gt;
 | label1 = &lt;br /&gt;
 |  data1 = &lt;br /&gt;
 |header2 = &lt;br /&gt;
 | label2 = Label defined alone does not display (needs data, or is suppressed)&lt;br /&gt;
 |  data2 = &lt;br /&gt;
 |header3 =&lt;br /&gt;
 | label3 = &lt;br /&gt;
 |  data3 = Data defined alone&lt;br /&gt;
 |header4 = All three defined (header, label, data, all with same number)&lt;br /&gt;
 | label4 = does not display (same number as a header)&lt;br /&gt;
 |  data4 = does not display (same number as a header)&lt;br /&gt;
 |header5 =&lt;br /&gt;
 | label5 = Label and data defined (label)&lt;br /&gt;
 |  data5 = Label and data defined (data)&lt;br /&gt;
&lt;br /&gt;
 |belowstyle = background: #ddf;&lt;br /&gt;
 |below      = Below text&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot;&amp;gt;&lt;br /&gt;
{{Infobox&lt;br /&gt;
 |name         = Infobox/doc&lt;br /&gt;
 |bodystyle    = &lt;br /&gt;
&lt;br /&gt;
 |titlestyle   = &lt;br /&gt;
 |abovestyle   = background: #cfc;&lt;br /&gt;
 |subheaderstyle =&lt;br /&gt;
 |title        = Test Infobox&lt;br /&gt;
 |above        = Above text&lt;br /&gt;
 |subheader    = Subheader above image&lt;br /&gt;
 |subheader2   = Second subheader&lt;br /&gt;
&lt;br /&gt;
 |imagestyle   = &lt;br /&gt;
 |captionstyle = &lt;br /&gt;
 |image        = [[File:Example-serious.jpg|200px|alt=Example alt text]]&lt;br /&gt;
 |caption      = Caption displayed below File:Example-serious.jpg&lt;br /&gt;
&lt;br /&gt;
 |headerstyle  = background: #ccf;&lt;br /&gt;
 |labelstyle   = background: #ddf;&lt;br /&gt;
 |datastyle    = &lt;br /&gt;
&lt;br /&gt;
 |header1 = Header defined alone&lt;br /&gt;
 | label1 = &lt;br /&gt;
 |  data1 = &lt;br /&gt;
 |header2 = &lt;br /&gt;
 | label2 = Label defined alone does not display (needs data, or is suppressed)&lt;br /&gt;
 |  data2 = &lt;br /&gt;
 |header3 =&lt;br /&gt;
 | label3 = &lt;br /&gt;
 |  data3 = Data defined alone&lt;br /&gt;
 |header4 = All three defined (header, label, data, all with same number)&lt;br /&gt;
 | label4 = does not display (same number as a header)&lt;br /&gt;
 |  data4 = does not display (same number as a header)&lt;br /&gt;
 |header5 =&lt;br /&gt;
 | label5 = Label and data defined (label)&lt;br /&gt;
 |  data5 = Label and data defined (data)&lt;br /&gt;
&lt;br /&gt;
 |belowstyle = background: #ddf;&lt;br /&gt;
 |below      = Below text&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For this example, the {{para|bodystyle}} and {{para|labelstyle}} parameters are used to adjust the infobox width and define a default width for the column of labels:&lt;br /&gt;
&lt;br /&gt;
{{Infobox&lt;br /&gt;
 |name        = Infobox/doc&lt;br /&gt;
 |bodystyle   = width: 20em&lt;br /&gt;
&lt;br /&gt;
 |titlestyle  = &lt;br /&gt;
 |title       = Test Infobox&lt;br /&gt;
&lt;br /&gt;
 |headerstyle = &lt;br /&gt;
 |labelstyle  = width: 33%&lt;br /&gt;
 |datastyle   = &lt;br /&gt;
&lt;br /&gt;
 |header1 = &lt;br /&gt;
 | label1 = Label 1&lt;br /&gt;
 |  data1 = Data 1&lt;br /&gt;
 |header2 = &lt;br /&gt;
 | label2 = Label 2&lt;br /&gt;
 |  data2 = Data 2&lt;br /&gt;
 |header3 = &lt;br /&gt;
 | label3 = Label 3&lt;br /&gt;
 |  data3 = Data 3&lt;br /&gt;
 |header4 = Header 4&lt;br /&gt;
 | label4 = &lt;br /&gt;
 |  data4 = &lt;br /&gt;
 |header5 = &lt;br /&gt;
 | label5 = Label 5&lt;br /&gt;
 |  data5 = Data 5: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.&lt;br /&gt;
&lt;br /&gt;
 |belowstyle = &lt;br /&gt;
 |below = Below text&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot;&amp;gt;&lt;br /&gt;
{{Infobox&lt;br /&gt;
 |name        = Infobox/doc&lt;br /&gt;
 |bodystyle   = width: 20em&lt;br /&gt;
&lt;br /&gt;
 |titlestyle  = &lt;br /&gt;
 |title       = Test Infobox&lt;br /&gt;
&lt;br /&gt;
 |headerstyle = &lt;br /&gt;
 |labelstyle  = width: 33%&lt;br /&gt;
 |datastyle   = &lt;br /&gt;
&lt;br /&gt;
 |header1 = &lt;br /&gt;
 | label1 = Label 1&lt;br /&gt;
 |  data1 = Data 1&lt;br /&gt;
 |header2 = &lt;br /&gt;
 | label2 = Label 2&lt;br /&gt;
 |  data2 = Data 2&lt;br /&gt;
 |header3 = &lt;br /&gt;
 | label3 = Label 3&lt;br /&gt;
 |  data3 = Data 3&lt;br /&gt;
 |header4 = Header 4&lt;br /&gt;
 | label4 = &lt;br /&gt;
 |  data4 = &lt;br /&gt;
 |header5 = &lt;br /&gt;
 | label5 = Label 5&lt;br /&gt;
 |  data5 = Data 5: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.&lt;br /&gt;
&lt;br /&gt;
 |belowstyle = &lt;br /&gt;
 |below = Below text&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Embedding ==&lt;br /&gt;
&amp;lt;!--Linked from [[Template:Subinfobox bodystyle/doc]]--&amp;gt;&lt;br /&gt;
One infobox template can be embedded into another using the {{para|child}} parameter. This feature can be used to create a modular infobox, or to create better-defined logical sections. Long ago, it was necessary to use embedding in order to create infoboxes with more than 99 rows; but nowadays there&#039;s no limit to the number of rows that can be defined in a single instance of &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{infobox}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Infobox&lt;br /&gt;
 | title = Top level title&lt;br /&gt;
 | data1 = {{Infobox | decat = yes | child = yes&lt;br /&gt;
    | title = First subsection&lt;br /&gt;
    | label1= Label 1.1&lt;br /&gt;
    | data1 = Data 1.1&lt;br /&gt;
   }}&lt;br /&gt;
 | data2 = {{Infobox | decat = yes | child = yes&lt;br /&gt;
  |title = Second subsection&lt;br /&gt;
  | label1= Label 2.1&lt;br /&gt;
  | data1 = Data 2.1&lt;br /&gt;
  }}&lt;br /&gt;
 | belowstyle = &lt;br /&gt;
 | below = Below text&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{Infobox&lt;br /&gt;
 | title = Top level title&lt;br /&gt;
 | data1 = {{Infobox | decat = yes | child = yes&lt;br /&gt;
    | title = First subsection&lt;br /&gt;
    | label1= Label 1.1&lt;br /&gt;
    | data1 = Data 1.1&lt;br /&gt;
   }}&lt;br /&gt;
 | data2 = {{Infobox | decat = yes | child = yes&lt;br /&gt;
  |title = Second subsection&lt;br /&gt;
  | label1= Label 2.1&lt;br /&gt;
  | data1 = Data 2.1&lt;br /&gt;
  }}&lt;br /&gt;
 | belowstyle = &lt;br /&gt;
 | below = Below text&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
Note, in the examples above, the child infobox is placed in a &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; field, not a &amp;lt;code&amp;gt;header&amp;lt;/code&amp;gt; field.  Notice that the section subheadings are not in bold font if bolding is not explicitly specified. To obtain bold section headings, place the child infobox in a &#039;&#039;&#039;header&#039;&#039;&#039; field (but not in a &#039;&#039;&#039;label&#039;&#039;&#039; field because it would not be displayed!), either using&lt;br /&gt;
&lt;br /&gt;
{{Infobox&lt;br /&gt;
 | title = Top level title&lt;br /&gt;
 | header1 = {{Infobox | decat = yes | child = yes&lt;br /&gt;
    | title = First subsection&lt;br /&gt;
    | label1= Label 1.1&lt;br /&gt;
    | data1 = Data 1.1&lt;br /&gt;
   }}&lt;br /&gt;
 | header2 = {{Infobox | decat = yes | child = yes&lt;br /&gt;
    | title = Second subsection&lt;br /&gt;
    | label1= Label 2.1&lt;br /&gt;
    | data1 = Data 2.1&lt;br /&gt;
   }}&lt;br /&gt;
 | belowstyle = &lt;br /&gt;
 | below = Below text&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{Infobox&lt;br /&gt;
 | title = Top level title&lt;br /&gt;
 | header1 = {{Infobox | decat = yes | child = yes&lt;br /&gt;
    | title = First subsection&lt;br /&gt;
    | label1= Label 1.1&lt;br /&gt;
    | data1 = Data 1.1&lt;br /&gt;
   }}&lt;br /&gt;
 | header2 = {{Infobox | decat = yes | child = yes&lt;br /&gt;
    | title = Second subsection&lt;br /&gt;
    | label1= Label 2.1&lt;br /&gt;
    | data1 = Data 2.1&lt;br /&gt;
   }}&lt;br /&gt;
 | belowstyle = &lt;br /&gt;
 | below = Below text&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
or,&lt;br /&gt;
&lt;br /&gt;
{{Infobox&lt;br /&gt;
 | title = Top level title&lt;br /&gt;
 | header1 = First subsection&lt;br /&gt;
   {{Infobox | decat = yes | child = yes&lt;br /&gt;
    | label1 = Label 1.1&lt;br /&gt;
    |   data1 = Data 1.1&lt;br /&gt;
   }}&lt;br /&gt;
 | header2 = Second subsection&lt;br /&gt;
   {{Infobox | decat = yes | child = yes&lt;br /&gt;
    | label1 = Label 2.1&lt;br /&gt;
    |  data1 = Data 2.1&lt;br /&gt;
   }}&lt;br /&gt;
 | belowstyle = &lt;br /&gt;
 | below = Below text&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{Infobox&lt;br /&gt;
 | title = Top level title&lt;br /&gt;
 | header1 = First subsection&lt;br /&gt;
   {{Infobox | decat = yes | child = yes&lt;br /&gt;
    | label1 = Label 1.1&lt;br /&gt;
    |   data1 = Data 1.1&lt;br /&gt;
   }}&lt;br /&gt;
 | header2 = Second subsection&lt;br /&gt;
   {{Infobox | decat = yes | child = yes&lt;br /&gt;
    | label1 = Label 2.1&lt;br /&gt;
    |  data1 = Data 2.1&lt;br /&gt;
   }}&lt;br /&gt;
 | belowstyle = &lt;br /&gt;
 | below = Below text&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
Note that omitting the {{para|title}} parameter, and not including any text preceding the embedded infobox, may result in spurious blank table rows, creating gaps in the visual presentation. The garbage output can be suppressed using {{para|rowstyleN|display: none}}, replacing N with the data/header number.&lt;br /&gt;
&lt;br /&gt;
[[Wikipedia:WikiProject Infoboxes/embed]] includes some links to Wikipedia articles which include infoboxes embedded within other infoboxes.&lt;br /&gt;
&lt;br /&gt;
== Subboxes ==&lt;br /&gt;
An alternative method for embedding is to use {{para|subbox|yes}}, which removes the outer border from the infobox, but preserves the interior structure.  One feature of this approach is that the parent and child boxes need not have the same structure, and the label and data fields are not aligned between the parent and child boxes because they are not in the same parent table.&lt;br /&gt;
&lt;br /&gt;
{{Infobox&lt;br /&gt;
 | headerstyle = background-color: #eee;&lt;br /&gt;
 | labelstyle  = background-color: #eee;&lt;br /&gt;
 | header1 = Main 1&lt;br /&gt;
 | header2 = Main 2&lt;br /&gt;
 |   data3 = {{Infobox | subbox = yes&lt;br /&gt;
    | headerstyle = background-color: #ccc;&lt;br /&gt;
    | labelstyle  = background-color: #ddd;&lt;br /&gt;
    | header1 = Sub 3-1&lt;br /&gt;
    | header2 = Sub 3-2&lt;br /&gt;
    |  label3 = Label 3-3    |   data3 = Data 3-3&lt;br /&gt;
   }}&lt;br /&gt;
 |   data4 = {{Infobox | subbox = yes&lt;br /&gt;
    | labelstyle  = background-color: #ccc;&lt;br /&gt;
    |  label1 = Label 4-1    |   data1 = Data 4-1&lt;br /&gt;
   }}&lt;br /&gt;
 |  label5 = Label 5 |   data5 = Data 5&lt;br /&gt;
 | header6 = Main 6&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{Infobox&lt;br /&gt;
 | headerstyle = background-color: #eee;&lt;br /&gt;
 | labelstyle  = background-color: #eee;&lt;br /&gt;
 | header1 = Main 1&lt;br /&gt;
 | header2 = Main 2&lt;br /&gt;
 |   data3 = {{Infobox | subbox = yes&lt;br /&gt;
    | headerstyle = background-color: #ccc;&lt;br /&gt;
    | labelstyle  = background-color:#ddd;&lt;br /&gt;
    | header1 = Sub 3-1&lt;br /&gt;
    | header2 = Sub 3-2&lt;br /&gt;
    |  label3 = Label 3-3    |   data3 = Data 3-3&lt;br /&gt;
   }}&lt;br /&gt;
 |   data4 = {{Infobox | subbox = yes&lt;br /&gt;
    | labelstyle  = background-color: #ccc;&lt;br /&gt;
    |  label1 = Label 4-1    |   data1 = Data 4-1&lt;br /&gt;
   }}&lt;br /&gt;
 |  label5 = Label 5 |   data5 = Data 5&lt;br /&gt;
 | header6 = Main 6&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
Similar embedding techniques may be used within content parameters of some other templates generating tables (such as [[:Template:Sidebar|Sidebar]]):&lt;br /&gt;
&lt;br /&gt;
{{Sidebar&lt;br /&gt;
 | navbar = off&lt;br /&gt;
 | headingstyle = background-color: #eee;&lt;br /&gt;
 | heading1 = Heading 1&lt;br /&gt;
 | heading2 = Heading 2&lt;br /&gt;
 | content3 = {{Infobox | subbox = yes&lt;br /&gt;
    | headerstyle = background-color: #ccc;&lt;br /&gt;
    | labelstyle = background-color: #ddd;&lt;br /&gt;
    | header1 = Sub 3-1&lt;br /&gt;
    | header2 = Sub 3-2&lt;br /&gt;
    |  label3 = Label 3-3 |   data3 = Data 3-3&lt;br /&gt;
   }}&lt;br /&gt;
 | content4 = {{Infobox | subbox = yes&lt;br /&gt;
    | labelstyle = background-color: #ccc;&lt;br /&gt;
    |  label1 = Label 4-1 |   data1 = Data 4-1&lt;br /&gt;
   }}&lt;br /&gt;
 | heading5 = Heading 5&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{Sidebar&lt;br /&gt;
 | navbar = off&lt;br /&gt;
 | headingstyle = background-color: #eee;&lt;br /&gt;
 | heading1 = Heading 1&lt;br /&gt;
 | heading2 = Heading 2&lt;br /&gt;
 | content3 = {{Infobox | subbox = yes&lt;br /&gt;
    | headerstyle = background-color: #ccc;&lt;br /&gt;
    | labelstyle = background-color: #ddd;&lt;br /&gt;
    | header1 = Sub 3-1&lt;br /&gt;
    | header2 = Sub 3-2&lt;br /&gt;
    |  label3 = Label 3-3 |   data3 = Data 3-3&lt;br /&gt;
   }}&lt;br /&gt;
 | content4 = {{Infobox | subbox = yes&lt;br /&gt;
    | labelstyle = background-color: #ccc;&lt;br /&gt;
    |  label1 = Label 4-1 |   data1 = Data 4-1&lt;br /&gt;
   }}&lt;br /&gt;
 | heading5 = Heading 5&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
Note that the default padding of the parent data cell containing each subbox is still visible, so the subboxes are slightly narrower than the parent box and there&#039;s a higher vertical spacing between standard cells of the parent box than between cells of distinct subboxes.&lt;br /&gt;
&lt;br /&gt;
== Controlling line-breaking in embedded bulletless lists ==&lt;br /&gt;
Template {{tlx|nbsp}} may be used with {{tlx|wbr}} and {{tlx|nowrap}} to control line-breaking in bulletless lists embedded in infoboxes (e.g. cast list in {{tlx|Infobox film}}), to prevent wrapped long entries from being confused with multiple entries. See [[Template:Wbr/doc#Controlling line-breaking in infoboxes]] for details.&lt;br /&gt;
&lt;br /&gt;
== Full blank syntax ==&lt;br /&gt;
(Note: there is no limit to the number of possible rows; only 20 are given below since infoboxes larger than that will be relatively rare. Just extend the numbering as needed. The microformat &amp;quot;class&amp;quot; parameters are also omitted as they are not commonly used.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; style=&amp;quot;overflow: auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{Infobox&lt;br /&gt;
| name           = {{subst:PAGENAME}}&lt;br /&gt;
| child          = {{{child|}}}&lt;br /&gt;
| subbox         = {{{subbox|}}}&lt;br /&gt;
| italic title   = {{{italic title|no}}}&lt;br /&gt;
| templatestyles = &lt;br /&gt;
| child templatestyles = &lt;br /&gt;
| grandchild templatestyles = &lt;br /&gt;
| bodystyle      = &lt;br /&gt;
&lt;br /&gt;
| titlestyle     = &lt;br /&gt;
| abovestyle     = &lt;br /&gt;
| subheaderstyle = &lt;br /&gt;
| title          = &lt;br /&gt;
| above          = &lt;br /&gt;
| subheader      = &lt;br /&gt;
&lt;br /&gt;
|   imagestyle   = &lt;br /&gt;
| captionstyle   = &lt;br /&gt;
|   image        = &lt;br /&gt;
| caption        = &lt;br /&gt;
|   image2       = &lt;br /&gt;
| caption2       = &lt;br /&gt;
&lt;br /&gt;
| headerstyle    = &lt;br /&gt;
|  labelstyle    = &lt;br /&gt;
|   datastyle    = &lt;br /&gt;
| header1  = &lt;br /&gt;
|  label1  = &lt;br /&gt;
|   data1  = &lt;br /&gt;
| header2  = &lt;br /&gt;
|  label2  = &lt;br /&gt;
|   data2  = &lt;br /&gt;
| header3  = &lt;br /&gt;
|  label3  = &lt;br /&gt;
|   data3  = &lt;br /&gt;
| header4  = &lt;br /&gt;
|  label4  = &lt;br /&gt;
|   data4  = &lt;br /&gt;
| header5  = &lt;br /&gt;
|  label5  = &lt;br /&gt;
|   data5  = &lt;br /&gt;
| header6  = &lt;br /&gt;
|  label6  = &lt;br /&gt;
|   data6  = &lt;br /&gt;
| header7  = &lt;br /&gt;
|  label7  = &lt;br /&gt;
|   data7  = &lt;br /&gt;
| header8  = &lt;br /&gt;
|  label8  = &lt;br /&gt;
|   data8  = &lt;br /&gt;
| header9  = &lt;br /&gt;
|  label9  = &lt;br /&gt;
|   data9  = &lt;br /&gt;
| header10 = &lt;br /&gt;
|  label10 = &lt;br /&gt;
|   data10 = &lt;br /&gt;
| header11 = &lt;br /&gt;
|  label11 = &lt;br /&gt;
|   data11 = &lt;br /&gt;
| header12 = &lt;br /&gt;
|  label12 = &lt;br /&gt;
|   data12 = &lt;br /&gt;
| header13 = &lt;br /&gt;
|  label13 = &lt;br /&gt;
|   data13 = &lt;br /&gt;
| header14 = &lt;br /&gt;
|  label14 = &lt;br /&gt;
|   data14 = &lt;br /&gt;
| header15 = &lt;br /&gt;
|  label15 = &lt;br /&gt;
|   data15 = &lt;br /&gt;
| header16 = &lt;br /&gt;
|  label16 = &lt;br /&gt;
|   data16 = &lt;br /&gt;
| header17 = &lt;br /&gt;
|  label17 = &lt;br /&gt;
|   data17 = &lt;br /&gt;
| header18 = &lt;br /&gt;
|  label18 = &lt;br /&gt;
|   data18 = &lt;br /&gt;
| header19 = &lt;br /&gt;
|  label19 = &lt;br /&gt;
|   data19 = &lt;br /&gt;
| header20 = &lt;br /&gt;
|  label20 = &lt;br /&gt;
|   data20 = &lt;br /&gt;
&lt;br /&gt;
| belowstyle     = &lt;br /&gt;
| below          = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{clear}}&lt;br /&gt;
{{Help:Infobox/user style}}&lt;br /&gt;
&lt;br /&gt;
== Porting to other MediaWikis ==&lt;br /&gt;
The infobox template requires the [[:mw:Extension:Scribunto|Scribunto]] and [[:mw:Extension:TemplateStyles|TemplateStyles]] extensions. [[Wikipedia:WikiProject Transwiki|WikiProject Transwiki]] has a version of this template that has been modified to work on other MediaWikis.&lt;br /&gt;
&lt;br /&gt;
== TemplateData ==&lt;br /&gt;
{{TemplateData header}}&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;This template is intended as a meta template, a template used for constructing other templates. In general, it is not meant for use directly in an article but can be used on a one-off basis if required.&amp;quot;,&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;{{_\n| ________________ = _\n}}\n&amp;quot;,&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
 		&amp;quot;name&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;name&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;child&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;child&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;subbox&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;subbox&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;italic title&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;italic title&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
  		&amp;quot;templatestyles&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;templatestyles&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;child templatestyles&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;child templatestyles&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;grandchild templatestyles&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;grandchild templatestyles&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;bodystyle&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;bodystyle&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;titlestyle&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;titlestyle&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;abovestyle&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;abovestyle&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;subheaderstyle&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;subheaderstyle&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
		&amp;quot;title&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Title&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Title displayed above the infobox&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
 		&amp;quot;above&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;above&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;subheader&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;subheader&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;imagestyle&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;imagestyle&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;captionstyle&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;captionstyle&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
		&amp;quot;image&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Image&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Image illustrating the topic.  Use full image syntax.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;[[File:example.png|200px|alt=Example alt text]]&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;caption&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Caption&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;caption for the image&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
 		&amp;quot;image2&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;image2&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;caption2&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;caption2&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;headerstyle&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;headerstyle&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;labelstyle&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;labelstyle&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;datastyle&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;datastyle&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header1&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header1&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label1&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label1&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data1&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data1&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header2&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header2&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label2&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label2&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data2&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data2&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header3&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header3&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label3&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label3&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data3&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data3&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header4&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header4&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label4&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label4&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data4&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data4&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header5&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header5&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label5&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label5&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data5&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data5&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header6&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header6&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label6&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label6&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data6&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data6&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header7&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header7&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label7&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label7&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data7&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data7&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header8&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header8&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label8&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label8&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data8&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data8&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header9&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header9&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label9&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label9&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data9&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data9&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header10&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header10&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label10&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label10&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data10&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data10&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header11&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header11&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label11&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label11&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data11&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data11&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header12&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header12&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label12&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label12&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data12&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data12&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header13&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header13&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label13&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label13&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data13&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data13&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header14&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header14&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label14&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label14&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data14&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data14&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header15&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header15&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label15&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label15&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data15&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data15&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header16&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header16&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label16&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label16&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data16&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data16&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header17&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header17&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label17&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label17&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data17&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data17&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header18&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header18&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label18&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label18&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data18&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data18&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header19&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header19&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label19&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label19&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data19&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data19&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;header20&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;header20&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;label20&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;label20&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;data20&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;data20&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;belowstyle&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;belowstyle&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         },&lt;br /&gt;
 		&amp;quot;below&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;below&amp;quot;,&lt;br /&gt;
 			&amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;paramOrder&amp;quot;: [&lt;br /&gt;
		&amp;quot;name&amp;quot;,&lt;br /&gt;
		&amp;quot;child&amp;quot;,&lt;br /&gt;
		&amp;quot;subbox&amp;quot;,&lt;br /&gt;
		&amp;quot;italic title&amp;quot;,&lt;br /&gt;
		&amp;quot;templatestyles&amp;quot;,&lt;br /&gt;
		&amp;quot;child templatestyles&amp;quot;, &lt;br /&gt;
		&amp;quot;grandchild templatestyles&amp;quot;,&lt;br /&gt;
		&amp;quot;bodystyle&amp;quot;,&lt;br /&gt;
		&amp;quot;titlestyle&amp;quot;,&lt;br /&gt;
		&amp;quot;abovestyle&amp;quot;,&lt;br /&gt;
		&amp;quot;subheaderstyle&amp;quot;,&lt;br /&gt;
		&amp;quot;title&amp;quot;,&lt;br /&gt;
		&amp;quot;above&amp;quot;,&lt;br /&gt;
		&amp;quot;subheader&amp;quot;,&lt;br /&gt;
		&amp;quot;imagestyle&amp;quot;,&lt;br /&gt;
		&amp;quot;captionstyle&amp;quot;,&lt;br /&gt;
		&amp;quot;image&amp;quot;,&lt;br /&gt;
		&amp;quot;caption&amp;quot;,&lt;br /&gt;
		&amp;quot;image2&amp;quot;,&lt;br /&gt;
		&amp;quot;caption2&amp;quot;,&lt;br /&gt;
		&amp;quot;headerstyle&amp;quot;,&lt;br /&gt;
		&amp;quot;labelstyle&amp;quot;,&lt;br /&gt;
		&amp;quot;datastyle&amp;quot;,&lt;br /&gt;
		&amp;quot;header1&amp;quot;,&lt;br /&gt;
		&amp;quot;label1&amp;quot;,&lt;br /&gt;
		&amp;quot;data1&amp;quot;,&lt;br /&gt;
		&amp;quot;header2&amp;quot;,&lt;br /&gt;
		&amp;quot;label2&amp;quot;,&lt;br /&gt;
		&amp;quot;data2&amp;quot;,&lt;br /&gt;
		&amp;quot;header3&amp;quot;,&lt;br /&gt;
		&amp;quot;label3&amp;quot;,&lt;br /&gt;
		&amp;quot;data3&amp;quot;,&lt;br /&gt;
		&amp;quot;header4&amp;quot;,&lt;br /&gt;
		&amp;quot;label4&amp;quot;,&lt;br /&gt;
		&amp;quot;data4&amp;quot;,&lt;br /&gt;
		&amp;quot;header5&amp;quot;,&lt;br /&gt;
		&amp;quot;label5&amp;quot;,&lt;br /&gt;
		&amp;quot;data5&amp;quot;,&lt;br /&gt;
		&amp;quot;header6&amp;quot;,&lt;br /&gt;
		&amp;quot;label6&amp;quot;,&lt;br /&gt;
		&amp;quot;data6&amp;quot;,&lt;br /&gt;
		&amp;quot;header7&amp;quot;,&lt;br /&gt;
		&amp;quot;label7&amp;quot;,&lt;br /&gt;
		&amp;quot;data7&amp;quot;,&lt;br /&gt;
		&amp;quot;header8&amp;quot;,&lt;br /&gt;
		&amp;quot;label8&amp;quot;,&lt;br /&gt;
		&amp;quot;data8&amp;quot;,&lt;br /&gt;
		&amp;quot;header9&amp;quot;,&lt;br /&gt;
		&amp;quot;label9&amp;quot;,&lt;br /&gt;
		&amp;quot;data9&amp;quot;,&lt;br /&gt;
		&amp;quot;header10&amp;quot;,&lt;br /&gt;
		&amp;quot;label10&amp;quot;,&lt;br /&gt;
		&amp;quot;data10&amp;quot;,&lt;br /&gt;
		&amp;quot;header11&amp;quot;,&lt;br /&gt;
		&amp;quot;label11&amp;quot;,&lt;br /&gt;
		&amp;quot;data11&amp;quot;,&lt;br /&gt;
		&amp;quot;header12&amp;quot;,&lt;br /&gt;
		&amp;quot;label12&amp;quot;,&lt;br /&gt;
		&amp;quot;data12&amp;quot;,&lt;br /&gt;
		&amp;quot;header13&amp;quot;,&lt;br /&gt;
		&amp;quot;label13&amp;quot;,&lt;br /&gt;
		&amp;quot;data13&amp;quot;,&lt;br /&gt;
		&amp;quot;header14&amp;quot;,&lt;br /&gt;
		&amp;quot;label14&amp;quot;,&lt;br /&gt;
		&amp;quot;data14&amp;quot;,&lt;br /&gt;
		&amp;quot;header15&amp;quot;,&lt;br /&gt;
		&amp;quot;label15&amp;quot;,&lt;br /&gt;
		&amp;quot;data15&amp;quot;,&lt;br /&gt;
		&amp;quot;header16&amp;quot;,&lt;br /&gt;
		&amp;quot;label16&amp;quot;,&lt;br /&gt;
		&amp;quot;data16&amp;quot;,&lt;br /&gt;
		&amp;quot;header17&amp;quot;,&lt;br /&gt;
		&amp;quot;label17&amp;quot;,&lt;br /&gt;
		&amp;quot;data17&amp;quot;,&lt;br /&gt;
		&amp;quot;header18&amp;quot;,&lt;br /&gt;
		&amp;quot;label18&amp;quot;,&lt;br /&gt;
		&amp;quot;data18&amp;quot;,&lt;br /&gt;
		&amp;quot;header19&amp;quot;,&lt;br /&gt;
		&amp;quot;label19&amp;quot;,&lt;br /&gt;
		&amp;quot;data19&amp;quot;,&lt;br /&gt;
		&amp;quot;header20&amp;quot;,&lt;br /&gt;
		&amp;quot;label20&amp;quot;,&lt;br /&gt;
		&amp;quot;data20&amp;quot;,&lt;br /&gt;
		&amp;quot;belowstyle&amp;quot;,&lt;br /&gt;
		&amp;quot;below&amp;quot;&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tracking categories==&lt;br /&gt;
* {{Category link with count|Articles with missing Wikidata information}}&lt;br /&gt;
* {{Category link with count|Articles using infobox templates with no data rows}}&lt;br /&gt;
* {{Category link with count|Pages using embedded infobox templates with the title parameter}}&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[Module:Infobox]], the [[WP:LUA|Lua]] module on which this template is based&lt;br /&gt;
* [[Module:Check for unknown parameters]]&lt;br /&gt;
* {{tl|Infobox3cols}}&lt;br /&gt;
* {{tl|Navbox}} and {{tl|Sidebar}}&lt;br /&gt;
* [[Wikipedia:List of infoboxes|List of infoboxes]]&lt;br /&gt;
* [[:Module:InfoboxImage]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{Sandbox other||&lt;br /&gt;
&amp;lt;!-- Categories below this line, please; interwikis at Wikidata --&amp;gt;&lt;br /&gt;
[[Category:Infobox templates| ]]&lt;br /&gt;
[[Category:Wikipedia metatemplates|Infobox]]&lt;br /&gt;
[[Category:Templates generating microformats]]&lt;br /&gt;
[[Category:Templates that add a tracking category]]&lt;br /&gt;
[[Category:Templates based on the Infobox Lua module]]&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
	<entry>
		<id>https://atmospedia.org/index.php?title=Template:Infobox&amp;diff=188</id>
		<title>Template:Infobox</title>
		<link rel="alternate" type="text/html" href="https://atmospedia.org/index.php?title=Template:Infobox&amp;diff=188"/>
		<updated>2024-07-03T18:32:41Z</updated>

		<summary type="html">&lt;p&gt;Wooseph: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:Infobox|infobox}}&amp;lt;includeonly&amp;gt;{{template other|{{#ifeq:{{PAGENAME}}|Infobox||{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|[[Category:Infobox templates|{{remove first word|{{SUBPAGENAME}}}}]]}}}}|}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go in the /doc subpage, and interwikis go in Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wooseph</name></author>
	</entry>
</feed>