Module:Infobox: Difference between revisions

From NvWiki
Jump to navigation Jump to search
Decat tweaks per request on talk
Line 1: Line 1:
local p = {}
{{Permanently protected}}
local args = {}
{{talkheader}}
local origArgs = {}
{{WikiProject banner shell|
local root
{{WikiProject Infoboxes}}
local empty_row_categories = {}
}}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
{{User:MiszaBot/config
local has_rows = false
|archiveheader = {{talkarchivenav}}
local yesno = require("Module:Yesno")
|maxarchivesize = 75K
local lists = {
|counter = 20
plainlist_t = {
|minthreadsleft = 6
patterns = {
|algo = old(90d)
'^plainlist$',
|archive = Template talk:Infobox/Archive %(counter)d
'%splainlist$',
}}
'^plainlist%s',
{{Lua sidebar}}
'%splainlist%s'
},
found = false,
styles = 'Plainlist/styles.css'
},
hlist_t = {
patterns = {
'^hlist$',
'%shlist$',
'^hlist%s',
'%shlist%s'
},
found = false,
styles = 'Hlist/styles.css'
}
}


local function has_list_class(args_to_check)
== Notelist inside infobox ==
for _, list in pairs(lists) do
if not list.found then
for _, arg in pairs(args_to_check) do
for _, pattern in ipairs(list.patterns) do
if mw.ustring.find(arg or '', pattern) then
list.found = true
break
end
end
if list.found then break end
end
end
end
end


local function fixChildBoxes(sval, tt)
There is a request at [[Template talk:Infobox sports season]] to implement [[Help:explanatory notes|explanatory notes]] inside the infobox, to avoid the notes getting confused with other groups of notes lower down the article. Apparently this has already been done at [[Template:Infobox college basketball team]]. I'm posting here in case anyone has an opinion about this, or whether this could more efficiently be coded at the meta module instead. &mdash;&nbsp;Martin <small>([[User:MSGJ|MSGJ]]&nbsp;·&nbsp;[[User talk:MSGJ|talk]])</small> 21:42, 23 June 2025 (UTC)
local function notempty( s ) return s and s:match( '%S' ) end
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
-- start moving templatestyles and categories inside of table rows
local slast = ''
while slast ~= s do
slast = s
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1')
end
-- end moving templatestyles and categories inside of table rows
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- [[Special:Diff/849054481]]
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end


-- Cleans empty tables
:So just to be clear there are infoboxs out there that have the footnotes at the end of the info box making the box longer with notes that are in very small text? Why would we clutter the lead in this way? I think I have seen this before..... this is something that pop culture articles do? <span style="display:inline-flex;rotate:-15deg;color:darkblue">'''[[User:Moxy|Moxy]]'''</span><span style="display:inline-flex;rotate:15deg;color:darkblue">[[User talk:Moxy|🍁]]</span> 22:17, 23 June 2025 (UTC)
local function cleanInfobox()
::I have not noticed these infoboxes previously. I think small text is a bad idea because infoboxes are already at a smaller size. The proposal at Infobox sports season is a collapsed box with the notes in &mdash;&nbsp;Martin <small>([[User:MSGJ|MSGJ]]&nbsp;·&nbsp;[[User talk:MSGJ|talk]])</small> 22:29, 23 June 2025 (UTC)
root = tostring(root)
:::Its odd we have groups of article's so different than others and want to hide things all the time making things unaccessible. Like [[Template:Toronto Raptors]] .... why are we hiding all the links in the header? <span style="display:inline-flex;rotate:-15deg;color:darkblue">'''[[User:Moxy|Moxy]]'''</span><span style="display:inline-flex;rotate:15deg;color:darkblue">[[User talk:Moxy|🍁]]</span> 22:37, 23 June 2025 (UTC)
if has_rows == false then
::::It's against [[MOS:COLOUR]] which says {{tq|Links should be clearly identifiable as links for readers.}} For some time now, I have been suggesting that ''if'' navboxes need colours that are not the default, the approach taken by the religious people has its merits. See for example [[Tricia Hillas#References|the navboxes at Tricia Hillas]]. Only the topmost bar is styled, to have: background white; unlinked text black; linked text default; top and bottom borders coloured. --[[User:Redrose64|<span style="color:#a80000; background:#ffeeee; text-decoration:inherit">Red</span>rose64]] &#x1f339; ([[User talk:Redrose64|talk]]) 08:18, 24 June 2025 (UTC)
root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
:::::Why are we talking about colour? It is not relevant to what is being discussed here &mdash;&nbsp;Martin <small>([[User:MSGJ|MSGJ]]&nbsp;·&nbsp;[[User talk:MSGJ|talk]])</small> 10:07, 24 June 2025 (UTC)
end
::::::Moxy asked "why are we hiding all the links in the header?" To me they're hidden by being the same colour as the unlined text. --[[User:Redrose64|<span style="color:#a80000; background:#ffeeee; text-decoration:inherit">Red</span>rose64]] &#x1f339; ([[User talk:Redrose64|talk]]) 21:15, 24 June 2025 (UTC)
end
:::::::.... Perhaps I better be more clear here. Why is it that sports projects go out of their way to hide links and information in most of their templates..... for example colored links and of hiding the sources/notes in an info box. <span style="display:inline-flex;rotate:-15deg;color:darkblue">'''[[User:Moxy|Moxy]]'''</span><span style="display:inline-flex;rotate:15deg;color:darkblue">[[User talk:Moxy|🍁]]</span> 22:04, 24 June 2025 (UTC)
:::To the original question: examples please, of where these notes are present within the infobox. --[[User:Redrose64|<span style="color:#a80000; background:#ffeeee; text-decoration:inherit">Red</span>rose64]] &#x1f339; ([[User talk:Redrose64|talk]]) 08:18, 24 June 2025 (UTC)
::::There are some examples in the [[Template:Infobox sports season/testcases|/testcases]] &mdash;&nbsp;Martin <small>([[User:MSGJ|MSGJ]]&nbsp;·&nbsp;[[User talk:MSGJ|talk]])</small> 10:08, 24 June 2025 (UTC)
FWIW, I fixed the [[MOS:SMALLFONT]] accessibility problem at {{tl|Infobox college basketball team}} that was caused by embedding a {{tl|notelist}} inside an infobox. That sort of fix would be needed for any other infobox that included the same embedding. You can see notes in an infobox at [[LIU Sharks men's basketball]]. – [[User:Jonesey95|Jonesey95]] ([[User talk:Jonesey95|talk]]) 20:09, 26 June 2025 (UTC)


-- Returns the union of the values of two tables, as a sequence.
:{{re|Jonesey95}} I added your solution to the accessibility problem to [[Help:Footnotes#Issues]]. Inspired by a comment from [[User:MSGJ|MSGJ]], I looked at several infoboxes that allow for the display of footnotes. They generally do so by creating a series of parameters, which limits the number of footnotes available (not necessarily a bad thing). I did not find any others that call {{tlx|notelist}}, which seems far more simple to me. Hopefully, if anyone else decides to implement this, they will see the note I left on the help page. I'm glad MSGJ reached out this talk page for advice. Thanks for your help. [[User:Taxman1913|Taxman1913]] ([[User talk:Taxman1913|talk]]) 19:02, 14 July 2025 (UTC)
local function union(t1, t2)


local vals = {}
== Overridden dark mode background is almost but not identical to default ==
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end


-- Returns a table containing the numbers of the arguments that exist
[https://en.wikipedia.org/w/index.php?title=Module:Infobox/styles.css&oldid=1295905060#L-33--L-50 These lines] override some backgrounds in dark mode to <code>#1f1f23</code>. This is very close to the default infobox background of <code>--background-color-interactive-subtle</code> (<code>#202122</code>), but neither exactly the same nor different enough to distinguish these elements from the rest of the infobox. Is this intentional? [[User:EvenTwist41|EvenTwist41]] ([[User talk:EvenTwist41|talk]]) 01:21, 17 September 2025 (UTC)
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end


-- Adds a row to the infobox, with either a header cell
== Collapsing Infoboxes? ==
-- or a label/data cell combination.
local function addRow(rowArgs)
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
has_rows = true
has_list_class({ rowArgs.rowclass, rowArgs.class, args.headerclass })
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:tag('th')
:attr('colspan', '2')
:addClass('infobox-header')
:addClass(rowArgs.class)
:addClass(args.headerclass)
-- @deprecated next; target .infobox-<name> .infobox-header
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data and not yesno(args.decat) then
root:wikitext(
'[[Category:Pages using infobox templates with ignored data cells]]'
)
end
elseif rowArgs.data and rowArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
has_list_class({ rowArgs.rowclass, rowArgs.class })
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:addClass('infobox-label')
-- @deprecated next; target .infobox-<name> .infobox-label
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end


local dataCell = row:tag('td')
I know if this isn't the perfect place to be discussing transclusion, but I've noticed a couple of timeline templates using the infobox template, that have the ability to collapse. Like these:
dataCell
:attr('colspan', not rowArgs.label and '2' or nil)
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
:addClass(rowArgs.class)
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
else
table.insert(empty_row_categories, rowArgs.data or '')
end
end


local function renderTitle()
[[Template:Paramount Skydance evolution]]
if not args.title then return end


has_rows = true
[[Template:WildBrain evolution]]
has_list_class({args.titleclass})
root
:tag('caption')
:addClass('infobox-title')
:addClass(args.titleclass)
-- @deprecated next; target .infobox-<name> .infobox-title
:cssText(args.titlestyle)
:wikitext(args.title)
end


local function renderAboveRow()
I'm struggling to incorporate this on a MediaWiki wiki I'm creating. ([https://altcyclopedia.miraheze.org/wiki/Template:Paramount_evolution Template:Paramount evolution - Altcyclopedia]) Any idea how to do it? - [[User:BiggieSMLZ|BiggieSMLZ]] ([[User talk:BiggieSMLZ|talk]]) 21:30, 4 October 2025 (UTC)
if not args.above then return end


has_rows = true
:The classes in use in those templates are <code>collapsible</code> and its friend. These classes are aliased locally to <code>mw-collapsible</code> and its friend, which is the [[:mw:Manual:Collapsible elements|standard name]]. Try those names instead. [[User:Izno|Izno]] ([[User talk:Izno|talk]]) 04:52, 5 October 2025 (UTC)
has_list_class({ args.aboveclass })
::I inserted <code>mw-collapsible</code> in place of <code>collapsed</code> on my template ([https://altcyclopedia.miraheze.org/wiki/Template:Paramount_evolution?action=edit) , but it still had no effect. [[User:BiggieSMLZ|BiggieSMLZ]] ([[User talk:BiggieSMLZ|talk]]) 09:59, 5 October 2025 (UTC)
root
:tag('tr')
:tag('th')
:attr('colspan', '2')
:addClass('infobox-above')
:addClass(args.aboveclass)
-- @deprecated next; target .infobox-<name> .infobox-above
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end


local function renderBelowRow()
== Patch: make {{para|decat|yes}} prevent categorization from [[Module:Infobox]] under [[:Category:Pages using infobox templates with ignored data cells]] too ==
if not args.below then return end


has_rows = true
{{edit template-protected|answered=yes}}
has_list_class({ args.belowclass })
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-below')
:addClass(args.belowclass)
-- @deprecated next; target .infobox-<name> .infobox-below
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end


local function addSubheaderRow(subheaderArgs)
If you change line #167 in [[Module:Infobox]] from
if subheaderArgs.data and
<syntaxhighlight lang="wikitext">
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
if rowArgs.data then
has_rows = true
</syntaxhighlight>
has_list_class({ subheaderArgs.rowclass, subheaderArgs.class })
local row = root:tag('tr')
row:addClass(subheaderArgs.rowclass)


local dataCell = row:tag('td')
to
dataCell
:attr('colspan', '2')
:addClass('infobox-subheader')
:addClass(subheaderArgs.class)
:cssText(subheaderArgs.datastyle)
:cssText(subheaderArgs.rowcellstyle)
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
else
table.insert(empty_row_categories, subheaderArgs.data or '')
end
end


local function renderSubheaders()
<syntaxhighlight lang="wikitext">
if args.subheader then
if rowArgs.data and (args.decat ~= 'yes') then
args.subheader1 = args.subheader
</syntaxhighlight>
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addSubheaderRow({
data = args['subheader' .. tostring(num)],
-- @deprecated next; target .infobox-<name> .infobox-subheader
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end


local function addImageRow(imageArgs)
then {{para|decat|yes}} will also prevent categorizing because of ignored data cells.


if imageArgs.data and
I'd also suggest changing the module to use [[Module:Yesno]] since {{para|decat|Yes}} doesn't work as intended, for example, as I discovered before adding the right parameter to the first example under [[Template:Infobox/doc#Examples]] in my local copy of the doc. [[User:Tactica|Tactica]] ([[User talk:Tactica|talk]]) 19:50, 14 October 2025 (UTC)
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
: {{Done}} [[User:Pppery|* Pppery *]] [[User talk:Pppery|<sub style="color:#800000">it has begun...</sub>]] 23:40, 12 December 2025 (UTC)


has_rows = true
== Can the blank rows on child infoboxes be fixed? ==
has_list_class({ imageArgs.rowclass, imageArgs.class })
local row = root:tag('tr')
row:addClass(imageArgs.rowclass)


local dataCell = row:tag('td')
(This discussion started at [[Template talk:Infobox social media personality#Layout]] when a user reported an infobox with two blank rows. I'm copying over my text from there.)
dataCell
:attr('colspan', '2')
:addClass('infobox-image')
:addClass(imageArgs.class)
:cssText(imageArgs.datastyle)
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
else
table.insert(empty_row_categories, imageArgs.data or '')
end
end


local function renderImages()
The blank rows are related to embedding using {{para|child|yes}}. Almost all of the [[Template:Infobox social media personality/testcases|testcases]] have a blank line or two, on both desktop and mobile, with this markup:
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:addClass('infobox-caption')
-- @deprecated next; target .infobox-<name> .infobox-caption
:cssText(args.captionstyle)
:wikitext(caption)
end
addImageRow({
data = tostring(data),
-- @deprecated next; target .infobox-<name> .infobox-image
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end


-- When autoheaders are turned on, preprocesses the rows
<syntaxhighlight lang="wikitext" style="overflow: auto"><tr><td colspan="2" class="infobox-full-data"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1316064257"></td></tr></syntaxhighlight>
local function preprocessRows()
if not args.autoheaders then return end
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and
args['data' .. tostring(num)]:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end


-- Gets the union of the header and data argument numbers,
One blank line is always created at the beginning of this wrapper template (in-between {{tl|Infobox person}}'s rows and the custom rows for this infobox), and a second is created when embedding this template into another. Both are direct results of {{para|child|yes}}, which creates a blank row where {{para|title}} would be listed. It simply does not suppress this row if the title is left blank. The blank row does NOT occur if you embed using {{para|subbox|yes}} instead.
-- and renders them all in order
This issue is actually already mentioned at [[Template:Infobox#Embedding]]. A workaround/solution is listed but it would have to be applied everywhere that {{para|child|yes}} is used. This is something that should be fixed directly at [[Module:Infobox]] instead.
local function renderRows()
<hr>
Can this possibly be fixed by someone familiar with how this module functions? I've searched through the talk page archives and it seems like this [[Template_talk:Infobox/Archive_18#Fix_for_empty_cells_with_child_boxes|issue may have been fixed in the past.]] [[User:Prefall|<span style="color: #990000">Pre</span>]]'''[[User talk:Prefall|<span style="color: #990000">fall</span>]]''' 21:09, 15 October 2025 (UTC)


local rownums = union(getArgNums('header'), getArgNums('data'))
:The lack of suppression for this row is not shocking. It has to do with how infobox just magically sucks up child infoboxes into its structure. (That hack may somewhen go away, but not anytime soon.)
table.sort(rownums)
:@[[User:Frietjes|Frietjes]], if you're around, since you solved some of this the last go around. [[User:Izno|Izno]] ([[User talk:Izno|talk]]) 23:53, 16 October 2025 (UTC)
for k, num in ipairs(rownums) do
:: [[User:Izno|Izno]], it's been sometime since I looked at this code.  my guess right now is that if we change the code block starting near line 52 to move the categories and templatestyles outside of the cells and to the top of the output this could fix the problem. I will try to find some time to look at it, but I need to brush up on my string processing commands first. [[User:Frietjes|Frietjes]] ([[User talk:Frietjes|talk]]) 17:05, 20 October 2025 (UTC)
addRow({
:::{{ping|Frietjes}} I know you have a ton of other things you are working on, but I just want to voice that I would '''love''' to see this fixed... It is causing an issue with basically anything that uses {{para|module}} via [[Module:Template wrapper]]. For example all the Infoboxes in {{clc|Category:Templates calling Infobox sportsperson}} or {{clc|Category:Templates calling Infobox person}} have this issue. If I can be helpful in anyway, please ping me! '''[[User:Zackmann08|<span style="color:#00ced1">Zack</span><span style="color:#007F94">mann</span>]]''' (<sup>[[User_talk:Zackmann08|Talk to me]]</sup>/<sub>[[Special:Contributions/Zackmann08|<span style="color:orange;">What I been doing</span>]]</sub>) 07:25, 22 October 2025 (UTC)
header = args['header' .. tostring(num)],
::::{{u|Zackmann08}}, feel free to work on it if you want. the "fixChildBoxes" function is supposed to make the output tidy by making sure the td, th, and tr tags are properly matched, but that might not be working either right now. the two ways I can see making this work are (a) have the generated empty rows styled with "display:none" or (b) detect when a child box is being passed without any content outside of the child box and insert that directly, without having it inside of a table cell.  the second option seems nicer since it doesn't have extra blank rows marked as "display:none". [[User:Frietjes|Frietjes]] ([[User talk:Frietjes|talk]]) 17:12, 22 October 2025 (UTC)
label = args['label' .. tostring(num)],
:::::{{ping|Frietjes}} so this may be beyond my talents, but I'll take a stab at it tonight. '''[[User:Zackmann08|<span style="color:#00ced1">Zack</span><span style="color:#007F94">mann</span>]]''' (<sup>[[User_talk:Zackmann08|Talk to me]]</sup>/<sub>[[Special:Contributions/Zackmann08|<span style="color:orange;">What I been doing</span>]]</sub>) 17:20, 22 October 2025 (UTC)
data = args['data' .. tostring(num)],
::::::Tried anything yet? [[User:Cosmo Skerry|Cosmo Skerry]] ([[User talk:Cosmo Skerry|talk]]) 22:22, 23 October 2025 (UTC)
datastyle = args.datastyle,
:::::::I will confess I have not... I've been stuck on other projects. {{smiley|sad}} '''[[User:Zackmann08|<span style="color:#00ced1">Zack</span><span style="color:#007F94">mann</span>]]''' (<sup>[[User_talk:Zackmann08|Talk to me]]</sup>/<sub>[[Special:Contributions/Zackmann08|<span style="color:orange;">What I been doing</span>]]</sub>) 22:26, 23 October 2025 (UTC)
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
-- @deprecated next; target .infobox-<name> rowclass
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)]
})
end
end


local function renderNavBar()
== image flip ==
if not args.name then return end


has_rows = true
Is there a way to flip images in an infobox? The image flip template does not seem to work with it. ←&nbsp;[[User:Metallurgist|Metallurgist]] ([[User talk:Metallurgist|talk]]) 00:49, 2 December 2025 (UTC)
root
:I'm pretty sure that there was a discussion on this some years ago, the overwhelming consensus being that image flipping (left to right) was not to be encouraged, because it could be seen as misleading; but I can't find it now. That said, our image policies and guidelines are spread about over many pages, and it's often difficult to find even simple things - like the policy on recommended sizes is not on the same page as the policy on captions. --[[User:Redrose64|<span style="color:#a80000; background:#ffeeee; text-decoration:inherit">Red</span>rose64]] &#x1f339; ([[User talk:Redrose64|talk]]) 16:48, 2 December 2025 (UTC)
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-navbar')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
 
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(require('Module:Italic title')._main({}))
end
end
 
-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
for _, s in ipairs(empty_row_categories) do
root:wikitext(s)
end
end
 
-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
if yesno(args.decat) then return end
if args.child == 'yes' then
if args.title then
root:wikitext(
'[[Category:Pages using embedded infobox templates with the title parameter]]'
)
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles using infobox templates with no data rows]]')
end
end
 
--[=[
Loads the templatestyles for the infobox.
 
TODO: FINISH loading base templatestyles here rather than in
MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables.
See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.
 
]=]
local function loadTemplateStyles()
local frame = mw.getCurrentFrame()
local hlist_templatestyles = ''
if lists.hlist_t.found then
hlist_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = lists.hlist_t.styles }
}
end
local plainlist_templatestyles = ''
if lists.plainlist_t.found then
plainlist_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = lists.plainlist_t.styles }
}
end
-- See function description
local base_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' }
}
 
local templatestyles = ''
if args['templatestyles'] then
templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] then
child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] then
grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
-- hlist -> plainlist -> base is best-effort to preserve old Common.css ordering.
-- this ordering is not a guarantee because the rows of interest invoking
-- each class may not be on a specific page
hlist_templatestyles,
plainlist_templatestyles,
base_templatestyles,
templatestyles,
child_templatestyles,
grandchild_templatestyles
})
end
 
-- common functions between the child and non child cases
local function structure_infobox_common()
renderSubheaders()
renderImages()
preprocessRows()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderEmptyRowCategories()
renderTrackingCategories()
cleanInfobox()
end
 
-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
if args.child ~= 'yes' then
root = mw.html.create('table')
 
root
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
:addClass(args.bodyclass)
-- @deprecated next; target .infobox-<name>
:cssText(args.bodystyle)
has_list_class({ args.bodyclass })
 
renderTitle()
renderAboveRow()
else
root = mw.html.create()
 
root
:wikitext(args.title)
end
structure_infobox_common()
return loadTemplateStyles() .. root
end
 
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
 
-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
 
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
(v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present
-- and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
 
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
-- Do another loop if any arguments are found, even blank ones.
moreArgumentsExist = true
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present
-- and not blank, or we are processing "prefix1" and "prefix" is
-- present and not blank, and if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
 
-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()
 
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
-- different behaviour for italics if blank or absent
args['italic title'] = origArgs['italic title']
preprocessSingleArg('decat')
preprocessSingleArg('templatestyles')
preprocessSingleArg('child templatestyles')
preprocessSingleArg('grandchild templatestyles')
end
 
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
 
-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p

Revision as of 23:40, 12 December 2025

Template:Permanently protected Template:Talkheader Template:WikiProject banner shell User:MiszaBot/config Script error: No such module "Sidebar".

Notelist inside infobox

There is a request at Template talk:Infobox sports season to implement explanatory notes inside the infobox, to avoid the notes getting confused with other groups of notes lower down the article. Apparently this has already been done at Template:Infobox college basketball team. I'm posting here in case anyone has an opinion about this, or whether this could more efficiently be coded at the meta module instead. — Martin (MSGJ · talk) 21:42, 23 June 2025 (UTC)

So just to be clear there are infoboxs out there that have the footnotes at the end of the info box making the box longer with notes that are in very small text? Why would we clutter the lead in this way? I think I have seen this before..... this is something that pop culture articles do? Moxy🍁 22:17, 23 June 2025 (UTC)
I have not noticed these infoboxes previously. I think small text is a bad idea because infoboxes are already at a smaller size. The proposal at Infobox sports season is a collapsed box with the notes in — Martin (MSGJ · talk) 22:29, 23 June 2025 (UTC)
Its odd we have groups of article's so different than others and want to hide things all the time making things unaccessible. Like Template:Toronto Raptors .... why are we hiding all the links in the header? Moxy🍁 22:37, 23 June 2025 (UTC)
It's against MOS:COLOUR which says Template:Tq For some time now, I have been suggesting that if navboxes need colours that are not the default, the approach taken by the religious people has its merits. See for example the navboxes at Tricia Hillas. Only the topmost bar is styled, to have: background white; unlinked text black; linked text default; top and bottom borders coloured. --Redrose64 🌹 (talk) 08:18, 24 June 2025 (UTC)
Why are we talking about colour? It is not relevant to what is being discussed here — Martin (MSGJ · talk) 10:07, 24 June 2025 (UTC)
Moxy asked "why are we hiding all the links in the header?" To me they're hidden by being the same colour as the unlined text. --Redrose64 🌹 (talk) 21:15, 24 June 2025 (UTC)
.... Perhaps I better be more clear here. Why is it that sports projects go out of their way to hide links and information in most of their templates..... for example colored links and of hiding the sources/notes in an info box. Moxy🍁 22:04, 24 June 2025 (UTC)
To the original question: examples please, of where these notes are present within the infobox. --Redrose64 🌹 (talk) 08:18, 24 June 2025 (UTC)
There are some examples in the /testcases — Martin (MSGJ · talk) 10:08, 24 June 2025 (UTC)

FWIW, I fixed the MOS:SMALLFONT accessibility problem at {{Infobox college basketball team}} that was caused by embedding a {{notelist}} inside an infobox. That sort of fix would be needed for any other infobox that included the same embedding. You can see notes in an infobox at LIU Sharks men's basketball. – Jonesey95 (talk) 20:09, 26 June 2025 (UTC)

Template:Re I added your solution to the accessibility problem to Help:Footnotes#Issues. Inspired by a comment from MSGJ, I looked at several infoboxes that allow for the display of footnotes. They generally do so by creating a series of parameters, which limits the number of footnotes available (not necessarily a bad thing). I did not find any others that call {{notelist}}, which seems far more simple to me. Hopefully, if anyone else decides to implement this, they will see the note I left on the help page. I'm glad MSGJ reached out this talk page for advice. Thanks for your help. Taxman1913 (talk) 19:02, 14 July 2025 (UTC)

Overridden dark mode background is almost but not identical to default

These lines override some backgrounds in dark mode to #1f1f23. This is very close to the default infobox background of --background-color-interactive-subtle (#202122), but neither exactly the same nor different enough to distinguish these elements from the rest of the infobox. Is this intentional? EvenTwist41 (talk) 01:21, 17 September 2025 (UTC)

Collapsing Infoboxes?

I know if this isn't the perfect place to be discussing transclusion, but I've noticed a couple of timeline templates using the infobox template, that have the ability to collapse. Like these:

Template:Paramount Skydance evolution

Template:WildBrain evolution

I'm struggling to incorporate this on a MediaWiki wiki I'm creating. (Template:Paramount evolution - Altcyclopedia) Any idea how to do it? - BiggieSMLZ (talk) 21:30, 4 October 2025 (UTC)

The classes in use in those templates are collapsible and its friend. These classes are aliased locally to mw-collapsible and its friend, which is the standard name. Try those names instead. Izno (talk) 04:52, 5 October 2025 (UTC)
I inserted mw-collapsible in place of collapsed on my template ([https://altcyclopedia.miraheze.org/wiki/Template:Paramount_evolution?action=edit) , but it still had no effect. BiggieSMLZ (talk) 09:59, 5 October 2025 (UTC)

Patch: make |decat=yes prevent categorization from Module:Infobox under Category:Pages using infobox templates with ignored data cells too

Template:Edit template-protected

If you change line #167 in Module:Infobox from

if rowArgs.data then

to

if rowArgs.data and (args.decat ~= 'yes') then

then |decat=yes will also prevent categorizing because of ignored data cells.

I'd also suggest changing the module to use Module:Yesno since |decat=Yes doesn't work as intended, for example, as I discovered before adding the right parameter to the first example under Template:Infobox/doc#Examples in my local copy of the doc. Tactica (talk) 19:50, 14 October 2025 (UTC)

Template:Done * Pppery * it has begun... 23:40, 12 December 2025 (UTC)

Can the blank rows on child infoboxes be fixed?

(This discussion started at Template talk:Infobox social media personality#Layout when a user reported an infobox with two blank rows. I'm copying over my text from there.)

The blank rows are related to embedding using |child=yes. Almost all of the testcases have a blank line or two, on both desktop and mobile, with this markup:

<tr><td colspan="2" class="infobox-full-data"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1316064257"></td></tr>

One blank line is always created at the beginning of this wrapper template (in-between {{Infobox person}}'s rows and the custom rows for this infobox), and a second is created when embedding this template into another. Both are direct results of |child=yes, which creates a blank row where |title= would be listed. It simply does not suppress this row if the title is left blank. The blank row does NOT occur if you embed using |subbox=yes instead. This issue is actually already mentioned at Template:Infobox#Embedding. A workaround/solution is listed but it would have to be applied everywhere that |child=yes is used. This is something that should be fixed directly at Module:Infobox instead.


Can this possibly be fixed by someone familiar with how this module functions? I've searched through the talk page archives and it seems like this issue may have been fixed in the past. Prefall 21:09, 15 October 2025 (UTC)

The lack of suppression for this row is not shocking. It has to do with how infobox just magically sucks up child infoboxes into its structure. (That hack may somewhen go away, but not anytime soon.)
@Frietjes, if you're around, since you solved some of this the last go around. Izno (talk) 23:53, 16 October 2025 (UTC)
Izno, it's been sometime since I looked at this code. my guess right now is that if we change the code block starting near line 52 to move the categories and templatestyles outside of the cells and to the top of the output this could fix the problem. I will try to find some time to look at it, but I need to brush up on my string processing commands first. Frietjes (talk) 17:05, 20 October 2025 (UTC)
Template:Ping I know you have a ton of other things you are working on, but I just want to voice that I would love to see this fixed... It is causing an issue with basically anything that uses |module= via Module:Template wrapper. For example all the Infoboxes in Category:Templates calling Infobox sportsperson (0) or Category:Templates calling Infobox person (0) have this issue. If I can be helpful in anyway, please ping me! Zackmann (Talk to me/What I been doing) 07:25, 22 October 2025 (UTC)
Template:U, feel free to work on it if you want. the "fixChildBoxes" function is supposed to make the output tidy by making sure the td, th, and tr tags are properly matched, but that might not be working either right now. the two ways I can see making this work are (a) have the generated empty rows styled with "display:none" or (b) detect when a child box is being passed without any content outside of the child box and insert that directly, without having it inside of a table cell. the second option seems nicer since it doesn't have extra blank rows marked as "display:none". Frietjes (talk) 17:12, 22 October 2025 (UTC)
Template:Ping so this may be beyond my talents, but I'll take a stab at it tonight. Zackmann (Talk to me/What I been doing) 17:20, 22 October 2025 (UTC)
Tried anything yet? Cosmo Skerry (talk) 22:22, 23 October 2025 (UTC)
I will confess I have not... I've been stuck on other projects. Template:Smiley Zackmann (Talk to me/What I been doing) 22:26, 23 October 2025 (UTC)

image flip

Is there a way to flip images in an infobox? The image flip template does not seem to work with it. ← Metallurgist (talk) 00:49, 2 December 2025 (UTC)

I'm pretty sure that there was a discussion on this some years ago, the overwhelming consensus being that image flipping (left to right) was not to be encouraged, because it could be seen as misleading; but I can't find it now. That said, our image policies and guidelines are spread about over many pages, and it's often difficult to find even simple things - like the policy on recommended sizes is not on the same page as the policy on captions. --Redrose64 🌹 (talk) 16:48, 2 December 2025 (UTC)