Module:Infobox

local util_html = require('Module:HTMLUtil') local util_text = require('Module:Text') local lang = mw.getLanguage('en') local CLASSES = { title = 'infobox-title', notice = 'infobox-notice' } local sep = '%s*,%s*'

function layoutFromArgs(args) local layout = { tabs = args.tabs, sections = util_text.split(args.sections,sep), contents = {}, i18n = {}, }	for k, v in ipairs(layout.sections) do		layout.contents[k] = util_text.split(args[v],sep) local section = layout.contents[k] local names = args[v .. '_names'] and util_text.split(args[v .. '_names'],sep) for i, field in ipairs(section) do layout.i18n[field] = args[field .. '_name'] or names and names[i] end end return layout end

-- build infobox

function addHeading(tbl, content, class) tbl:tag('tr') :tag('th') :attr('colspan','2') :addClass(class and CLASSES[class] or '') :wikitext(content) :done :done return end

function addNormalRow(tbl, label, content) tbl:tag('tr') :tag('td') :addClass('infobox-label') :wikitext(label) :done :tag('td') :wikitext(content) :done :done return end function addWideRow(tbl, content) tbl:tag('tr') :tag('td') :attr('colspan','2') :addClass('infobox-wide') :wikitext(content) :done :done return end

function printFinalInfobox(infoboxType, layout, display) local tbl = mw.html.create('table') :addClass('infobox') if infoboxType then tbl:addClass('Infobox' .. infoboxType) :attr('id','infobox' .. infoboxType) end if display.notice then addHeading(tbl, display.notice,'notice') end addHeading(tbl,layout.lc and lang:lcfirst(display.title) or display.title, 'title') if display.image then addWideRow(tbl, string.format('', display.image)) end for k, v in ipairs(layout.sections) do		heading_already = false for _, v2 in ipairs(layout.contents[k]) do			if display[v2] then if not heading_already then addHeading(tbl, v)					heading_already = true end if layout.contents[k][v2] == 'wide' then addWideRow(tbl, display[v2]) else addNormalRow(tbl, display.names and display.names[v2] or layout.i18n[v2] or v2, display[v2]) end end end end return tbl end

function storeCargo(frame, nocargo, data) if nocargo then return end for _, tbl in ipairs(data) do		frame:callParserFunction{ name = '#cargo_store', args = tbl }	end return end

function setLC(frame, lc) if not lc then return end local title = mw.title.getCurrentTitle.text frame:callParserFunction{ name = 'DISPLAYTITLE', args = lang:lcfirst(title) } return end

function setVariables(frame, data) for k, v in pairs(data) do		-- table may have entries that are false if v then frame:callParserFunction{ name = '#vardefine:' .. k,				args = { v } }		end end return end

function setCategories(data, nocat) if nocat then return '' end local tbl = {} for _, v in ipairs(data) do		tbl[#tbl+1] = (""):format(v) end return table.concat(tbl, '') end

local p = {} function p.fromPreload(frame) if frame == mw.getCurrentFrame then args = require('Module:ProcessArgs').merge(true) else frame = mw.getCurrentFrame end local infoboxType = args.infoboxType local preload = require('Module:Infobox/' .. infoboxType) local data = preload.main(args) return p.main(frame, data, infoboxType) end

function p.fromArgs(frame) if frame == mw.getCurrentFrame then args = require('Module:ProcessArgs').overwrite(true) else frame = mw.getCurrentFrame end local data = { layout = layoutFromArgs(args), display = args, cargo = {}, categories = {}, settings = {}, variables = {}, }	return p.main(frame, data) end

function p.main(frame, data, infoboxType) setLC(frame, data.settings.lc) setVariables(frame, data.variables or {}) storeCargo(frame, data.settings.nocargo, data.cargo or {}) local output = { args.tabs and frame:expandTemplate{title = args.tabs} or '', tostring(printFinalInfobox(infoboxType, data.layout, data.display)), setCategories(data.categories or {}, data.settings.nocat) }	return table.concat(output,'') end return p