Jump to content

Module:Infobox

From VassarWiki
Revision as of 22:25, 30 May 2026 by EdwardNWM (talk | contribs) (titlebg light and dark mode)

Documentation for this module may be created at Module:Infobox/doc

local p = {}

function p.render(frame)
	local args = frame:getParent().args
	local root = mw.html.create('table')
	    :addClass('infobox')
	    :css('border', '1px solid var(--vw-border)')
	    :css('border-radius', '4px')
	    :css('overflow', 'hidden')
	    :css('font-size', '90%')
	    :css('background', 'var(--vw-bg-subtle)')
	    :css('padding-bottom', '4px')
		
	local titlebg
	if (args['titlebg-light'] and args['titlebg-light'] ~= '') or
	   (args['titlebg-dark']  and args['titlebg-dark']  ~= '') then
	    local light = (args['titlebg-light'] and args['titlebg-light'] ~= '') and args['titlebg-light'] or 'var(--vw-accent-subtle)'
	    local dark  = (args['titlebg-dark']  and args['titlebg-dark']  ~= '') and args['titlebg-dark']  or 'var(--vw-accent-subtle)'
	    titlebg = 'light-dark(' .. light .. ', ' .. dark .. ')'
	else
	    titlebg = (args.titlebg and args.titlebg ~= '') and args.titlebg or 'var(--vw-accent-subtle)'
	end
	if args.title and args.title ~= '' then
	    root:tag('tr')
	        :tag('th')
	            :attr('colspan', '2')
	            :css('width', '100%')
	            :css('text-align', 'center')
	            :css('font-size', '125%')
	            :css('background', titlebg)
	            :css('padding', '6px')
	            :wikitext(args.title)
	end
	
	-- Image
	if args.image and args.image ~= '' then
	    local caption = args.caption or ''
	    local imgBottomPad = caption ~= '' and '6px 6px 2px 6px' or '6px'
	    root:tag('tr')
	        :tag('td')
	            :attr('colspan', '2')
	            :css('text-align', 'center')
	            :css('padding', imgBottomPad)
	            :wikitext('[[File:' .. args.image .. '|300px]]')
	    if caption ~= '' then
	        root:tag('tr')
	            :tag('td')
	                :attr('colspan', '2')
	                :css('text-align', 'center')
	                :css('padding', '0px 6px 4px 6px')
	                :wikitext(caption)
	    end
	end

	-- Data rows
	local i = 1
	while args['label' .. i] or args['data' .. i] or args['header' .. i] do
		local header = args['header' .. i]
		local label  = args['label' .. i]
		local data   = args['data' .. i]

		if header and header ~= '' then
			root:tag('tr')
				:tag('th')
					:attr('colspan', '2')
					:css('width', '100%')
					:css('text-align', 'center')
					:css('background', 'var(--vw-bg-heading)')
					:css('padding', '4px 6px')
					:wikitext(header)
		elseif data and data ~= '' then
			local row = root:tag('tr')
			if label and label ~= '' then
				row:tag('th')
					:css('text-align', 'left')
					:css('padding', '2px 6px 2px 6px')
					:css('background', 'var(--vw-bg-subtle)')
					:css('width', '45%')
					:wikitext(label)
			end
			row:tag('td')
				:css('padding', '2px 6px 2px 6px')
				:attr('colspan', (label and label ~= '') and '1' or '2')
				:wikitext(data)
		end
		i = i + 1
	end
	return tostring(root)
end

return p