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 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 )
return mw.ext.ParserFunctions.expr( "" .. 100 * part / total .. " round 1" )
end
function p.make( frame )
return frame:preprocess( make( frame.args[1] ) )
end
function make( contest )
local candidates = get_candidates( contest )
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
local ret = "{{Election box begin no change| title=[[United States House of Representatives elections, 2016]]}}"
function sort_candidates(a,b)
return a[5] > b[5]
end
table.sort(candidates, sort_candidates)
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
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 = 100.0%}}"
-- 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