Module:Sandbox/ChaoticShadow/InfoboxBuilder

local InfoboxBuilder = {} InfoboxBuilder.__index = InfoboxBuilder InfoboxBuilder.__tostring = InfoboxBuilder.tostring

local tagmap = { tr = 'tr', td = 'td', argtr = 'tr', argtd = 'td' }

function InfoboxBuilder.new local obj = setmetatable({		name = '',		params = nil,		paramnames = {},		args = {},		infobox = mw.html.create('table'):addClass('infobox')	}, InfoboxBuilder)

return self end

function InfoboxBuilder.setName(arg) assert(arg ~= nil) self.name = arg return self end

function InfoboxBuilder.setWidth(arg) assert(arg ~= nil) self.infobox:css('width', arg) return self end

function InfoboxBuilder.setParams(...) self.params = {} for i, v in ipairs(...) do		if v.name then if type(v.func) == 'function' or type(v.func) == 'table' or type(v.func) == 'string' then self.params[v.name] = { ['type'] = type(v.func), func = v.func, default = v.default }			table.insert(self.paramnames, v.name) end end end return self end

function InfoboxBuilder.setArgs(args) assert(self.params ~= nil) self.args = args return self end

function InfoboxBuilder.addHeader(arg) local _cell = self.infobox:tag('tr'):tag('th') if arg.attr then _cell:attr(arg.attr) end if arg.colspan then _cell:attr('colspan', arg.colspan) end if arg.rowspan then _cell:attr('rowspan', arg.rowspan) end if arg.css then _cell:css(arg.css) end _cell:wikitext(arg.content) return self end

function InfoboxBuilder.addRow(...) local _row = self.infobox:tag('tr') for i, v in ipairs(...) do		local _cell = _row:tag(tagmap[v.tag] or 'td') if v.attr then _cell:attr(v.attr) end if v.colspan then _cell:attr('colspan', v.colspan) end if v.rowspan then _cell:attr('rowspan', v.rowspan) end if v.css then _cell:css(v.css) end if v.tag == 'th' or v.tag == 'td' then _cell:wikitext(v.content) elseif v.tag == 'argth' or v.tag == 'argtd' then local content = '?' local argparams = self.params[v.content] local arg = self.args[v.content] or self.params[v.content].default if argparams['type'] == 'function' then content = self.params[v.content].func(arg) elseif argparams['type'] == 'table' then content = self.params[v.content][arg] elseif argparams['type'] == 'string' then content = arg end _cell:wikitext(content) end end return self end

return InfoboxBuilder