Module:United Nations Security Council election results

  1. ^ United Nations General Assembly Session 70 Verbatim record 106. A/70/PV.106 page 2. 28 June 2016 at 10 a.m. Retrieved 4 August 2024.
local p = {}

local function addNumbers (label,data)
	maxcols = math.max (maxcols,#data)
	table.insert (array,data)
	table.insert (labels,label)
end

local function addRow (label,data)
	data = mw.text.split(data,",")
	for i = 1,#data do
		data [i] = tonumber (data [i])
	end
	addNumbers (label,data)
end

local function appendLine (line)
	result = result .. line .. "\n"
end

local function buildReferences (r)
	r.ref1 = r.ref or r.ref1
	r.ref_name1 = r.ref_name or r.ref_name1
	local s = ""
	local i = 1
	while true do
	    local ref = r ["ref" .. i]
	    local ref_name = r ["ref_name" .. i]
		-- an actual reference and/or a reference name may be provided
	    if not (ref or ref_name) then return s end
		s = s .. "<ref"
		if ref_name then s = s .. " name=\"" .. ref_name .. "\"" end
		s = s .. ">" .. (ref or "") .. "</ref>"
		i = i + 1
	end
end

function p.table (frame)
	labels = {} -- first column
	array = {}  -- matrix of numeric data
	maxcols = 0 -- maximum number of columns
	-- iterate over the numbered arguments with country data, e.g. ITA:113,92,94,95,95
	for i,parameter in ipairs (frame.args) do
		local parts = mw.text.split (parameter,":")
		addRow (frame:expandTemplate{title = parts [1],args = {unpack (parts,2,#parts - 1)}},parts [#parts]); -- ITA yields {{ITA}}, flag:Peru:state yields {{flag|Peru|state}}
	end
	
	local last = #array
	
	addRow ("valid ballots",frame.args.valid)
	if frame.args.invalid and string.match(frame.args.invalid,"[^0,]") then
		addRow ("invalid ballots",frame.args.invalid) -- add invalid ballots if they’re specified and not all zero
	end
	addRow ("abstentions",frame.args.abstentions)
	
	-- compute vote count and required majority from counts of ballots and abstensions
	local voting = {}
	local required = {}
	for i=1,maxcols do
		local votes = array [last + 1] [i] - array [#array] [i] -- valid ballots minus abstentions
		table.insert (voting,votes)
		table.insert (required,math.ceil (votes * 2 / 3))
	end

	addNumbers ("present and voting",voting)
	addNumbers ("required majority",required)

	result = ""
	
	appendLine ("{| class=\"wikitable collapsible\" style=\"text-align: center;\"");
	appendLine ("|-")
	appendLine ("! colspan=\"" .. (maxcols + 1) .. "\" | " .. frame.args.group .. " election results" ..
		(frame.args.day and (" – day " .. frame.args.day) or "") .. frame:preprocess (buildReferences (frame.args)))
	appendLine ("|-")
	appendLine ("! Member")
	
	local round = frame.args.round or 1
	
	for i=0,maxcols - 1 do
		appendLine ("| style=\"background:silver;\"|'''Round " .. (i + round) .. "'''")
	end

	for j,label in ipairs (labels) do
		result = result .. "|-\n| style=\"text-align:left;\" | " .. label
		local isCountry = j <= last
		for i=1,maxcols do
			local value = array [j] [i]
			local bold = isCountry and value and value >= array [#array] [i] and "'''" or "" -- bold vote count if it’s at least the required majority
			result = result .. "|| " .. bold .. ((not isCountry or (value and value ~= 0)) and value or "—") .. bold -- missing or zero vote counts are replaced by em dashes
		end
		result = result .. "\n"
	end

	result = result .. "|}"

	return result
end

return p