Difference between revisions of "Module:Election box US auto"

From blackwiki
Jump to navigation Jump to search
blackwiki>Legoktm
(support write-in candidates, make percent() a lot smarter)
blackwiki>Legoktm
(add reference)
Line 1: Line 1:
 
local p = {}
 
local p = {}
 
function get_candidates( contest )
 
-- TODO: parameterize year and election
 
local data = mw.ext.data.get("California Elections/2016 Presidential General/Candidates.tab").data
 
local candidates = {}
 
for k,v in pairs(data) do
 
if v[1] == contest then
 
table.insert(candidates, v)
 
end
 
end
 
 
return candidates
 
end
 
  
 
function percent( part, total )
 
function percent( part, total )
Line 34: Line 21:
  
 
function make( contest )
 
function make( contest )
local candidates = get_candidates( contest )
+
-- TODO: parameterize year and election
 +
local tabular = mw.ext.data.get("California Elections/2016 Presidential General/Candidates.tab")
 +
local data = tabular.data
 +
local candidates = {}
 +
for k,v in pairs(data) do
 +
if v[1] == contest then
 +
table.insert(candidates, v)
 +
end
 +
end
 
local total_votes = 0
 
local total_votes = 0
 
local winner = {}
 
local winner = {}
Line 44: Line 39:
 
end
 
end
 
end
 
end
local ret = "{{Election box begin no change| title=[[United States House of Representatives elections, 2016]]}}"
+
-- TODO improve reference? turn it into a named one?
 +
local ret = "{{Election box begin no change| title=[[United States House of Representatives elections, 2016]]<ref>" .. tabular.sources .. "</ref>}}"
 
function sort_candidates(a,b)
 
function sort_candidates(a,b)
 
return a[5] > b[5]
 
return a[5] > b[5]

Revision as of 23:29, 11 November 2018

This is used by {{Election box US auto}}.

Usage

{{#invoke:Election box US auto|function_name}}


local p = {}

function percent( part, total )
	if total >= 1000000 then
		-- if > 1 million votes, then round to 2 decimals
		round_to = 2
	else
		round_to = 1
	end
	local ret = mw.ext.ParserFunctions.expr( "" .. 100 * part / total .. " round " .. round_to )
	if not string.find( ret, ".", 1, true ) then
		-- add the decimals that expr doesn't
		ret = ret .. "." .. string.rep("0", round_to)
	end
	return ret
end

function p.make( frame )
	return frame:preprocess( make( frame.args[1] ) )
end

function make( contest )
	-- TODO: parameterize year and election
	local tabular = mw.ext.data.get("California Elections/2016 Presidential General/Candidates.tab")
	local data = tabular.data
	local candidates = {}
	for k,v in pairs(data) do
		if v[1] == contest then
			table.insert(candidates, v)
		end
	end
	local total_votes = 0
	local winner = {}
	winner[5] = 0
	for k,v in pairs(candidates) do
		total_votes = total_votes + v[5]
		if v[5] > winner[5] then
			winner = v
		end
	end
	-- TODO improve reference? turn it into a named one?
	local ret = "{{Election box begin no change| title=[[United States House of Representatives elections, 2016]]<ref>" .. tabular.sources .. "</ref>}}"
	function sort_candidates(a,b)
		return a[5] > b[5]
	end
	table.sort(candidates, sort_candidates)
	local linked_write_in = false
	for k,v in pairs(candidates) do
		local temp = "{{"
		if v[2] == winner[2] then
			temp = temp .. "Election box winning candidate"
		else
			temp = temp .. "Election box candidate"
		end
		local n_party = normalize_parties( v[3] )
		if n_party then
			temp = temp .. " with party link no change|party=" .. n_party
		else
			temp = temp .. " no party link no change"
		end
		-- FIXME: disambiguators???
		temp = temp .. "|candidate=[[" .. v[2] .. "]]"
		if v[4] then
			-- incumbent
			temp  = temp .. " ([[incumbent]])"
		end
		if v[6] then
			-- write in
			if linked_write_in then
				temp = temp .. " (write-in)"
			else
				temp = temp .. " ([[Write-in candidate|write-in]])"
				linked_write_in = true -- only link it once
			end
		end
		temp = temp .. "|votes={{formatnum:" .. v[5] .. "}}"
		temp = temp .. "|percentage=" .. percent(v[5], total_votes) .. "%"
		temp = temp .. "}}"
		ret = ret .. temp
	end
	ret = ret .. "{{Election box total no change|votes= {{formatnum:" .. total_votes .. "}}|percentage = " .. percent(total_votes, total_votes) .. "%}}"
	-- FIXME: implement {{Election box hold with party link without swing}}?
	ret = ret .. "{{Election box end}}"
	return ret
end

function normalize_parties( party )
	-- Drop all parties after the first one?
	party = mw.text.split( party, ",", true )[1]
	local parties = {
		Democratic = "Democratic Party (United States)",
		Republican = "Republican Party (United States)",
		Blank = "Independent (politician)",
		Libertarian = "Libertarian Party (United States)",
		Green = "Green Party (United States)"
	}
	parties["Peace and Freedom"] = "Peace and Freedom Party"
	parties["No Party Preference"] = "Independent (politician)"
	
	for k, v in pairs(parties) do
		if k == party then
			return v
		end
	end
	-- not found, return false
	return false
end

return p