Module:Sandbox/ChaoticShadow/InfoboxBuilder

Revision as of 05:39, 14 June 2021 by ChaoticShadow (talk | contribs) (Created page with "local InfoboxBuilder = {} InfoboxBuilder.__index = InfoboxBuilder InfoboxBuilder.__tostring = InfoboxBuilder.tostring local tagmap = { tr = 'tr', td = 'td', argtr = 'tr',...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Documentation for this module may be created at Module:Sandbox/ChaoticShadow/InfoboxBuilder/doc

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