Mô đun:Election box US auto

local p = {}
local mYesno = require('Mô đun:Yesno')
-- a global per invoke
local linked_write_in = false

function formatnum( num )
-- simple wrapper
local lang = mw.getContentLanguage()
return lang:formatNum( num )
end

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( invoke )
frame = invoke:getParent()
local state, year, contest, type = parse_args( frame.args )
local ret = ""
local no_headings = mYesno(frame.args["no headings"])
if string.find(year, ",", 1, true ) then
-- multi mode
for i,v in pairs(mw.text.split( year, ",", true )) do
if not no_headings then
ret = ret .. "\n " .. v .. " "
end
ret = ret .. make( state, v, contest, type, year_args(v, frame.args) )
end
else
ret = ret .. make( state, year, contest, type, frame.args )
end
return invoke:preprocess( ret )
end

function fmt_candidate(v, winner, total_votes,args, usestateparties)
local temp = ""
return temp
end

function parse_args( args )
local state = args[1]
if not state then
error("Bang bị thiếu")
end
local year = args[2]
if not year then
error("Năm bị thiếu")
end
local contest = args[3]
if not contest then
error("Tranh tài bị thiếu")
end
local type = "chung"
if args.type then
if args.type == "Primary" then
type = "sơ bộ"
else
error("Giá trị không hợp lệ cho |type=")
end
end
return state, year, contest, type
end

function year_args( year, args )
-- we want to turn year args like "|2018 foo=" into just foo
-- drop any other year args like "|2016 foo="
-- and have year args override general args
-- finally have general args
local new = {}
for k,v in pairs(args) do
local k_year = mw.ustring.match(k, "^%d%d%d%d ")
if k_year then
k_year = mw.text.trim(k_year)
end
if k_year and k_year == year then
new[mw.ustring.sub(k, 6)] = v
elseif k_year and k_year ~= year then
-- do nothing
else
-- if k isn't set yet, set it.
if not new[k] then
new[k] = v
end
end
end
return new
end

function make( state, year, contest, type, args )
function load_tabular( state, year, type )
local tab_name = state .. " Elections/" .. year .. "/" .. type .. "/Candidates.tab"
local tabular = mw.ext.data.get(tab_name)
if tabular then
return tabular
else
return {error="Không thể tìm thấy dữ liệu dạng bảng: " .. tab_name}
end
end
local tabular = load_tabular(state, year, type)
if tabular.error then
error(tabular.error)
end
function find_candidates(data, contest)
local candidates = {}
for k,v in pairs(data) do
if v[1] == contest then
table.insert(candidates, v)
end
end
return candidates
end
local candidates = find_candidates(tabular.data, contest)
function sum_totals(candidates)
local total_votes = 0
local incumb_party = false
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
if v[4] or args.incumbent == v[2] then
incumb_party = v[3]
end
end
return total_votes, winner, incumb_party
end
local total_votes, winner, incumb_party = sum_totals(candidates)
local usestateparties = nil
if mw.ustring.find(contest, "United States Representative", 1, true) then
title = "Bầu cử Hạ viện Hoa Kỳ năm " .. year .. ""
elseif mw.ustring.find(contest, "State Assembly Member", 1, true) then
title = "Bầu cử quốc hội tiểu bang " .. state .. " năm " .. year .. ""
usestateparties = state
elseif contest == "Tổng thống" then
title = "Bầu cử tổng thống Hoa Kỳ ở " .. state .. " năm " .. year
else
title = "...????"
end
local primary = mYesno(args.primary)
ptabular = load_tabular(state, year, "sơ bộ")
if ptabular.error then
-- todo log an error here?
primary = false
end
if primary then
open = "Election box open primary begin no change"
else
open = "Election box begin no change"
end
function make_ref(tabular)
return '"
end
local ref = make_ref(tabular)
if primary then
-- primary ref goes first
ref = make_ref(ptabular) .. ref
end
local ret = ""
function total_box(total_votes)
return ""
end
function sort_candidates(a,b)
return a[5] > b[5]
end
table.sort(candidates, sort_candidates)
if primary then
local pcandidates = find_candidates(ptabular.data, contest)
table.sort(pcandidates, sort_candidates)
local ptotal_votes, pwinner, pincumb_party = sum_totals(pcandidates)
local fake_winner = {}
-- we don't want a winner in primaries, so use a fake one that no
-- candidate will match
fake_winner[2] = ""
for k,v in pairs(pcandidates) do
ret = ret .. fmt_candidate(v, fake_winner,ptotal_votes,args,usestateparties)
end
ret = ret .. total_box(ptotal_votes) .. ""
end

for k,v in pairs(candidates) do
ret = ret .. fmt_candidate(v, winner,total_votes,args,usestateparties)
end
ret = ret .. total_box(total_votes)
local hold = args.hold
local gain = false
if hold "held" or winner[4] or args.incumbent winner[2] then
ret = ret .. ""
elseif hold == "flip" then
-- shorthand for D->R/R->D
win_party = winner[3]
if win_party == "Dân chủ" then
lose_party = normalize_parties("Cộng hòa",usestateparties)
else
lose_party = normalize_parties("Dân chủ",usestateparties)
end
win_party = normalize_parties(win_party)
gain = true
elseif args.gain then
win_party = normalize_parties(args.gain,usestateparties)
lose_party = normalize_parties(args.loser,usestateparties)
gain = true
elseif incumb_party and incumb_party ~= winner[3] then
win_party = normalize_parties(winner[3],usestateparties)
lose_party = normalize_parties(incumb_party,usestateparties)
gain = true
end
if gain then
ret = ret .. ""
end

ret = ret .. ""
return ret
end

function normalize_parties( party, state )
-- Drop all parties after the first one?
party = mw.text.split( party, ",", true )[1]
local specials = {
Blank = "Chính khách độc lập",
Independent = "Chính khách độc lập",
}
specials["No Party Preference"] = "Không có đảng ưu tiên"
if specials[party] then
return specials[party]
end

if state then
-- ex "California Democratic Party"
return "Đảng " .. party .. " " .. state
end

return "Đảng " .. party .. " (Hoa Kỳ)"
end

return p