Jump to content

Module:United Nations Security Council election results

From Humanipedia
Revision as of 14:01, 3 February 2025 by Humanipedia (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Usage[edit source]

This module produces a table of results of elections of non-permanent members of the United Nations Security Council.

The numbered arguments contain the votes for the individual countries. Each numbered argument should be a colon-separated list, the last element of which is a comma-separated list of vote counts in the rounds of voting. The remaining elements are the name and arguments of a template to be called to display the country. Usually, this will just be the three-letter country code, so a typical argument would be ITA:65,108,128, which displays the country as Lua error in package.lua at line 80: module 'Module:Yesno' not found.. Some South American countries use a special state variant of their flag at the United Nations; the more general form of the argument allows for such variants; e.g. flag:Peru:state:99,101 displays the country as Lua error in package.lua at line 80: module 'Module:Yesno' not found..

The named arguments are as follows:

Parameter Description Status
valid counts of valid ballots required
invalid counts of invalid ballots optional
abstentions counts of abstentions required
group regional group(s) required
ref content for reference tag optional
ref_name name for reference tag optional
day election day for title optional
round first voting round optional

The counts are specified as comma-separated lists. The counts of valid ballots and abstentions are required; they are used to calculate the number of members present and voting (valid ballots minus abstentions) and the required two-thirds majority (two thirds of those present and voting, rounded up). The counts of invalid ballots may also be specified; they are only displayed if they are not all zero.

The named arguments with counts must specify a count for each round. The numbered arguments may specify fewer counts; the remaining counts are taken to be zero. (This is useful when a country withdraws during the election.) Zero counts for countries (whether specified or not) are displayed as dashes; zero counts in named arguments are displayed as zeros. Country vote counts greater or equal to the required majority are displayed in bold.

If at least one of ref and ref_name is specified, a reference tag is inserted after the table's title. Any number of such reference tags can be produced using ref2 and/or ref_name2 etc. (with ref1 and ref_name1 being aliases for ref and ref_name, respectively). The optional day parameter can be used to specify which of several election days the table refers to; for instance, day=two results in " – day two" being appended to the title. The optional round specifies the number of the first round; the default is 1.

Example[edit source]

Lua error in package.lua at line 80: module 'Module:Yesno' not found.


  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