Module:Sandbox/Ahecht/bartable

From Wikipedia, the free encyclopedia
Jump to navigation Jump to search

local p = {}

local metatable = {	-- Append to array by calling it
	__call = function (t, v) t[#t+1] = v end,
	__tostring = function(t) return table.concat(t) end
}
local function notblank(v) return v or '' ~= '' end
local function ifblank(v, a) return notblank(v) and v or a end

function p._bartable(args)
	local frame = mw.getCurrentFrame()
	local function expr(v, a)
		v = frame:callParserFunction('formatnum', {ifblank(v, a), 'R'})
		v = frame:callParserFunction('#expr', v)
		return tonumber(ifblank(v, a)) or a
	end

	local output = setmetatable({'—'}, metatable)

	if notblank(args[2]) then
		local titleparts = mw.text.split(args[2], '/', true)
		if notblank(titleparts[2]) then
			if notblank(titleparts[1]) then
				output[1] = (args[1] or '') .. args[2]
			else
				local convert = require('Module:Convert')
				local frame = frame:newChild{
					title = 'Template:Convert',
					args = {titleparts[2] or '', titleparts[3] or '', titleparts[4] or '', abbr='on'}
				}
				output[1] = convert(frame)
			end
		else
			output[1] = (args[1] or '') .. args[2]
		end
	end
	
	local arg1 = expr(args[1], 0)
	local arg3 = expr(args[3], 1)
	local width = math.abs(arg3) * arg1
	local height = ifblank(args[4], '2ex')
	
	if arg3 < 0 then
		output('||')
		if arg1 < 0 then
			output('align="right" | <div style="width:' .. 
				(-1 * width) .. 'px;height:' .. height ..
				';background:#aaa;color:inherit;' .. ifblank(args[5], '') ..
				'">&nbsp;</div>'
			)
		end
	end
	
	output('\n|')
	
	if arg1 > 0 then
		output('align="left" | <span style="display:none;">' ..
			arg1 .. '</span><div style="width:' .. width .. 'px;height:' .. 
			height .. ';background:#aaa;color:inherit;' ..
			ifblank(args[5] or '') .. '">&nbsp;</div>'
		)
	end
	
	return output
end

function p.bartable(frame)
	return p._bartable(frame.args)
end

function p.bartableTemplate(frame)
	return p._bartable(frame:getParent().args)
end

return p