Jump to content

Module:Bar

Permanently protected module
From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Ahecht (talk | contribs) at 20:45, 14 April 2020 (actually implement rounding). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')

local p = {}

function p._box(args)
	local width = args.width or 'auto'
	
	local class = 'barbox'
	if args.float == 'left' or args.float == 'right' or args.float == 'none' then
		class = 'barbox t' .. args.float
	elseif args.float == 'center' then
		class = 'barbox tnone'
	end
	
	local output = {}
	
	output[1] = mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = {src=( ((args.css or '') ~= '') and args.css or 'Template:Bar box/styles.css' )} }
	
	if (args.float == 'left') or (args.float == 'right') then
		output[2], output[14] = '', ''
	else
		output[2] =
			'<table style="margin:' .. ( (args.float == 'center') and '0 auto' or 'auto' ) .. '; border:none;">' .. 
				'<tr>' .. 
					'<td style="border:none; padding:0;">'
		output[14] = '</td>' ..
				'</tr>' .. 
			'</table>' .. 
			'[[Category:Pages using bar box without float left or float right|' .. ( (width == 'auto') and 'Ω' or '' ) .. mw.title.getCurrentTitle().text .. ']]'
	end
	
	output[3] = 
		'<div class="' .. class .. '" style="overflow-x: auto;' .. (args.style or '') .. '">\n' ..
		'<div style="border:' .. (args.border_width or '1') .. 'px solid silver; font-size:88%; padding:0.4em; width:' .. width .. '; background: ' .. (args['background-color'] or 'white') .. ';">\n' ..
		'<table style="text-align:left; border-collapse:collapse; width:100%;">\n'
		output[4] = ( ((args.title or '') ~= '') and (
			'<tr style="background:' .. (args.titlebar or 'none') .. '">' ..
				'<th style="text-align:center;" colspan="5">' .. args.title .. '</th>' ..
			'</tr>\n') or '')
		output[5] =
			'<tr style="font-size:88%; height:4px;">\n'
			output[6] =
				'<td ' .. (args.left2 and '' or 'colspan="2"') .. ' style="padding:0 4px; text-align:left;">' .. 
					(args.left1 or '') .. 
				'</td>\n'
			output[7] = ( ((args.left2 or '') ~= '') and (
				'<td style="padding:0 4px; text-align:right;">' .. args.left2 .. '</td>\n') or '')
			output[8] =
				'<td style="width:' .. (args.barwidth or '100px') .. '; text-align:left;"></td>\n' ..
				'<td ' .. (args.right2 and '' or 'colspan="2"') .. ' style="padding:0 4px; width:1em; text-align:right;">' .. 
					(args.right1 or '') .. 
				'</td>\n'
			output[9] = ( ((args.right2 or '') ~= '') and (
				'<td style="padding:0 4px; text-align:right;">' .. args.right2 .. '</td>\n') or '')
		output[10] =
			'</tr>\n'
		output[11] =
			args.bars or ''
		output[12] = ( ((args.caption or '') ~= '') and (
			'<tr><td colspan="5" style="padding:5px; text-align:left;">' .. 
				args.caption .. 
			'</td></tr>\n') or '')
	output[13] =
		'</table>\n</div>\n</div>\n'
	-- output[14] defined above
	
	return table.concat(output)
end

function p._percent(args)
	local output = {}
	local background = ( ((args.bg or '') ~= '') and ('background:' .. args.gb .. ';') or '' )
	local percentage = ( ((args[3] or '') ~= '') and args[3] or '0' ) .. '%'
	
	output[1] = '<tr>\n'
		output[2] = '<td colspan="2" class="bb-4em" style="min-width:8em;' .. background .. '">' .. (args[1] or '') .. '</td>\n'
		output[3] = '<td class="bb-lr" style="width:' .. ( ((args.barwidth or '') ~= '') and args.barwidth or '100px' ) .. ';' .. background .. '">'
			output[4] = '<div style="background:' .. ( ((args[2] or '') ~= '') and args[2] or 'gray' ) .. ';width:' .. percentage .. ';overflow:hidden;">&thinsp;</div>'
		output[5] = '</td>\n'
		output[6] = '<td colspan="' .. ( ((args.note or '') ~= '') and '1' or '2' ) .. '" class="bb-4emr" style="' .. background .. '">' .. ( ((args[4] or '') ~= '') and args[4] or percentage ) .. '</td>\n'
		output[7] = ( ((args.note or '') ~= '') and ('<td class=bb-4emr" style="' .. background .. '">' .. args.note .. '</td>\n') or '' )
	output[8] = '</tr>'
	
	return table.concat(output)
end

function p._pixel(args)
	local output = {}
	local background = ( ((args[2] or '') ~= '') and args[2] or 'gray' )
	local width = ( ((args[3] or '') ~= '') and args[3] or '0' )
	local note = ( ((args.note or '') ~= '') and '1' or '2' )
	
	output[1] =
		'<tr>\n'
		output[2] =
			'<td colspan="2" style="padding-right:0.4em; padding-left:0.4em">' .. (args[1] or '') .. '</td>\n'
		output[3] =
			'<td style="border-left:solid 1px silver;border-right:solid 1px silver;">' ..
				'<div style="background:' .. background .. '; width:' .. width .. 'px; overflow:hidden">' .. 
					'&emsp;' ..
				'</div>' ..
			'</td>\n'
		output[4] =
			'<td colspan="' .. ( ((args.note or '') ~= '') and '1' or '2' ) .. '" class="bb-min3">' ..
				( ((args[5] or '') ~= '') and args[5] or (width .. (args[4] or '')) ) ..
			'</td>\n'
		output[5] = ( ((args.note or '') ~= '')  and (
			'<td style="padding-left:0.4em; padding-right:0.4em; text-align:right">' ..
				args.note ..
			'</td>\n') or '' )
	output[6] =
		'</tr>'
	
	return table.concat(output)
end

function p._stacked(args)
	local function _align(n, default)
		if (args.align or '') ~= '' then
			local a = mw.ustring.sub(args.align,n,n)
			if a == 'l' then
				return 'left'
			elseif a == 'c' then
				return 'center'
			elseif a == 'r' then
				return 'right'
			elseif a == 'd' then
				return default
			end
		end
		
		return default
	end

	local output = {}
	
	output[1] = ( ((args.id or '') ~= '') and (
		'<tr class="mw-collapsible' .. ( yesno(args.collapsed) and ' mw-collapsed' or '') ..
		'" id="mw-customcollapsible-' .. args.id .. '"}}>\n') or '<tr>\n')
		output[2] =
			'<td ' .. (args.note1 and '' or 'colspan="2" ') .. 
			'style="text-align:' .. _align(1,'left') .. '" class="bb-04em">' .. 
				mw.text.trim(args[1] or '') .. 
			'</td>\n'
		output[3] = ( ((args.note1 or '') ~= '') and (
			'<td style="text-align:' .. _align(2,'right') .. '" class="bb-04em">' .. 
				args.note1 .. 
			'</td>\n') or '')
		output[4] =
			'<td class="bb-lr">\n'
			
			for i=1,(( table.maxn(args) - 2 )/2),1 do
				local width = ( mw.text.trim(args[(2*i) + 2]) or 0 )
				width = tonumber( mw.ustring.format("%.2f", width) )
				if width == 0 then
					output[i+4] = ''
				else
					output[i+4] = 
						'<div title=' .. args['title' .. i] ..
						' style="background:' .. (args[(2*i) + 1] or 'gray') ..
						';width:' .. width .. 'px" class="bb-fl">' ..
							'&#8203;' ..
						'</div>\n'
				end
			end
	
		output[#output+1] =
			'</td>\n'
		output[#output+1] = 
			'<td ' .. (args.note2 and '' or 'colspan="2" ') .. 
			'style="text-align:' .. _align(3,'left') .. '" class="bb-04em">' .. 
				mw.text.trim(args[2] or '') .. 
			'</td>\n'
		output[#output+1] = ( ((args.note2 or '') ~= '') and (
			'<td style="text-align:' .. _align(4,'right') .. '" class="bb-04em">' .. 
				args.note2 ..
			'</td>\n') or '')
	output[#output+1] =
		'</tr>\n'
	
	return table.concat(output)
end

function p._gap(args)
	local output = {}
	
	local height = '10px'
	if (args.height or '') ~= '' then
		height = (tonumber(args.height) and (args.height .. 'px') or args.height)
	end
			
	output[1] =
		'<tr>\n'
		output[2] = 
			'<td colspan="5" style="height:'.. height .. '">' .. (args[1] or '') .. '</td>\n'
	output[3] =
		'</tr>\n'

	return table.concat(output)
end

function p.box(frame)
	local args = getArgs(frame, {
		valueFunc = function (key, value)
			if value then
				value = mw.text.trim(value)
				if (key == 'width') or (key == 'float') then
					value = mw.ustring.lower(value)
				end
				if value ~= '' then
					return value
				end
			end
			return nil
		end
	})
	return p._box(args)
end

function p.percent(frame)
	local args = getArgs(frame, {
		valueFunc = function (key, value)
			if value then
				value = mw.text.trim(value)
				if value ~= '' then
					return value
				end
			end
			return nil
		end
	})
	return p._box(args)
end

function p.pixel(frame)
	local args = getArgs(frame, {
		valueFunc = function (key, value)
			if value then
				value = mw.text.trim(value)
				if value ~= '' then
					return value
				end
			end
			return nil
		end
	})
	return p._pixel(args)
end

function p.gap(frame)
	local args = getArgs(frame, {
		valueFunc = function (key, value)
			if value then
				value = mw.text.trim(value)
				if value ~= '' then
					return value
				end
			end
			return nil
		end
	})
	return p._gap(args)
end

function p.stacked(frame)
	local args = getArgs(frame, {
		valueFunc = function (key, value)
			if value then
				value = mw.text.trim(value)
				if (key == 'collapsed') or (key == 'align') then
					value = mw.ustring.lower(value)
				end
				if value ~= '' then
					return value
				end
			end
			return nil
		end
	})
	return p._stacked(args)
end

return p