Module:Side box

    From Nonbinary Wiki

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

    -- This module implements {{side box}}.
    
    local yesno = require('Module:Yesno')
    
    local p = {}
    
    function p.main(frame)
    	local origArgs = frame:getParent().args
    	local args = {}
    	for k, v in pairs(origArgs) do
    		v = v:match('%s*(.-)%s*$')
    		if v ~= '' then
    			args[k] = v
    		end
    	end
    	return p._main(args)
    end
    
    function p._main(args)
    	local data = p.makeData(args)
    	return p.renderSidebox(data)
    end
    
    function p.makeData(args)
    	local data = {}
    
    	-- Main table classes
    	data.classes = {}
    	if yesno(args.metadata) ~= false then
    		table.insert(data.classes, 'metadata')
    	end
    	if args.position and args.position:lower() == 'left' then
    		table.insert(data.classes, 'mbox-small-left')
    	else
    		table.insert(data.classes, 'mbox-small')
    	end
    	table.insert(data.classes, args.class)
    	
    	-- Image
    	if args.image and args.image ~= 'none' then
    		data.image = args.image
    	end
    
    	-- Copy over data that doesn't need adjusting
    	local argsToCopy = {
    		-- Styles
    		'style',
    		'textstyle',
    
    		-- Above row
    		'above',
    		'abovestyle',
    
    		-- Body row
    		'text',
    		'imageright',
    
    		-- Below row
    		'below',
    	}
    	for i, key in ipairs(argsToCopy) do
    		data[key] = args[key]
    	end
    
    	return data
    end
    
    function p.renderSidebox(data)
    	-- Renders the sidebox HTML.
    
    	-- Table root
    	local root = mw.html.create('table')
    	root:attr('role', 'presentation')
    	for i, class in ipairs(data.classes or {}) do
    		root:addClass(class)
    	end
    	root:css{border = '1px solid #aaa', ['background-color'] = '#f9f9f9', color = '#000'}
    	if data.style then
    		root:cssText(data.style)
    	end
    
    	-- The "above" row
    	if data.above then
    		local aboveCell = root:newline():tag('tr'):tag('td')
    		aboveCell
    			:attr('colspan', data.imageright and 3 or 2)
    			:addClass('mbox-text')
    		if data.textstyle then
    			aboveCell:cssText(data.textstyle)
    		end
    		if data.abovestyle then
    			aboveCell:cssText(data.abovestyle)
    		end
    		aboveCell
    			:newline()
    			:wikitext(data.above)
    	end
    
    	-- The body row
    	local bodyRow = root:newline():tag('tr'):newline()
    	if data.image then
    		bodyRow:tag('td')
    			:addClass('mbox-image')
    			:wikitext(data.image)
    	else
    		bodyRow:tag('td'):css('width', '1px')
    	end
    	local textCell = bodyRow:newline():tag('td')
    	textCell:addClass('mbox-text plainlist')
    	if data.textstyle then
    		textCell:cssText(data.textstyle)
    	end
    	textCell:wikitext(data.text)
    	if data.imageright then
    		bodyRow:newline():tag('td')
    			:addClass('mbox-imageright')
    			:wikitext(data.imageright)
    	end
    
    	-- The below row
    	if data.below then
    		local belowCell = root:newline():tag('tr'):tag('td')
    		belowCell
    			:attr('colspan', data.imageright and 3 or 2)
    			:addClass('mbox-text')
    		if data.textstyle then
    			belowCell:cssText(data.textstyle)
    		end
    		belowCell:wikitext(data.below)
    	end
    
    	root:newline()
    	return tostring(root)
    end
    
    return p