Module:Election box US auto
Appearance
![]() | This module is rated as beta, and is ready for widespread use. It is still new and should be used with some caution to ensure the results are as expected. |
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 ) )
end
function make( frame )
local contest = frame.args[1]
-- 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
link = frame.args[v[2] .. " link"]
if not link then
link = v[2]
end
-- Strip disambiguators since we can't use the pipe trick
display_name, ignore = mw.ustring.gsub(link, "%b()", "")
temp = temp .. "|candidate=[[" .. link .. "|" .. display_name .. "]]"
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