Edge Rewrite
// HTMLRewriter · presentation

This page was redesigned at the edge.

Cloudflare fetched the original article and streamed it through HTMLRewriter to apply an entirely new visual system without rebuilding the source page.

Jump to content

Module:Sandbox/Ahecht/bartable

From Wikipedia, the free encyclopedia

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