Module:Election results: Difference between revisions
Jump to navigation
Jump to search
m (1 revision imported) |
No edit summary |
||
Line 1: | Line 1: | ||
require(' | require('strict') | ||
local p = {} | local p = {} | ||
local political_party = require('Module:Political party') | |||
function p.main(frame) | function p.main(frame) | ||
Line 6: | Line 7: | ||
local index, headings, showtotal = {}, {}, {} | local index, headings, showtotal = {}, {}, {} | ||
local cols, rounds = 0, 1 | local cols, rounds = 0, 1 | ||
local winner, winner_votes = {0, 0}, {0, 0} | local winner, winner_votes = {0, 0, 0}, {0, 0, 0} | ||
local valid = {0, 0} | local valid = {0, 0, 0} | ||
local invalid = {tonumber(args.invalid) or 0, tonumber(args.invalid2) or 0} | local invalid = {tonumber(args.invalid) or 0, tonumber(args.invalid2) or 0, tonumber(args.invalid3) or 0} | ||
local majority = {tonumber(args.majority) | local blank = {tonumber(args.blank) or 0, tonumber(args.blank2) or 0, tonumber(args.blank3) or 0} | ||
local majority2 = {tonumber(args.majority2) | local majority = {tonumber(args.majority)} | ||
local majoritypct = {tonumber(args.majoritypct) | local majority2 = {tonumber(args.majority2)} | ||
local majoritypct2 = {tonumber(args.majoritypct2) | local majoritypct = {tonumber(args.majoritypct)} | ||
local totalvotes = {tonumber(args.totalvotes) | local majoritypct2 = {tonumber(args.majoritypct2)} | ||
local electorate = {tonumber(args.electorate) | local totalvotes = {tonumber(args.totalvotes), tonumber(args.totalvotes2), tonumber(args.totalvotes3)} | ||
local turnout = {tonumber(args.turnout) | local electorate = {tonumber(args.electorate), tonumber(args.electorate2), tonumber(args.electorate3)} | ||
local seats = 0 | local turnout = {tonumber(args.turnout), tonumber(args.turnout2), tonumber(args.turnout3)} | ||
local seats = 0 | |||
local seats_2 = 0 | |||
local seats_3 = 0 | |||
local st1t = 0 | |||
local st2t = 0 | |||
local st3t = 0 | |||
local st4t = 0 | |||
local st5t = 0 | |||
local totseats = 0 | |||
local row, secondrow | local row, secondrow | ||
local tracking = '' | local tracking = '' | ||
local max_rows = 0 | local max_rows = 0 | ||
-- helper functions | -- helper functions | ||
local lang = mw.getContentLanguage() | local lang = mw.getContentLanguage() | ||
Line 26: | Line 36: | ||
return n and tonumber(n) and lang:formatNum(tonumber(n)) or nil | return n and tonumber(n) and lang:formatNum(tonumber(n)) or nil | ||
end | end | ||
local function pct(n,d) | local function pct(n, d) | ||
n, d = tonumber(n), tonumber(d) | n, d = tonumber(n), tonumber(d) | ||
if n and d and d > 0 then | if n and d and d > 0 then | ||
Line 47: | Line 57: | ||
end | end | ||
return s | return s | ||
end | |||
local function get_color(color, party) | |||
if color == nil then | |||
local party = unlink(party) or '' | |||
if party ~= '' then | |||
color = political_party._fetch({party, 'color'}) | |||
end | |||
end | |||
if color ~= nil then | |||
color = mw.ustring.gsub(color, '&(#)35;', '%1') | |||
end | |||
return color | |||
end | end | ||
Line 52: | Line 75: | ||
local stop_flag = false | local stop_flag = false | ||
local i = 0 | local i = 0 | ||
local has_votes = args['invalid'] or args['totalvotes'] or args['electorate'] or args['turnout'] | |||
local has_votes2 = args['invalid2'] or args['totalvotes2'] or args['electorate2'] or args['turnout2'] | |||
local has_votes3 = args['votes' .. i .. '_3'] or args['ivotes' .. i .. '_3'] | |||
local has_seats2 = args['seats' .. i .. '_2'] or args['iseats' .. i .. '_2'] | |||
local has_seats3 = args['seats' .. i .. '_3'] | |||
local has_sw2 = args['sw' .. i .. '_2'] | |||
local seats_only = has_seats2 and not has_votes | |||
local has_cand = args['cand' .. i] | |||
local has_alliance = args['alliance' .. i] | |||
local has_party = args['party' .. i] | |||
local has_rspan = args['vspan' .. i] or args['v2span' .. i] | |||
local has_sspan = args['sspan' .. i] or args['tsspan' .. i] | |||
while stop_flag == false do | while stop_flag == false do | ||
stop_flag = true | stop_flag = true | ||
for kk = 1, 20 do | for kk = 1, 20 do | ||
i = i + 1 | i = i + 1 | ||
for k, key in ipairs({'cand', 'vp', 'party', 'sc', 'sw', 'seats', 'totalvotes'}) do | for k, key in ipairs({'alliance', 'atotal', 'cand', 'vp', 'party', 'ivotes', 'ipct', 'iseats', 'sc', 'st1t', 'st2t', 'st3t', 'st4t', 'st5t', 'sw', 'seats', 'totalvotes', 'totseats', 'acolor', 'rcolor'}) do | ||
if args[key .. i] then | if args[key .. i] then | ||
headings[key] = true | headings[key] = true | ||
Line 68: | Line 103: | ||
end | end | ||
if args['row' .. i] or args['cand' .. i] or args['party' .. i] then | if args['row' .. i] or args['cand' .. i] or args['party' .. i] or args['alliance' .. i] or args['atotal' .. i] or args['atotalnv' .. i] or args['header' .. i] then | ||
table.insert(index, i) | table.insert(index, i) | ||
if args['votes' .. i] then | if args['votes' .. i] then | ||
has_votes = true | |||
if tonumber(args['votes' .. i]) then showtotal.votes = 1 end | if tonumber(args['votes' .. i]) then showtotal.votes = 1 end | ||
local votesi = tonumber(args['votes' .. i]) or 0 | local votesi = tonumber(args['votes' .. i]) or 0 | ||
Line 79: | Line 115: | ||
end | end | ||
valid[1] = valid[1] + votesi | valid[1] = valid[1] + votesi | ||
end | |||
if args['votes' .. i .. '_2'] or args['ivotes' .. i .. '_2'] or args['avotes' .. i .. '_2'] or args['ipct' .. i .. '_2'] or args['apct' .. i .. '_2'] then | |||
has_votes2 = true | |||
end | |||
if args['votes' .. i .. '_3'] or args['ivotes' .. i .. '_3'] or args['ipct' .. i .. '_3'] then | |||
has_votes3 = true | |||
end | |||
if args['alliance' .. i] then | |||
has_alliance = true | |||
end | |||
if args['party' .. i] then | |||
has_party = true | |||
end | |||
if args['cand' .. i] then | |||
has_cand = true | |||
end | |||
if args['ivotes' .. i] then | |||
has_votes = true | |||
end | |||
if args['ipct' .. i] then | |||
has_votes = true | |||
end | |||
if args['sw' .. i .. '_2'] then | |||
has_sw2 = true | |||
rounds = (rounds < 2) and 2 or rounds | |||
end | |||
if args['valid2'] or args['invalid2'] or args['totalvotes2'] or args['electorate2'] or args['turnout2'] then | |||
rounds = (rounds < 2) and 2 or rounds | |||
end | |||
if args['vspan' .. i] or args['v2span' .. i] then | |||
has_rspan = true | |||
end | |||
if args['sspan' .. i] or args['tsspan' .. i] then | |||
has_sspan = true | |||
end | |||
if args['ipct' .. i .. '_2'] then | |||
rounds = (rounds < 2) and 2 or rounds | |||
end | end | ||
if args['votes' .. i .. '_2'] then | if args['votes' .. i .. '_2'] then | ||
rounds = 2 | has_votes = true | ||
rounds = (rounds < 2) and 2 or rounds | |||
if tonumber(args['votes' .. i .. '_2']) then showtotal.votes_2 = 1 end | if tonumber(args['votes' .. i .. '_2']) then showtotal.votes_2 = 1 end | ||
local votesi = tonumber(args['votes' .. i .. '_2']) or 0 | local votesi = tonumber(args['votes' .. i .. '_2']) or 0 | ||
Line 90: | Line 164: | ||
end | end | ||
valid[2] = valid[2] + votesi | valid[2] = valid[2] + votesi | ||
end | |||
if args['votes' .. i .. '_3'] then | |||
has_votes = true | |||
rounds = (rounds < 3) and 3 or rounds | |||
if tonumber(args['votes' .. i .. '_3']) then showtotal.votes_3 = 1 end | |||
local votesi = tonumber(args['votes' .. i .. '_3']) or 0 | |||
args['votes' .. i .. '_3'] = votesi | |||
if votesi > winner_votes[3] then | |||
winner[3] = i | |||
winner_votes[3] = votesi | |||
end | |||
valid[3] = valid[3] + votesi | |||
end | end | ||
if args['seats' .. i] then | if args['seats' .. i] then | ||
if tonumber(args['seats' .. i]) then showtotal.seats = 1 end | if tonumber(args['seats' .. i]) then showtotal.seats = 1 end | ||
seats = seats + (tonumber(args['seats' .. i]) or 0) | seats = seats + (tonumber(args['seats' .. i]) or 0) | ||
end | |||
if args['seats' .. i .. '_2'] or args['iseats' .. i .. '_2'] then | |||
has_seats2 = true | |||
rounds = (rounds < 2) and 2 or rounds | |||
if tonumber(args['seats' .. i ..'_2']) then showtotal.seats_2 = 1 end | |||
seats_2 = seats_2 + (tonumber(args['seats' .. i .. '_2']) or 0) | |||
end | |||
if args['seats' .. i .. '_3'] then | |||
has_seats3 = true | |||
rounds = (rounds < 3) and 3 or rounds | |||
if tonumber(args['seats' .. i ..'_3']) then showtotal.seats_3 = 1 end | |||
seats_3 = seats_3 + (tonumber(args['seats' .. i .. '_3']) or 0) | |||
end | |||
if args['st1t' .. i] then | |||
if tonumber(args['st1t' .. i]) then showtotal.st1t = 1 end | |||
st1t = st1t + (tonumber(args['st1t' .. i]) or 0) | |||
end | |||
if args['st2t' .. i] then | |||
if tonumber(args['st2t' .. i]) then showtotal.st2t = 1 end | |||
st2t = st2t + (tonumber(args['st2t' .. i]) or 0) | |||
end | |||
if args['st3t' .. i] then | |||
if tonumber(args['st3t' .. i]) then showtotal.st3t = 1 end | |||
st3t = st3t + (tonumber(args['st3t' .. i]) or 0) | |||
end | |||
if args['st4t' .. i] then | |||
if tonumber(args['st4t' .. i]) then showtotal.st4t = 1 end | |||
st4t = st4t + (tonumber(args['st4t' .. i]) or 0) | |||
end | |||
if args['st5t' .. i] then | |||
if tonumber(args['st5t' .. i]) then showtotal.st5t = 1 end | |||
st5t = st5t + (tonumber(args['st5t' .. i]) or 0) | |||
end | |||
if args['totseats' .. i] then | |||
if tonumber(args['totseats' .. i]) then showtotal.totseats = 1 end | |||
totseats = totseats + (tonumber(args['totseats' .. i]) or 0) | |||
end | |||
if has_seats2 and not has_votes or has_seats3 and not has_votes then | |||
seats_only = true | |||
end | end | ||
end | end | ||
Line 99: | Line 224: | ||
end | end | ||
local ovalid = {valid[1], valid[2]} | local ovalid = {valid[1], valid[2], valid[3]} | ||
seats = ((args['total_seats'] or '') == 'TOTAL' and seats) or args['total_seats'] or seats | seats = ((args['total_seats'] or '') == 'TOTAL' and seats) or args['total_seats'] or seats | ||
if seats or args['total_sc'] or args['valid'] or ((rounds > 1) and args['valid2']) then | totseats = ((args['total_totseats'] or '') == 'TOTAL' and totseats) or args['total_totseats'] or totseats | ||
st1t = ((args['total_st1t'] or '') == 'TOTAL' and st1t) or args['total_st1t'] or st1t | |||
st2t = ((args['total_st2t'] or '') == 'TOTAL' and st2t) or args['total_st2t'] or st2t | |||
st3t = ((args['total_st3t'] or '') == 'TOTAL' and st3t) or args['total_st3t'] or st3t | |||
st4t = ((args['total_st4t'] or '') == 'TOTAL' and st4t) or args['total_st4t'] or st4t | |||
st5t = ((args['total_st5t'] or '') == 'TOTAL' and st5t) or args['total_st5t'] or st5t | |||
if seats or totseats or st1t or st2t or st3t or st4t or st5t or args['total_sc'] or args['total_st1t'] or args['total_st2t'] or args['total_st3t'] or args['total_st4t'] or args['total_st5t'] or args['valid'] or ((rounds > 1) and args['valid2']) or ((rounds > 1) and args['valid3']) then | |||
max_rows = max_rows + 1 | max_rows = max_rows + 1 | ||
local i = max_rows | local i = max_rows | ||
table.insert(index,i) | table.insert(index, i) | ||
args['votes' .. i] = showtotal.votes and valid[1] or nil | args['votes' .. i] = showtotal.votes and valid[1] or nil | ||
args['votes' .. i .. '_2'] = showtotal.votes_2 and valid[2] or nil | args['votes' .. i .. '_2'] = showtotal.votes_2 and valid[2] or nil | ||
args['votes' .. i .. '_3'] = showtotal.votes_3 and valid[3] or nil | |||
args['colour' .. i] = 'inherit' | args['colour' .. i] = 'inherit' | ||
args['color' .. i] = 'inherit' | args['color' .. i] = 'inherit' | ||
args['row' .. i] = 'Total' | args['row' .. i] = 'Total' | ||
args['sw' .. i] = '–' | args['sw' .. i] = '–' | ||
args['sw' .. i .. '_2'] = '–' | |||
args['seats' .. i] = showtotal.seats and seats or nil | args['seats' .. i] = showtotal.seats and seats or nil | ||
args['seats' .. i .. '_2'] = showtotal.seats_2 and seats_2 or nil | |||
args['seats' .. i .. '_3'] = showtotal.seats_3 and seats_3 or nil | |||
args['st1t' .. i] = showtotal.st1t and st1t or args.total_st1t | |||
args['st2t' .. i] = showtotal.st2t and st2t or args.total_st2t | |||
args['st3t' .. i] = showtotal.st3t and st3t or args.total_st3t | |||
args['st4t' .. i] = showtotal.st4t and st4t or args.total_st4t | |||
args['st5t' .. i] = showtotal.st5t and st5t or args.total_st5t | |||
args['sc' .. i] = args['total_sc'] | args['sc' .. i] = args['total_sc'] | ||
args['totseats' .. i] = showtotal.totseats and totseats or nil | |||
args['font-weight' .. i] = 'bold' | args['font-weight' .. i] = 'bold' | ||
args['class' .. i] = 'sortbottom' | args['class' .. i] = 'sortbottom' | ||
ovalid[1] = tonumber(args['valid']) or valid[1] | ovalid[1] = tonumber(args['valid']) or valid[1] | ||
ovalid[2] = tonumber(args['valid2']) or valid[2] | ovalid[2] = tonumber(args['valid2']) or valid[2] | ||
ovalid[3] = tonumber(args['valid3']) or valid[3] | |||
end | end | ||
-- build the table | -- build the table | ||
local root = mw.html.create('table') | local root = mw.html.create(args['embed'] and '' or 'table') | ||
root | if args['embed'] == nil then | ||
root | |||
:addClass('wikitable sortable') | |||
:tag('caption') | |||
:wikitext(args.caption) | |||
:done() | |||
end | |||
local topcell = nil | local topcell = nil | ||
if args['image'] then | if args['image'] then | ||
topcell = root | topcell = root | ||
:tag(' | :tag('th') | ||
:css('text-align', 'center') | |||
:css('color', 'black') | |||
:css('background', '#F8F9FA') | |||
:wikitext(args['image']) | |||
end | |||
if args['reporting'] then | |||
if (topcell == nil) then | |||
topcell = root | |||
:tag('td') | :tag('td') | ||
:css('text-align', 'center') | :css('text-align', 'center') | ||
:css('color', 'black') | |||
:css('background', '#F8F9FA') | |||
end | |||
topcell:tag('div') | |||
:addClass('center') | |||
:wikitext(frame:expandTemplate{ | |||
title = 'percentage bar', | |||
args = {args.reporting, | |||
args.reporting .. '% reporting', | |||
['width'] = '200px', | |||
['hex'] = '1BCE0E' | |||
}}) | |||
end | end | ||
local rowspan = (rounds > 1) and 2 or nil | local rowspan = (rounds > 1) and 2 or headings['st1t'] and 2 or nil | ||
row = root:tag('tr') | row = args['embed'] and mw.html.create('') or root:tag('tr') | ||
if args['dsv'] then | if args['dsv'] and has_alliance and has_party then | ||
row | |||
:tag('th') | |||
:wikitext(args.partytitle or 'Party or alliance') | |||
:attr('scope', 'col') | |||
:attr('colspan', 4) | |||
:attr('rowspan', rowspan) | |||
:done() | |||
cols = cols + 4 | |||
row | |||
:tag('th') | |||
:wikitext(args.candtitle or 'Candidate') | |||
:attr('scope', 'col') | |||
:attr('rowspan', rowspan) | |||
:done() | |||
cols = cols + 1 | |||
elseif args['dsv'] then | |||
row | row | ||
:tag('th') | :tag('th') | ||
:wikitext('Party') | :wikitext(args.partytitle or 'Party') | ||
:attr('scope', 'col') | :attr('scope', 'col') | ||
:attr('colspan', 2) | :attr('colspan', 2) | ||
:attr('rowspan', rowspan) | :attr('rowspan', rowspan) | ||
:done() | |||
cols = cols + 2 | cols = cols + 2 | ||
row | |||
:tag('th') | |||
:wikitext(args.candtitle or 'Candidate') | |||
:attr('scope', 'col') | |||
:attr('rowspan', rowspan) | |||
:done() | |||
cols = cols + 1 | |||
elseif has_cand then | |||
if has_cand and has_party and has_alliance then | |||
row | row | ||
:tag('th') | :tag('th') | ||
:wikitext(args. | :wikitext('Candidate') | ||
:attr('rowspan', rowspan) | |||
:attr('colspan', 2) | |||
row | |||
:tag('th') | |||
:wikitext(args.partytitle or 'Party or alliance') | |||
:attr('scope', 'col') | :attr('scope', 'col') | ||
:attr('rowspan', rowspan) | :attr('rowspan', rowspan) | ||
cols = cols + | :attr('colspan', 3) | ||
elseif | :done() | ||
cols = cols + 5 | |||
elseif has_cand and has_party then | |||
row | row | ||
:tag('th') | :tag('th') | ||
:wikitext( | :wikitext('Candidate') | ||
:attr('scope', 'col') | :attr('scope', 'col') | ||
:attr('colspan', 2) | :attr('colspan', 2) | ||
:attr('rowspan', rowspan) | :attr('rowspan', rowspan) | ||
:done() | |||
cols = cols + 2 | cols = cols + 2 | ||
end | |||
if has_cand and not has_party then | |||
row | |||
:tag('th') | |||
:wikitext('Candidate') | |||
:attr('scope', 'col') | |||
:attr('rowspan', rowspan) | |||
:done() | |||
cols = cols + 1 | |||
end | |||
if headings['vp'] then | if headings['vp'] then | ||
row | row | ||
Line 165: | Line 373: | ||
:attr('scope', 'col') | :attr('scope', 'col') | ||
:attr('rowspan', rowspan) | :attr('rowspan', rowspan) | ||
:done() | |||
cols = cols + 1 | cols = cols + 1 | ||
end | end | ||
if | if has_party and not has_alliance then | ||
row | row | ||
:tag('th') | :tag('th') | ||
:wikitext('Party') | :wikitext(args.partytitle or 'Party') | ||
:attr('scope', 'col') | :attr('scope', 'col') | ||
:attr('rowspan', rowspan) | :attr('rowspan', rowspan) | ||
:done() | |||
cols = cols + 1 | cols = cols + 1 | ||
end | end | ||
else | elseif has_party and has_alliance then | ||
row | |||
:tag('th') | |||
:wikitext(args.partytitle or 'Party or alliance') | |||
:attr('scope', 'col') | |||
:attr('rowspan', rowspan) | |||
:attr('colspan', 4) | |||
:done() | |||
cols = cols + 4 | |||
else | |||
row | |||
:tag('th') | :tag('th') | ||
:wikitext( | :wikitext(args.partytitle or 'Party') | ||
:attr('scope', 'col') | :attr('scope', 'col') | ||
:attr('colspan', 2) | :attr('colspan', 2) | ||
:attr('rowspan', rowspan) | :attr('rowspan', rowspan) | ||
:done() | |||
cols = cols + 2 | cols = cols + 2 | ||
end | end | ||
if rounds > 1 then | if rounds > 1 then | ||
if has_seats2 and headings['sw'] and not has_seats3 then | |||
row | |||
:tag('th') | |||
:wikitext(args.firstround or 'First round') | |||
:attr('scope', 'col') | |||
:attr('colspan', 4) | |||
:done() | |||
:tag('th') | |||
:wikitext(args.secondround or 'Second round') | |||
:attr('scope', 'col') | |||
:attr('colspan', 4) | |||
:done() | |||
elseif has_seats2 and not has_seats3 then | |||
row | |||
:tag('th') | |||
:wikitext(args.firstround or 'First round') | |||
:attr('scope', 'col') | |||
:attr('colspan', 3) | |||
:done() | |||
:tag('th') | |||
:wikitext(args.secondround or 'Second round') | |||
:attr('scope', 'col') | |||
:attr('colspan', 3) | |||
:done() | |||
elseif has_seats3 then | |||
row | |||
:tag('th') | |||
:wikitext(args.firstround or 'First round') | |||
:attr('scope', 'col') | |||
:attr('colspan', 3) | |||
:done() | |||
:tag('th') | |||
:wikitext(args.secondround or 'Second round') | |||
:attr('scope', 'col') | |||
:attr('colspan', 3) | |||
:done() | |||
:tag('th') | |||
:wikitext(args.thirdround or 'Third round') | |||
:attr('scope', 'col') | |||
:attr('colspan', 3) | |||
:done() | |||
elseif has_votes3 then | |||
row | |||
:tag('th') | |||
:wikitext(args.firstround or 'First round') | |||
:attr('scope', 'col') | |||
:attr('colspan', 2) | |||
:done() | |||
:tag('th') | |||
:wikitext(args.secondround or 'Second round') | |||
:attr('scope', 'col') | |||
:attr('colspan', 2) | |||
:done() | |||
:tag('th') | |||
:wikitext(args.thirdround or 'Third round') | |||
:attr('scope', 'col') | |||
:attr('colspan', 2) | |||
:done() | |||
elseif has_votes then | |||
row | |||
:tag('th') | |||
:wikitext(args.firstround or 'First round') | |||
:attr('scope', 'col') | |||
:attr('colspan', 2) | |||
:done() | |||
:tag('th') | |||
:wikitext(args.secondround or 'Second round') | |||
:attr('scope', 'col') | |||
:attr('colspan', 2) | |||
:done() | |||
end | |||
secondrow = args['embed'] and mw.html.create('') or root:tag('tr') | |||
else | |||
secondrow = row | |||
end | |||
rowspan = (rounds > 1) and 1 or (rounds < 2 and headings['st1t']) and 2 or nil | |||
if has_seats2 and not has_seats3 and headings['sw'] then | |||
for k=1, rounds do | |||
secondrow | |||
:tag('th') | |||
:wikitext(args.votestitle or 'Votes') | |||
:attr('scope', 'col') | |||
:attr('rowspan', rowspan) | |||
:done() | |||
:tag('th') | |||
:wikitext('%') | |||
:attr('scope', 'col') | |||
:attr('rowspan', rowspan) | |||
:done() | |||
:tag('th') | |||
:wikitext('+/–') | |||
:attr('scope', 'col') | |||
:attr('rowspan', rowspan) | |||
:done() | |||
:tag('th') | |||
:wikitext(args.seatstitle or 'Seats') | |||
:attr('scope', 'col') | |||
:attr('rowspan', rowspan) | |||
:done() | |||
cols = cols + 4 | |||
end | |||
end | |||
if has_seats2 and not headings['sw'] or has_seats3 and not headings['sw'] then | |||
for k=1, rounds do | |||
secondrow | |||
:tag('th') | |||
:wikitext(args.votestitle or 'Votes') | |||
:attr('scope', 'col') | |||
:attr('rowspan', rowspan) | |||
:done() | |||
:tag('th') | |||
:wikitext('%') | |||
:attr('scope', 'col') | |||
:attr('rowspan', rowspan) | |||
:done() | |||
:tag('th') | |||
:wikitext(args.seatstitle or 'Seats') | |||
:attr('scope', 'col') | |||
:attr('rowspan', rowspan) | |||
:done() | |||
cols = cols + 3 | |||
end | |||
end | |||
if has_votes and not has_seats2 then | |||
for k=1, rounds do | |||
secondrow | |||
:tag('th') | |||
:wikitext(args.votestitle or 'Votes') | |||
:attr('scope', 'col') | |||
:attr('rowspan', rowspan) | |||
:done() | |||
:tag('th') | |||
:wikitext('%') | |||
:attr('scope', 'col') | |||
:attr('rowspan', rowspan) | |||
:done() | |||
cols = cols + 2 | |||
end | |||
end | |||
if headings['sw'] and not has_seats2 then | |||
row | |||
:tag('th') | |||
:wikitext('+/–') | |||
:attr('scope', 'col') | |||
:attr('rowspan', rowspan) | |||
:done() | |||
cols = cols + 1 | |||
end | |||
rowspan = (rounds > 1) and 2 or headings['sc'] and headings['st1t'] and 2 or headings['seats'] and headings['st1t'] and 2 or nil | |||
if headings['seats'] and not has_seats2 then | |||
row | row | ||
:tag('th') | :tag('th') | ||
:wikitext(args. | :wikitext(args.seatstitle or 'Seats') | ||
:attr('scope', 'col') | :attr('scope', 'col') | ||
:attr('colspan', 2) | :attr('rowspan', rowspan) | ||
:done() | |||
cols = cols + 1 | |||
end | |||
if headings['st1t'] then | |||
row | |||
:tag('th') | |||
:wikitext('Seats') | |||
:attr('colspan', 5) | |||
:attr('scope', 'col') | |||
:done() | |||
if rounds < 2 then secondrow = root:tag('tr') | |||
end | |||
secondrow | |||
:tag('th') | |||
:wikitext(args.seattype1) | |||
:attr('scope', 'col') | |||
:done() | |||
cols = cols + 1 | |||
if headings['st2t'] then | |||
secondrow | |||
:tag('th') | :tag('th') | ||
:wikitext(args. | :wikitext(args.seattype2) | ||
:attr('scope', 'col') | :attr('scope', 'col') | ||
: | :done() | ||
cols = cols + 1 | |||
end | end | ||
if headings['st3t'] then | |||
secondrow | secondrow | ||
:tag('th') | :tag('th') | ||
:wikitext( | :wikitext(args.seattype3) | ||
:attr('scope', 'col') | :attr('scope', 'col') | ||
:done() | |||
cols = cols + 1 | |||
end | |||
if headings['st4t'] then | |||
secondrow | |||
:tag('th') | :tag('th') | ||
:wikitext( | :wikitext(args.seattype4) | ||
:attr('scope', 'col') | :attr('scope', 'col') | ||
cols = cols + | :done() | ||
cols = cols + 1 | |||
end | end | ||
if headings[' | if headings['st5t'] then | ||
secondrow | |||
:tag('th') | :tag('th') | ||
:wikitext( | :wikitext(args.seattype5) | ||
:attr('scope', 'col') | :attr('scope', 'col') | ||
: | :done() | ||
cols = cols + 1 | cols = cols + 1 | ||
end | end | ||
if headings[' | end | ||
if headings['totseats'] then | |||
row | row | ||
:tag('th') | :tag('th') | ||
:wikitext(' | :wikitext(headings['totseats'] and 'Total<br>seats' or 'Totseats±') | ||
:attr('scope', 'col') | :attr('scope', 'col') | ||
:attr('rowspan', rowspan) | :attr('rowspan', rowspan) | ||
:done() | |||
cols = cols + 1 | cols = cols + 1 | ||
end | end | ||
Line 227: | Line 623: | ||
row | row | ||
:tag('th') | :tag('th') | ||
:wikitext( | :wikitext(args.sctitle or '+/–') | ||
:attr('scope', 'col') | :attr('scope', 'col') | ||
:attr('rowspan', rowspan) | :attr('rowspan', rowspan) | ||
:done() | |||
cols = cols + 1 | cols = cols + 1 | ||
end | end | ||
if topcell then | if topcell then | ||
topcell:attr('colspan', cols) | topcell:attr('colspan', cols) | ||
end | end | ||
local cs = cols - 2*rounds | local cs = cols - 2*rounds | ||
- (headings['sw'] and 1 or 0) | - (headings['sw'] and 1 or 0) | ||
- (headings['totseats'] and 1 or 0) | |||
- (headings['seats'] and 1 or 0) | - (headings['seats'] and 1 or 0) | ||
- (headings['sc'] and 1 or 0) | - (headings['sc'] and 1 or 0) | ||
local rsuff = (rounds > 1) and {'', '_2'} or {''} | - (headings['st1t'] and 1 or 0) | ||
- (headings['st2t'] and 1 or 0) | |||
- (headings['st3t'] and 1 or 0) | |||
- (headings['st4t'] and 1 or 0) | |||
- (headings['st5t'] and 1 or 0) | |||
- (has_seats2 and 1 or 0) | |||
- (has_seats3 and 1 or 0) | |||
- (has_sw2 and 1 or 0) | |||
+ (has_votes and 0 or 2) | |||
- (seats_only and 2 or 0) | |||
local rsuff = (rounds > 1) and {'', '_2'} or (rounds > 2) and {'', '_3'} or {''} | |||
for i, v in ipairs(index) do | for i, v in ipairs(index) do | ||
row = root:tag('tr') | local has_votesrow = args['votes' .. v] or args['ivotes' .. v] or args['avotes' .. v] or args['ipct' .. v] or args['apct' .. v] or args['atotal' .. v] | ||
local has_seatsrow = args['seats' .. v] or args['iseats' .. v] or args['aseats' .. v] | |||
local has_votesrow2 = args['votes' .. v .. '_2'] or args['ivotes' .. v .. '_2'] or args['avotes' .. v .. '_2'] or args['ipct' .. v .. '_2'] or args['apct' .. v .. '_2'] or args['atotal' .. v .. '_2'] | |||
local has_seatsrow2 = args['seats' .. v .. '_2'] or args['iseats' .. v .. '_2'] or args['aseats' .. v .. '_2'] | |||
local has_votesrow3 = args['votes' .. v .. '_3'] or args['ivotes' .. v .. '_3'] or args['avotes' .. v .. '_3'] or args['ipct' .. v .. '_3'] or args['apct' .. v .. '_3'] or args['atotal' .. v .. '_3'] | |||
local has_seatsrow3 = args['seats' .. v .. '_3'] or args['iseats' .. v .. '_3'] or args['aseats' .. v .. '_3'] | |||
row = root:tag('tr') | |||
:addClass(args['class' .. v]) | :addClass(args['class' .. v]) | ||
:css('font-weight', args['font-weight' .. v]) | :css('font-weight', args['font-weight' .. v]) | ||
-- determine the | |||
local color = args['colour' .. v] or args['color' .. v] or nil | |||
-- determine the colors | |||
local color = get_color(args['colour' .. v] or args['color' .. v] or nil, args['party' .. v]) | |||
if | local acolor = get_color(args['acolour' .. v] or args['acolor' .. v] or nil, args['alliance' .. v]) | ||
local rcolor = get_color(args['rcolour' .. v] or args['rcolor' .. v] or nil) | |||
-- headers | |||
if args['header' .. v] then | |||
row | |||
:tag('th') | |||
:wikitext(args['header' .. v]) | |||
:attr('colspan', cols) | |||
else | |||
if args['alliance' .. v] then | |||
row | |||
:tag('td') | |||
:attr('rowspan', args['aspan' .. v]) | |||
:css('width', '0px') | |||
:css('background-color', acolor) | |||
elseif args['party' .. v] and not has_alliance or args['cand' .. v] and has_party and not has_alliance then | |||
row | |||
:tag('td') | |||
:css('width', '0px') | |||
:css('background-color', color) | |||
end | |||
if args['cand' .. v] and not args.dsv then | |||
row | |||
:css('background-color', rcolor) | |||
:tag('td') | |||
:attr('rowspan', args['candspan' .. v] or args['aspan' .. v]) | |||
:wikitext(args['cand' .. v]) | |||
end | |||
if args['vp' .. v] then | |||
row | |||
:tag('td') | |||
:wikitext(args['vp' .. v]) | |||
end | |||
if args['alliance' .. v] and not has_party and args.dsv then | |||
row | |||
:tag('td') | |||
:attr('rowspan', args['aspan' .. v]) | |||
:wikitext(args['alliance' .. v]) | |||
end | |||
if args['alliance' .. v] and not args['party' .. v] and not args.dsv then | |||
row | |||
:tag('td') | |||
:attr('rowspan', args['aspan' .. v]) | |||
:attr('colspan', 3) | |||
:wikitext(args['alliance' .. v]) | |||
end | |||
if args['alliance' .. v] and not args['party' .. v] and has_party and args.dsv then | |||
row | |||
:tag('td') | |||
:attr('rowspan', args['aspan' .. v]) | |||
:attr('colspan', 3) | |||
:wikitext(args['alliance' .. v]) | |||
end | |||
if args['alliance' .. v] and args['party' .. v] then | |||
row | |||
:tag('td') | |||
:attr('rowspan', args['aspan' .. v]) | |||
:wikitext(args['alliance' .. v]) | |||
end | |||
if args['party' .. v] and not has_alliance or args['cand' .. v] and has_party and not has_alliance then | |||
row | |||
:tag('td') | |||
:wikitext(args['party' .. v]) | |||
end | end | ||
if args['row' .. v] then | if args['row' .. v] then | ||
row | row | ||
:css('background-color', rcolor) | |||
:tag('td') | :tag('td') | ||
:attr('colspan', cs) | |||
:wikitext(args['row' .. v]) | :wikitext(args['row' .. v]) | ||
end | |||
if has_alliance and args['party' .. v] then | |||
row | row | ||
:tag('td') | :tag('td') | ||
:css('background-color', color) | :css('background-color', color) | ||
:tag('td') | |||
:wikitext(args['party' .. v]) | |||
end | |||
if args['cand' .. v] and args.dsv then | |||
row | |||
:tag('td') | |||
:attr('rowspan', args['candspan' .. v]) | |||
:wikitext(args['cand' .. v]) | |||
end | |||
if args['atotal' .. v] and has_party and not args.dsv or args['atotalnv' .. v] and has_party and not args.dsv then | |||
row | |||
:css('font-style', 'italic') | |||
:tag('td') | :tag('td') | ||
:attr('colspan', 2) | |||
:wikitext('Total') | |||
end | |||
if args['atotal' .. v] and not has_party or args['atotalnv' .. v] and not has_party then | |||
row | |||
:css('font-style', 'italic') | |||
:tag('td') | |||
:wikitext('Total') | |||
end | |||
:tag('td') | if args['atotal' .. v] and has_cand and has_party and args.dsv or args['atotalnv' .. v] and has_party and args.dsv then | ||
row | |||
:css('font-style', 'italic') | |||
:tag('td') | |||
:attr('colspan', 3) | |||
:wikitext('Total') | |||
end | end | ||
if args['votes' .. v] and args['divisor'] then | |||
row:tag('td') | |||
:attr('rowspan', args['vspan' .. v]) | |||
:css('text-align', 'right') | |||
:wikitext(fmt(args['votes' .. v])) | |||
row:tag('td') | |||
:attr('rowspan', args['vspan' .. v]) | |||
:css('text-align', 'right') | |||
:wikitext(pct(args['votes' .. v], (args['row' .. v] == 'Total') and args['votes' .. v] or args['divisor'])) | |||
elseif args['votes' .. v] then | |||
row:tag('td') | row:tag('td') | ||
:attr('rowspan', args['vspan' .. v]) | |||
:css('text-align', 'right') | :css('text-align', 'right') | ||
:wikitext(fmt(args['votes' .. v | :wikitext(fmt(args['votes' .. v])) | ||
row:tag('td') | row:tag('td') | ||
:attr('rowspan', args['vspan' .. v]) | |||
:css('text-align', 'right') | :css('text-align', 'right') | ||
:wikitext(pct(args['votes' .. v .. | :wikitext(pct(args['votes' .. v], valid[1])) | ||
elseif args['avotes' .. v] then | |||
row:tag('td'):attr(' | row:tag('td') | ||
:attr('rowspan', args['vspan' .. v]) | |||
:css('text-align', 'right') | |||
:css('font-style', 'italic') | |||
:wikitext(fmt(args['avotes' .. v])) | |||
row:tag('td') | |||
:attr('rowspan', args['vspan' .. v]) | |||
:css('text-align', 'right') | |||
:css('font-style', 'italic') | |||
:wikitext(pct(args['avotes' .. v], valid[1])) | |||
elseif args['ivotes' .. v] or args ['ipct' .. v] or args['atotal' .. v] then | |||
row:tag('td') | |||
:attr('rowspan', args['vspan' .. v]) | |||
:css('text-align', 'right') | |||
:css('font-style', 'italic') | |||
:wikitext(fmt(args['ivotes' .. v]) or fmt(args['atotal' .. v])) | |||
if args['ipct' .. v] or args['apct' .. v] or args['atotal' .. v] then | |||
row:tag('td') | |||
:attr('rowspan', args['vspan' .. v]) | |||
:css('text-align', 'right') | |||
:css('font-style', 'italic') | |||
:wikitext(args['ipct' .. v] or args['apct' .. v] or pct(args['atotal' .. v], valid[1])) | |||
else | else | ||
row:tag('td'):attr(' | row:tag('td') | ||
:attr('rowspan', args['vspan' .. v]) | |||
:wikitext() | |||
end | end | ||
elseif has_votes and headings['seats'] and headings['sw'] and not has_votesrow and not has_seatsrow and not args['sw' .. v] and not has_rspan then | |||
row:tag('td') | |||
:attr('colspan', 4) | |||
elseif has_votes and headings['seats'] and not has_votesrow and not has_seatsrow and not has_rspan or has_votes and headings['sw'] and not has_votesrow and not args['sw' .. v] and not has_rspan or has_seats2 and not has_votesrow and not has_seatsrow and not has_rspan then | |||
row:tag('td') | |||
:attr('colspan', 3) | |||
elseif has_votes and not has_votesrow and not has_rspan or has_votes and args['row' .. v] and has_seatsrow and not has_votesrow or has_seats2 and not has_votesrow and not has_rspan then | |||
row:tag('td') | |||
:attr('colspan', 2) | |||
elseif args['r1blockc' .. v] then | |||
row:tag('td') | |||
:attr('rowspan', args['r1blockr' .. v]) | |||
:attr('colspan', args['r1blockc' .. v]) | |||
:wikitext() | |||
end | end | ||
if headings['sw'] and | if headings['sw'] and has_votesrow then | ||
row | row | ||
:tag('td') | :tag('td') | ||
Line 312: | Line 836: | ||
:wikitext(args['sw' .. v]) | :wikitext(args['sw' .. v]) | ||
end | end | ||
if headings['seats'] and (args['seats' .. v]) then | if headings['seats'] and not args['dsv'] and not has_seats2 and rounds < 2 or has_seats2 and args['seats' .. v] or has_seats2 and args['votes' .. v] or has_seats2 and args['iseats' .. v] or has_seats2 and args['aseats' .. v] then | ||
if args['iseats' .. v] or args['aseats' .. v] then | |||
row | |||
:tag('td') | |||
:css('font-style', 'italic') | |||
:css('text-align', 'right') | |||
:wikitext(args['iseats' .. v] or args['aseats' .. v]) | |||
elseif args['seats' .. v] or headings['seats'] and not has_sspan then | |||
row | |||
:tag('td') | |||
:attr('rowspan', args['sspan' .. v]) | |||
:css('text-align', 'right') | |||
:wikitext(fmt(args['seats' .. v]) or '–') | |||
end | |||
end | |||
if args['votes' .. v .. '_2'] and args['divisor2'] then | |||
row:tag('td') | |||
:attr('rowspan', args['v2span' .. v]) | |||
:css('text-align', 'right') | |||
:wikitext(fmt(args['votes' .. v .. '_2'])) | |||
row:tag('td') | |||
:attr('rowspan', args['v2span' .. v]) | |||
:css('text-align', 'right') | |||
:wikitext(pct(args['votes' .. v .. '_2'], (args['row' .. v] == 'Total') and args['votes' .. v .. '_2'] or args['divisor2'])) | |||
elseif args['votes' .. v .. '_2'] then | |||
row:tag('td') | |||
:attr('rowspan', args['v2span' .. v]) | |||
:css('text-align', 'right') | |||
:wikitext(fmt(args['votes' .. v .. '_2'])) | |||
row:tag('td') | |||
:attr('rowspan', args['v2span' .. v]) | |||
:css('text-align', 'right') | |||
:wikitext(pct(args['votes' .. v .. '_2'], valid[2])) | |||
elseif args['ivotes' .. v .. '_2'] or args ['ipct' .. v.. '_2'] or args['avotes' .. v .. '_2'] then | |||
row:tag('td') | |||
:attr('rowspan', args['v2span' .. v]) | |||
:css('text-align', 'right') | |||
:css('font-style', 'italic') | |||
:wikitext(fmt(args['ivotes' .. v .. '_2']) or fmt(args['avotes' .. v .. '_2'])) | |||
row:tag('td') | |||
:attr('rowspan', args['v2span' .. v]) | |||
:css('text-align', 'right') | |||
:css('font-style', 'italic') | |||
:wikitext(args['ipct' .. v .. '_2'] or args['apct' .. v .. '_2'] or pct(args['avotes' .. v .. '_2'], valid[2])) | |||
elseif has_votes2 and has_seats2 and has_sw2 and not has_votesrow2 and not has_seatsrow2 and not args['sw' .. v .. '_2'] and not has_rspan then | |||
row:tag('td') | |||
:attr('colspan', 4) | |||
elseif has_votes2 and has_seats2 and not has_votesrow2 and not has_seatsrow2 and not has_rspan or has_votes2 and has_sw2 and not has_votesrow2 and not args['sw' .. v .. '_2'] and not has_rspan or has_seats2 and not has_votesrow2 and not has_seatsrow2 and not has_rspan then | |||
row:tag('td') | |||
:attr('colspan', 3) | |||
elseif has_votes2 and not has_votesrow2 and not has_rspan or has_votes2 and args['row' .. v] and has_seatsrow2 and not has_votesrow2 or has_seats2 and not has_votesrow2 and not has_rspan then | |||
row:tag('td') | |||
:attr('colspan', 2) | |||
elseif args['r2blockc' .. v] then | |||
row:tag('td') | |||
:attr('rowspan', args['r2blockr' .. v]) | |||
:attr('colspan', args['r2blockc' .. v]) | |||
:wikitext() | |||
end | |||
if headings['seats'] and args['dsv'] and not has_sspan or headings['seats'] and rounds > 1 and not has_seats2 and not has_sspan or args['seats' .. v] and has_sspan and rounds > 1 and not has_seats2 then | |||
row | |||
:tag('td') | |||
:attr('rowspan', args['sspan' .. v]) | |||
:css('text-align', 'right') | |||
:wikitext(fmt(args['seats' .. v]) or fmt(args['aseats' .. v]) or '–') | |||
end | |||
if has_sw2 and args['votes' .. v .. '_2'] then | |||
row | |||
:tag('td') | |||
:css('text-align', 'right') | |||
:wikitext(args['sw' .. v .. '_2']) | |||
end | |||
if args['seats' .. v .. '_2'] or has_seats2 and args['votes' .. v .. '_2'] then | |||
row | |||
:tag('td') | |||
:css('text-align', 'right') | |||
:wikitext(fmt(args['seats' .. v .. '_2']) or '–') | |||
end | |||
if args['iseats' .. v .. '_2'] or has_seats2 and args['ivotes' .. v .. '_2'] and not args['seats' .. v .. '_2'] or args['aseats' .. v .. '_2'] then | |||
row | |||
:tag('td') | |||
:css('text-align', 'right') | |||
:wikitext(fmt(args['iseats' .. v .. '_2']) or fmt(args['aseats' .. v .. '_2'])) | |||
end | |||
if has_seats3 or has_votes3 then | |||
if args['votes' .. v .. '_3'] then | |||
row:tag('td') | |||
:attr('rowspan', args['v3span' .. v]) | |||
:css('text-align', 'right') | |||
:wikitext(fmt(args['votes' .. v .. '_3'])) | |||
row:tag('td') | |||
:attr('rowspan', args['v3span' .. v]) | |||
:css('text-align', 'right') | |||
:wikitext(pct(args['votes' .. v .. '_3'], valid[3])) | |||
elseif args['ivotes' .. v .. '_3'] or args ['ipct' .. v.. '_3'] or args['avotes' .. v .. '_3'] then | |||
row:tag('td') | |||
:attr('rowspan', args['v3span' .. v]) | |||
:css('text-align', 'right') | |||
:css('font-style', 'italic') | |||
:wikitext(fmt(args['ivotes' .. v .. '_3']) or fmt(args['avotes' .. v .. '_3'])) | |||
row:tag('td') | |||
:attr('rowspan', args['v3span' .. v]) | |||
:css('text-align', 'right') | |||
:css('font-style', 'italic') | |||
:wikitext(args['ipct' .. v .. '_3'] or args['apct' .. v .. '_3'] or pct(args['avotes' .. v .. '_3'], valid[3])) | |||
elseif has_seats3 and not has_votesrow3 and not has_seatsrow3 and not has_rspan then | |||
row:tag('td') | |||
:attr('colspan', 3) | |||
elseif has_seats3 and not has_votesrow3 and not has_rspan or has_seats3 and args['row' .. v] and has_seatsrow3 and not has_votesrow3 or has_votes3 and not has_votesrow3 and not has_rspan then | |||
row:tag('td') | |||
:attr('colspan', 2) | |||
elseif args['r3blockc' .. v] then | |||
row:tag('td') | |||
:attr('rowspan', args['r3blockr' .. v]) | |||
:attr('colspan', args['r3blockc' .. v]) | |||
:wikitext() | |||
end | |||
if has_sw2 and args['votes' .. v .. '_3'] then | |||
row | |||
:tag('td') | |||
:css('text-align', 'right') | |||
:wikitext(args['sw' .. v .. '_3']) | |||
end | |||
if args['seats' .. v .. '_3'] or has_seats3 and args['votes' .. v .. '_3'] then | |||
row | row | ||
:tag('td') | :tag('td') | ||
:css('text-align', 'right') | :css('text-align', 'right') | ||
:wikitext(fmt(args['seats' .. v])) | :wikitext(fmt(args['seats' .. v .. '_3']) or '–') | ||
end | |||
if args['iseats' .. v .. '_3'] or has_seats3 and args['ivotes' .. v .. '_3'] and not args['seats' .. v .. '_3'] or args['aseats' .. v .. '_3'] then | |||
row | row | ||
:tag('td') | :tag('td') | ||
:css('text-align', 'right') | :css('text-align', 'right') | ||
:wikitext(' | :wikitext(fmt(args['iseats' .. v .. '_3']) or fmt(args['aseats' .. v .. '_3'])) | ||
end | end | ||
if | end | ||
if args['st1t' .. v] and has_sspan or headings['st1t'] and not has_sspan then | |||
row | row | ||
:tag('td') | :tag('td') | ||
:attr('rowspan', args['sspan' .. v]) | |||
:css('text-align', 'right') | :css('text-align', 'right') | ||
:wikitext(args['st1t' .. v] or '–') | |||
end | |||
if args['st2t' .. v] and has_sspan or headings['st2t'] and not has_sspan then | |||
row | |||
:tag('td') | |||
:attr('rowspan', args['sspan' .. v]) | |||
:css('text-align', 'right') | |||
:wikitext(args['st2t' .. v] or '–') | |||
end | |||
if args['st3t' .. v] and has_sspan or headings['st3t'] and not has_sspan then | |||
row | |||
:tag('td') | |||
:attr('rowspan', args['sspan' .. v]) | |||
:css('text-align', 'right') | |||
:wikitext(args['st3t' .. v] or '–') | |||
end | |||
if args['st4t' .. v] and has_sspan or headings['st4t'] and not has_sspan then | |||
row | |||
:tag('td') | |||
:attr('rowspan', args['sspan' .. v]) | |||
:css('text-align', 'right') | |||
:wikitext(args['st4t' .. v] or '–') | |||
end | |||
if args['st5t' .. v] and has_sspan or headings['st5t'] and not has_sspan then | |||
row | |||
:tag('td') | |||
:attr('rowspan', args['sspan' .. v]) | |||
:css('text-align', 'right') | |||
:wikitext(args['st5t' .. v] or '–') | |||
end | |||
if args['totseats' .. v] and has_sspan or args['atotseats' .. v] and has_sspan then | |||
row | |||
:tag('td') | |||
:attr('rowspan', args['tsspan' .. v]) | |||
:css('text-align', 'right') | |||
:wikitext(args['totseats' .. v] or args['atotseats' .. v] or '–') | |||
end | |||
if headings['totseats'] and not args['itotseats' .. v] and not args['atotseats' .. v] and not has_sspan then | |||
row | |||
:tag('td') | |||
:css('text-align', 'right') | |||
:wikitext(fmt(args['totseats' .. v]) or '–') | |||
elseif headings['totseats'] and not has_sspan then | |||
row | |||
:tag('td') | |||
:css('text-align', 'right') | |||
:css('font-style', 'italic') | |||
:wikitext(args['itotseats' .. v] or args['atotseats' .. v]) | |||
end | |||
if headings['sc'] and args.sctitle then | |||
row | |||
:tag('td') | |||
:wikitext(args['sc' .. v]) | :wikitext(args['sc' .. v]) | ||
elseif headings['sc'] then | elseif headings['sc'] then | ||
row | row | ||
:tag('td') | :tag('td') | ||
:css('text-align', 'right') | :css('text-align', 'right') | ||
:wikitext('–') | :wikitext(args['sc' .. v] or '–') | ||
end | end | ||
end | |||
end | end | ||
-- separating line | -- separating line | ||
if args['valid'] or args['valid2'] or args['valid3'] or args['invalid'] or args['invalid2'] or args['invalid3'] or args['totalvotes'] or args['totalvotes2'] or args['totalvotes3'] or args['electorate'] or args['electorate2'] or args['electorate3'] or args['turnout'] or args['turnout2'] or args['turnout3'] or args['source'] then | |||
row = root | row = root | ||
:tag('tr') | :tag('tr') | ||
Line 341: | Line 1,046: | ||
row | row | ||
:tag('td') | :tag('td') | ||
:css('color', 'black') | |||
:css('background', '#eaecf0') | :css('background', '#eaecf0') | ||
:attr('colspan', cols) | :attr('colspan', cols) | ||
end | |||
-- valid votes | -- valid votes | ||
if args['invalid'] then | if args['invalid'] or args['invalid2'] or args['invalid3'] then | ||
row = root | row = root | ||
:tag('tr') | :tag('tr') | ||
Line 354: | Line 1,061: | ||
:attr('scope', 'row') | :attr('scope', 'row') | ||
:attr('colspan', cs) | :attr('colspan', cs) | ||
:css('text-align', 'left') | |||
:css('font-weight', 'normal') | |||
:css('color', 'inherit') | |||
:css('background', 'inherit') | |||
row | if args['invalid'] then | ||
:tag('td') | row | ||
:tag('td') | |||
:wikitext(fmt(ovalid[1])) | |||
:wikitext(pct(ovalid[ | :tag('td') | ||
:wikitext(pct(ovalid[1], ovalid[1] + invalid[1] + blank[1])) | |||
elseif not args['invalid'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and not headings['sw'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and headings['sw'] and args['validsw'] then | |||
row | |||
:tag('td') | |||
:wikitext(args['validsw']) | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and headings['sw'] and not args['validsw'] then | |||
row | |||
:tag('td') | |||
:attr('colspan', 2) | |||
:wikitext() | |||
end | |||
if rounds > 1 and args['invalid2'] then | |||
row | |||
:tag('td') | |||
:wikitext(fmt(ovalid[2])) | |||
:tag('td') | |||
:wikitext(pct(ovalid[2], ovalid[2] + invalid[2] + blank[2])) | |||
elseif rounds > 1 and not args['invalid2'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and not headings['sw'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and headings['sw'] and args['validsw2'] then | |||
row | |||
:tag('td') | |||
:wikitext(args['validsw2']) | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and headings['sw'] and not args['validsw2'] then | |||
row | |||
:tag('td') | |||
:attr('colspan', 2) | |||
:wikitext() | |||
end | |||
if args['invalid3'] then | |||
row | |||
:tag('td') | |||
:wikitext(fmt(ovalid[3])) | |||
:tag('td') | |||
:wikitext(pct(ovalid[3], ovalid[3] + invalid[3] + blank[3])) | |||
elseif has_seats3 and not args['invalid3'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
:tag('td') | |||
:wikitext() | |||
end | end | ||
if args['invalidsw'] then | if args['invalidsw'] and not has_sw2 then | ||
row:tag('td') | row:tag('td') | ||
:wikitext(args['validsw']) | :wikitext(args['validsw']) | ||
local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) | local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (headings['st1t'] and 1 or 0) + (headings['st2t'] and 1 or 0) + (headings['st3t'] and 1 or 0) + (headings['st4t'] and 1 or 0) + (headings['st5t'] and 1 or 0) + (has_seats3 and 1 or 0) | ||
if headings['seats'] or headings['sc'] then | if headings['seats'] or headings['sc'] then | ||
local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) | local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (headings['st1t'] and 1 or 0) + (headings['st2t'] and 1 or 0) + (headings['st3t'] and 1 or 0) + (headings['st4t'] and 1 or 0) + (headings['st5t'] and 1 or 0) + (has_seats3 and 1 or 0) | ||
row | row | ||
:tag('td') | :tag('td') | ||
:attr('colspan', cspan > 1 and cspan or nil) | :attr('colspan', cspan > 1 and cspan or nil) | ||
end | end | ||
elseif headings['sw'] or headings['seats'] or headings['sc'] then | elseif headings['sw'] or headings['seats'] or headings['sc'] or headings['st1t'] or headings['st2t'] or headings['st3t'] or headings['st4t'] or headings['st5t'] then | ||
local cspan = (headings['sw'] and 1 or 0) + (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) | local cspan = (headings['sw'] and 1 or 0) + (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (headings['st1t'] and 1 or 0) + (headings['st2t'] and 1 or 0) + (headings['st3t'] and 1 or 0) + (headings['st4t'] and 1 or 0) + (headings['st5t'] and 1 or 0) + (has_seats3 and 1 or 0) | ||
row | row | ||
:tag('td') | :tag('td') | ||
Line 384: | Line 1,160: | ||
:addClass('sortbottom') | :addClass('sortbottom') | ||
:css('text-align', 'right') | :css('text-align', 'right') | ||
if args['invalidonly'] or args['blank'] then | |||
row | |||
:tag('th') | :tag('th') | ||
:wikitext('Invalid votes') | :wikitext('Invalid votes') | ||
:attr('scope', 'row') | :attr('scope', 'row') | ||
:attr('colspan', cs) | :attr('colspan', cs) | ||
:css('text-align', 'left') | |||
:css('font-weight', 'normal') | |||
:css('color', 'inherit') | |||
:css('background', 'inherit') | |||
else | |||
row | |||
:tag('th') | :tag('th') | ||
:wikitext('Invalid/blank votes') | :wikitext('Invalid/blank votes') | ||
:wikitext(args.invalidnote) | |||
:attr('scope', 'row') | :attr('scope', 'row') | ||
:attr('colspan', cs) | :attr('colspan', cs) | ||
:css('text-align', 'left') | |||
:css('font-weight', 'normal') | |||
:css('color', 'inherit') | |||
:css('background', 'inherit') | |||
end | |||
row | if args['invalid'] then | ||
:tag('td') | row | ||
:wikitext(fmt(invalid[ | :tag('td') | ||
:wikitext(fmt(invalid[1])) | |||
:wikitext(pct(invalid[ | :tag('td') | ||
:wikitext(pct(invalid[1], ovalid[1] + invalid[1] + blank[1])) | |||
if args['invalidsw'] then | elseif not args['invalid'] then | ||
row | |||
:tag('td') | |||
:wikitext() | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and not headings['sw'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and headings['sw'] and args['invalidsw'] then | |||
row | |||
:tag('td') | |||
:wikitext(args['invalidsw']) | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and headings['sw'] and not args['invalidsw'] then | |||
row | |||
:tag('td') | |||
:attr('colspan', 2) | |||
:wikitext() | |||
end | |||
if rounds > 1 and args['invalid2'] then | |||
row | |||
:tag('td') | |||
:wikitext(fmt(invalid[2])) | |||
:tag('td') | |||
:wikitext(pct(invalid[2], ovalid[2] + invalid[2] + blank[2])) | |||
elseif rounds > 1 and not args['invalid2'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and not headings['sw'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and headings['sw'] and args['invalidsw2'] then | |||
row | |||
:tag('td') | |||
:wikitext(args['invalidsw2']) | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and headings['sw'] and not args['invalidsw2'] then | |||
row | |||
:tag('td') | |||
:attr('colspan', 2) | |||
:wikitext() | |||
end | |||
if has_seats3 and args['invalid3'] or has_votes3 and args['invalid3'] then | |||
row | |||
:tag('td') | |||
:wikitext(fmt(invalid[3])) | |||
:tag('td') | |||
:wikitext(pct(invalid[3], ovalid[3] + invalid[3] + blank[3])) | |||
elseif has_seats3 and not args['invalid3'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if args['invalidsw'] and not has_sw2 then | |||
row:tag('td') | row:tag('td') | ||
:wikitext(args['invalidsw']) | :wikitext(args['invalidsw']) | ||
if headings['seats'] or headings['sc'] then | if headings['seats'] or headings['sc'] or headings['st1t'] or headings['st2t'] or headings['st3t'] or headings['st4t'] or headings['st5t'] then | ||
local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) | local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (has_seats3 and 1 or 0) | ||
row | row | ||
:tag('td') | :tag('td') | ||
:attr('colspan', cspan > 1 and cspan or nil) | :attr('colspan', cspan > 1 and cspan or nil) | ||
end | end | ||
elseif headings['sw'] or headings['seats'] or headings['sc'] then | elseif headings['sw'] or headings['seats'] or headings['sc'] or headings['st1t'] or headings['st2t'] or headings['st3t'] or headings['st4t'] or headings['st5t'] then | ||
local cspan = (headings['sw'] and 1 or 0) + (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) | local cspan = (headings['sw'] and 1 or 0) + (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (headings['st1t'] and 1 or 0) + (headings['st2t'] and 1 or 0) + (headings['st3t'] and 1 or 0) + (headings['st4t'] and 1 or 0) + (headings['st5t'] and 1 or 0) + (has_seats3 and 1 or 0) | ||
row | row | ||
:tag('td') | :tag('td') | ||
:attr('colspan', cspan > 1 and cspan or nil) | :attr('colspan', cspan > 1 and cspan or nil) | ||
end | end | ||
-- | end | ||
-- blank votes | |||
if args['blank'] then | |||
row = root:tag('tr') | row = root:tag('tr') | ||
:addClass('sortbottom') | :addClass('sortbottom') | ||
:css('text-align', 'right') | :css('text-align', 'right') | ||
row | row | ||
:tag('th') | :tag('th') | ||
:wikitext(' | :wikitext('Blank votes') | ||
:attr('scope', 'row') | :attr('scope', 'row') | ||
:attr('colspan', cs) | :attr('colspan', cs) | ||
:css('text-align', 'left') | |||
:css('font-weight', 'normal') | |||
:css('color', 'inherit') | |||
:css('background', 'inherit') | |||
:tag('td') | row | ||
:wikitext( | :tag('td') | ||
:tag('td') | :wikitext(fmt(blank[1])) | ||
:wikitext(pct( | :tag('td') | ||
:wikitext(pct(blank[1], ovalid[1] + invalid[1] + blank[1])) | |||
if has_seats2 and not headings['sw'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and headings['sw'] and args['blanksw'] then | |||
row | |||
:tag('td') | |||
:wikitext(args['blanksw']) | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and headings['sw'] and not args['blanksw'] then | |||
row | |||
:tag('td') | |||
:attr('colspan', 2) | |||
:wikitext() | |||
end | |||
if rounds > 1 and args['blank2'] then | |||
row | |||
:tag('td') | |||
:wikitext(fmt(blank[2])) | |||
:tag('td') | |||
:wikitext(pct(blank[2], ovalid[2] + invalid[2] + blank[2])) | |||
elseif rounds > 1 and not args['blank2'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and not headings['sw'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and headings['sw'] and args['blanksw2'] then | |||
row | |||
:tag('td') | |||
:wikitext(args['blanksw2']) | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and headings['sw'] and not args['blanksw2'] then | |||
row | |||
:tag('td') | |||
:attr('colspan', 2) | |||
:wikitext() | |||
end | |||
if has_seats3 and args['blank3'] or has_votes3 and args['blank3'] then | |||
row | |||
:tag('td') | |||
:wikitext(fmt(blank[3])) | |||
:tag('td') | |||
:wikitext(pct(blank[3], ovalid[3] + invalid[3] + blank[3])) | |||
elseif has_seats3 and args['blank3'] or has_votes3 and args['blank3'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if args['blanksw'] and not has_sw2 then | |||
row:tag('td') | row:tag('td') | ||
:wikitext(' | :wikitext(args['blanksw']) | ||
if headings['seats'] or headings['sc'] then | if headings['seats'] or headings['sc'] or headings['st1t'] or headings['st2t'] or headings['st3t'] or headings['st4t'] or headings['st5t'] then | ||
local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) | local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (has_seats3 and 1 or 0) | ||
row | row | ||
:tag('td') | :tag('td') | ||
:attr('colspan', cspan > 1 and cspan or nil) | :attr('colspan', cspan > 1 and cspan or nil) | ||
end | end | ||
elseif headings['sw'] or headings['seats'] or headings['sc'] then | elseif headings['sw'] or headings['seats'] or headings['sc'] or headings['st1t'] or headings['st2t'] or headings['st3t'] or headings['st4t'] or headings['st5t'] then | ||
local cspan = (headings['sw'] and 1 or 0) + (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) | local cspan = (headings['sw'] and 1 or 0) + (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (headings['st1t'] and 1 or 0) + (headings['st2t'] and 1 or 0) + (headings['st3t'] and 1 or 0) + (headings['st4t'] and 1 or 0) + (headings['st5t'] and 1 or 0) + (has_seats3 and 1 or 0) | ||
row | row | ||
:tag('td') | :tag('td') | ||
:attr('colspan', cspan > 1 and cspan or nil) | :attr('colspan', cspan > 1 and cspan or nil) | ||
end | |||
end | |||
-- total | |||
if args['invalid'] or args['totalvotes'] or args['invalid2'] or args['totalvotes2'] then | |||
row = root:tag('tr') | row = root:tag('tr') | ||
:addClass('sortbottom') | :addClass('sortbottom') | ||
Line 467: | Line 1,378: | ||
row | row | ||
:tag('th') | :tag('th') | ||
:wikitext('Total votes') | :wikitext(args.tvtitle or 'Total votes') | ||
:attr('scope', 'row') | :attr('scope', 'row') | ||
:attr('colspan', cs) | :attr('colspan', cs) | ||
:css('text-align', 'left') | |||
:css('background', 'inherit') | |||
:css('color', 'inherit') | |||
if not args['totalvotes'] and args['invalid'] then | |||
row | |||
:tag('td') | |||
:wikitext(fmt(ovalid[1] + invalid[1] + blank[1])) | |||
:tag('td') | |||
:wikitext(pct(1, 1)) | |||
elseif args['totalvotes'] then | |||
row | |||
:tag('td') | |||
:wikitext(fmt(args.totalvotes)) | |||
:tag('td') | |||
:wikitext('–') | |||
elseif not args['invalid'] and not args['totalvotes'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and not headings['sw'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and headings['sw'] and args['invalidsw'] then | |||
row | |||
:tag('td') | |||
:wikitext('–') | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and headings['sw'] and not args['invalidsw'] then | |||
row | |||
:tag('td') | |||
:attr('colspan', 2) | |||
:wikitext() | |||
end | |||
if rounds > 1 and args['invalid2'] and not args['totalvotes2'] then | |||
row | |||
:tag('td') | |||
:wikitext(fmt(ovalid[2] + invalid[2] + blank[2])) | |||
:tag('td') | |||
:wikitext(pct(1, 1)) | |||
elseif rounds > 1 and args['totalvotes2'] then | |||
row | |||
:tag('td') | |||
:wikitext(fmt(args.totalvotes2)) | |||
:tag('td') | |||
:wikitext('–') | |||
elseif rounds > 1 and not args['invalid2'] or rounds > 1 and not args['totalvotes2'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and not headings['sw'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and headings['sw'] and args['invalidsw2'] then | |||
row | |||
:tag('td') | |||
:wikitext('–') | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and headings['sw'] and not args['invalidsw2'] then | |||
row | |||
:tag('td') | |||
:attr('colspan', 2) | |||
:wikitext() | |||
end | |||
if has_seats3 and not args['totalvotes3'] and args['invalid3'] or has_votes3 and not args['totalvotes3'] and args['invalid3'] then | |||
row | |||
:tag('td') | |||
:wikitext(fmt(ovalid[3] + invalid[3] + blank[3])) | |||
:tag('td') | |||
:wikitext(pct(1, 1)) | |||
elseif has_seats3 and args['totalvotes3'] or has_votes3 and args['totalvotes3'] then | |||
row | |||
:tag('td') | |||
:wikitext(fmt(args.totalvotes3)) | |||
:tag('td') | |||
:wikitext('–') | |||
elseif has_seats3 and not args['invalid3'] or has_votes3 and not args['invalid3'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if args['invalidsw'] and not has_sw2 then | |||
row:tag('td') | |||
:wikitext('–') | |||
if headings['seats'] or headings['sc'] or headings['st1t'] or headings['st2t'] or headings['st3t'] or headings['st4t'] or headings['st5t'] then | |||
local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (headings['st1t'] and 1 or 0) + (headings['st2t'] and 1 or 0) + (headings['st3t'] and 1 or 0) + (headings['st4t'] and 1 or 0) + (headings['st5t'] and 1 or 0) + (has_seats3 and 1 or 0) | |||
row | row | ||
:tag('td') | :tag('td') | ||
: | :attr('colspan', cspan > 1 and cspan or nil) | ||
end | |||
elseif headings['sw'] or headings['seats'] or headings['sc'] or headings['st1t'] or headings['st2t'] or headings['st3t'] or headings['st4t'] or headings['st5t'] then | |||
local cspan = (headings['sw'] and 1 or 0) + (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (headings['st1t'] and 1 or 0) + (headings['st2t'] and 1 or 0) + (headings['st3t'] and 1 or 0) + (headings['st4t'] and 1 or 0) + (headings['st5t'] and 1 or 0) + (has_seats3 and 1 or 0) | |||
row | |||
local cspan = (headings['sw'] and 1 or 0) + (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) | |||
:tag('td') | :tag('td') | ||
:attr('colspan', cspan > 1 and cspan or nil) | :attr('colspan', cspan > 1 and cspan or nil) | ||
end | |||
end | |||
-- registered | -- registered | ||
if args['electorate'] or args['turnout'] then | if args['electorate'] or args['electorate2'] or args['turnout'] or args['turnout2'] then | ||
row = root:tag('tr') | row = root:tag('tr') | ||
:addClass('sortbottom') | :addClass('sortbottom') | ||
Line 496: | Line 1,503: | ||
:attr('scope', 'row') | :attr('scope', 'row') | ||
:attr('colspan', cs) | :attr('colspan', cs) | ||
:css('text-align', 'left') | |||
:css('font-weight', 'normal') | |||
:css('color', 'inherit') | |||
:css('background', 'inherit') | |||
row | |||
row:tag('td') | :tag('td') | ||
:wikitext( | :wikitext(fmt(electorate[1])) | ||
row:tag('td') | if args['invalid'] and args['electorate'] and not args['totalvotes'] then | ||
:wikitext( | row | ||
:tag('td') | |||
:wikitext(args.turnout or pct(ovalid[1] + invalid[1] + blank[1], electorate[1])) | |||
elseif args['totalvotes'] and args['electorate'] then | |||
row | |||
:tag('td') | |||
:wikitext(args.turnout or pct(totalvotes[1], electorate[1])) | |||
elseif args['electorate'] then | |||
row | |||
:tag('td') | |||
:wikitext(args.turnout or '–') | |||
else | |||
row | |||
:tag('td') | |||
:wikitext(args.turnout) | |||
end | |||
if has_seats2 and not headings['sw'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and headings['sw'] and args['turnoutsw'] then | |||
row | |||
:tag('td') | |||
:wikitext(args['turnoutsw']) | |||
:tag('td') | |||
:wikitext() | |||
end | |||
if has_seats2 and headings['sw'] and not args['turnoutsw'] then | |||
row | |||
:tag('td') | |||
:attr('colspan', 2) | |||
:wikitext() | |||
end | |||
if rounds > 1 then | |||
row | |||
:tag('td') | |||
:wikitext(fmt(electorate[2])) | |||
if args['invalid2'] and args['electorate2'] then | |||
row | |||
:tag('td') | |||
:wikitext(args.turnout2 or pct(ovalid[2] + invalid[2] + blank[2], electorate[2])) | |||
elseif args['totalvotes2'] and args['electorate2'] then | |||
row | |||
:tag('td') | |||
:wikitext(args.turnout2 or pct(totalvotes[2], electorate[2])) | |||
elseif args['electorate2'] then | |||
row | |||
:tag('td') | |||
:wikitext(args.turnout2 or '–') | |||
else | |||
row | |||
:tag('td') | |||
:wikitext(args.turnout2) | |||
end | |||
if has_seats2 and not headings['sw'] then | |||
row | |||
:tag('td') | |||
:wikitext() | |||
end | end | ||
if has_seats2 and headings['sw'] and args['turnoutsw2'] then | |||
row | |||
:tag('td') | |||
:wikitext(args['turnoutsw2']) | |||
:wikitext( | :tag('td') | ||
:wikitext() | |||
end | end | ||
if has_seats2 and headings['sw'] and not args['turnoutsw2'] then | |||
row | |||
:tag('td') | |||
: | :attr('colspan', 2) | ||
:wikitext() | |||
:wikitext( | |||
end | end | ||
end | end | ||
if has_seats3 or has_votes3 then | |||
row | |||
row:tag('td') | :tag('td') | ||
:wikitext(fmt(electorate[3])) | |||
row:tag('td') | if args['invalid3'] and args['electorate3'] then | ||
row | |||
:tag('td') | |||
:wikitext(args.turnout3 or pct(ovalid[3] + invalid[3] + blank[3], electorate[3])) | |||
elseif args['totalvotes3'] and args['electorate3'] then | |||
row | |||
:tag('td') | |||
:wikitext(args.turnout3 or pct(totalvotes[3], electorate[3])) | |||
elseif args['electorate3'] then | |||
row | |||
:tag('td') | |||
:wikitext(args.turnout3 or '–') | |||
else | |||
row | |||
:tag('td') | |||
:wikitext(args.turnout3) | |||
end | end | ||
end | end | ||
if args['turnoutsw'] then | if args['turnoutsw'] and not has_sw2 then | ||
row:tag('td') | row:tag('td') | ||
:wikitext(args['turnoutsw']) | :wikitext(args['turnoutsw']) | ||
if headings['seats'] or headings['sc'] then | if headings['seats'] or headings['sc'] or headings['st1t'] or headings['st2t'] or headings['st3t'] or headings['st4t'] or headings['st5t'] then | ||
local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) | local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (headings['st1t'] and 1 or 0) + (headings['st2t'] and 1 or 0) + (headings['st3t'] and 1 or 0) + (headings['st4t'] and 1 or 0) + (headings['st5t'] and 1 or 0) + (has_seats3 and 1 or 0) | ||
row | |||
:tag('td') | :tag('td') | ||
:attr('colspan', cspan > 1 and cspan or nil) | :attr('colspan', cspan > 1 and cspan or nil) | ||
end | end | ||
elseif headings['sw'] or headings['seats'] or headings['sc'] then | elseif headings['sw'] or headings['seats'] or headings['sc'] or headings['st1t'] or headings['st2t'] or headings['st3t'] or headings['st4t'] or headings['st5t'] then | ||
local cspan = (headings['sw'] and 1 or 0) + (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) | local cspan = (headings['sw'] and 1 or 0) + (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (headings['st1t'] and 1 or 0) + (headings['st2t'] and 1 or 0) + (headings['st3t'] and 1 or 0) + (headings['st4t'] and 1 or 0) + (headings['st5t'] and 1 or 0) + (has_seats3 and 1 or 0) | ||
row | |||
:tag('td') | :tag('td') | ||
:attr('colspan', cspan > 1 and cspan or nil) | :attr('colspan', cspan > 1 and cspan or nil) | ||
Line 557: | Line 1,630: | ||
row | row | ||
:tag('td') | :tag('td') | ||
:css('color', 'black') | |||
:css('background', '#eaecf0') | :css('background', '#eaecf0') | ||
:attr('colspan', cols) | :attr('colspan', cols) | ||
Line 569: | Line 1,643: | ||
:attr('scope', 'row') | :attr('scope', 'row') | ||
:attr('colspan', cs) | :attr('colspan', cs) | ||
:css('text-align', 'left') | |||
:css('font-weight', 'normal') | |||
:css('color', 'inherit') | |||
for k=1,rounds do | :css('background', 'inherit') | ||
for k=1, rounds do | |||
row | row | ||
:tag('td') | :tag('td') | ||
Line 586: | Line 1,661: | ||
end | end | ||
if args['result'] then | if args['result'] then | ||
row = root:tag('tr') | |||
:addClass('sortbottom') | :addClass('sortbottom') | ||
-- determine the color | -- determine the color | ||
local color = args['resultcolour'] or nil | local color = get_color(args['resultcolour'] or nil, args['result']) | ||
if args['resultsw'] then | |||
row | |||
:tag('td') | |||
:css('background-color', color) | |||
row | |||
:tag('td') | |||
:attr('colspan', 2) | |||
:wikitext(args['result']) | |||
row | |||
:tag('td') | |||
:attr('colspan', 2) | |||
:css('text-align', 'right') | |||
:wikitext('Swing') | |||
row | |||
:tag('td') | |||
:css('text-align', 'right') | |||
:wikitext(args['resultsw']) | |||
else | |||
row | |||
:tag('td') | |||
:css('background-color', color) | |||
row | |||
:tag('td') | |||
:attr('colspan', cols - 1) | |||
:wikitext(args['result']) | |||
end | |||
end | end | ||
if args['majority2'] then | if args['majority2'] then | ||
Line 633: | Line 1,702: | ||
:attr('scope', 'row') | :attr('scope', 'row') | ||
:attr('colspan', cs) | :attr('colspan', cs) | ||
:css('text-align', 'left') | |||
:css('font-weight', 'normal') | |||
:css('color', 'inherit') | |||
for k=1,rounds do | :css('background', 'inherit') | ||
for k=1, rounds do | |||
row | row | ||
:tag('td') | :tag('td') | ||
Line 650: | Line 1,720: | ||
end | end | ||
if args['result2'] then | if args['result2'] then | ||
row = root:tag('tr') | |||
:addClass('sortbottom') | :addClass('sortbottom') | ||
-- determine the color | -- determine the color | ||
local color = args['resultcolour'] or nil | local color = get_color(args['resultcolour'] or nil, args['result2']) | ||
if args['resultsw2'] then | |||
row | |||
:tag('td') | |||
:css('background-color', color) | |||
row | |||
:tag('td') | |||
:attr('colspan', 2) | |||
:wikitext(args['result2']) | |||
row | |||
:tag('td') | |||
:attr('colspan', 2) | |||
:css('text-align', 'right') | |||
:wikitext('Swing') | |||
row | |||
:tag('td') | |||
:css('text-align', 'right') | |||
:wikitext(args['resultsw2']) | |||
else | |||
row | |||
:tag('td') | |||
:css('background-color', color) | |||
row | |||
:tag('td') | |||
:attr('colspan', cols - 1) | |||
:wikitext(args['result2']) | |||
end | |||
end | end | ||
if args['source'] then | if args['source'] then | ||
Line 694: | Line 1,758: | ||
:wikitext('Source: ', args.source) | :wikitext('Source: ', args.source) | ||
:attr('colspan', cols) | :attr('colspan', cols) | ||
:css('text-align', 'left') | |||
end | |||
if args['embedded'] then | |||
root:wikitext(args['embedded']) | |||
end | |||
return tostring(root) .. tracking | return tostring(root) .. tracking | ||
end | end | ||
return p | return p |
Latest revision as of 21:06, 7 August 2024
Documentation for this module may be created at Module:Election results/doc
require('strict')
local p = {}
local political_party = require('Module:Political party')
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame)
local index, headings, showtotal = {}, {}, {}
local cols, rounds = 0, 1
local winner, winner_votes = {0, 0, 0}, {0, 0, 0}
local valid = {0, 0, 0}
local invalid = {tonumber(args.invalid) or 0, tonumber(args.invalid2) or 0, tonumber(args.invalid3) or 0}
local blank = {tonumber(args.blank) or 0, tonumber(args.blank2) or 0, tonumber(args.blank3) or 0}
local majority = {tonumber(args.majority)}
local majority2 = {tonumber(args.majority2)}
local majoritypct = {tonumber(args.majoritypct)}
local majoritypct2 = {tonumber(args.majoritypct2)}
local totalvotes = {tonumber(args.totalvotes), tonumber(args.totalvotes2), tonumber(args.totalvotes3)}
local electorate = {tonumber(args.electorate), tonumber(args.electorate2), tonumber(args.electorate3)}
local turnout = {tonumber(args.turnout), tonumber(args.turnout2), tonumber(args.turnout3)}
local seats = 0
local seats_2 = 0
local seats_3 = 0
local st1t = 0
local st2t = 0
local st3t = 0
local st4t = 0
local st5t = 0
local totseats = 0
local row, secondrow
local tracking = ''
local max_rows = 0
-- helper functions
local lang = mw.getContentLanguage()
local function fmt(n)
return n and tonumber(n) and lang:formatNum(tonumber(n)) or nil
end
local function pct(n, d)
n, d = tonumber(n), tonumber(d)
if n and d and d > 0 then
return string.format('%.2f', n / d * 100)
end
return '–'
end
local function tonumdash(s)
if s then
s = mw.ustring.gsub(s, '&[MmNn][Dd][Aa][Ss][Hh];', '-')
s = mw.ustring.gsub(s, '&[Mm][Ii][Nn][Uu][Ss];', '-')
s = mw.ustring.gsub(s, '[—–−]', '-')
return tonumber(s) or 0
end
end
local function unlink(s)
if s then
s = s:match("^[^%[]-%[%[([^%]]-)|[^%]]-%]%].*$") or s
s = s:match("^[^%[]-%[%[([^%]]-)%]%].*$") or s
end
return s
end
local function get_color(color, party)
if color == nil then
local party = unlink(party) or ''
if party ~= '' then
color = political_party._fetch({party, 'color'})
end
end
if color ~= nil then
color = mw.ustring.gsub(color, '&(#)35;', '%1')
end
return color
end
-- preprocess the input
local stop_flag = false
local i = 0
local has_votes = args['invalid'] or args['totalvotes'] or args['electorate'] or args['turnout']
local has_votes2 = args['invalid2'] or args['totalvotes2'] or args['electorate2'] or args['turnout2']
local has_votes3 = args['votes' .. i .. '_3'] or args['ivotes' .. i .. '_3']
local has_seats2 = args['seats' .. i .. '_2'] or args['iseats' .. i .. '_2']
local has_seats3 = args['seats' .. i .. '_3']
local has_sw2 = args['sw' .. i .. '_2']
local seats_only = has_seats2 and not has_votes
local has_cand = args['cand' .. i]
local has_alliance = args['alliance' .. i]
local has_party = args['party' .. i]
local has_rspan = args['vspan' .. i] or args['v2span' .. i]
local has_sspan = args['sspan' .. i] or args['tsspan' .. i]
while stop_flag == false do
stop_flag = true
for kk = 1, 20 do
i = i + 1
for k, key in ipairs({'alliance', 'atotal', 'cand', 'vp', 'party', 'ivotes', 'ipct', 'iseats', 'sc', 'st1t', 'st2t', 'st3t', 'st4t', 'st5t', 'sw', 'seats', 'totalvotes', 'totseats', 'acolor', 'rcolor'}) do
if args[key .. i] then
headings[key] = true
stop_flag = false
max_rows = i > max_rows and i or max_rows
end
end
if args['row' .. i] then
stop_flag = false
max_rows = i > max_rows and i or max_rows
end
if args['row' .. i] or args['cand' .. i] or args['party' .. i] or args['alliance' .. i] or args['atotal' .. i] or args['atotalnv' .. i] or args['header' .. i] then
table.insert(index, i)
if args['votes' .. i] then
has_votes = true
if tonumber(args['votes' .. i]) then showtotal.votes = 1 end
local votesi = tonumber(args['votes' .. i]) or 0
args['votes' .. i] = votesi
if votesi > winner_votes[1] then
winner[1] = i
winner_votes[1] = votesi
end
valid[1] = valid[1] + votesi
end
if args['votes' .. i .. '_2'] or args['ivotes' .. i .. '_2'] or args['avotes' .. i .. '_2'] or args['ipct' .. i .. '_2'] or args['apct' .. i .. '_2'] then
has_votes2 = true
end
if args['votes' .. i .. '_3'] or args['ivotes' .. i .. '_3'] or args['ipct' .. i .. '_3'] then
has_votes3 = true
end
if args['alliance' .. i] then
has_alliance = true
end
if args['party' .. i] then
has_party = true
end
if args['cand' .. i] then
has_cand = true
end
if args['ivotes' .. i] then
has_votes = true
end
if args['ipct' .. i] then
has_votes = true
end
if args['sw' .. i .. '_2'] then
has_sw2 = true
rounds = (rounds < 2) and 2 or rounds
end
if args['valid2'] or args['invalid2'] or args['totalvotes2'] or args['electorate2'] or args['turnout2'] then
rounds = (rounds < 2) and 2 or rounds
end
if args['vspan' .. i] or args['v2span' .. i] then
has_rspan = true
end
if args['sspan' .. i] or args['tsspan' .. i] then
has_sspan = true
end
if args['ipct' .. i .. '_2'] then
rounds = (rounds < 2) and 2 or rounds
end
if args['votes' .. i .. '_2'] then
has_votes = true
rounds = (rounds < 2) and 2 or rounds
if tonumber(args['votes' .. i .. '_2']) then showtotal.votes_2 = 1 end
local votesi = tonumber(args['votes' .. i .. '_2']) or 0
args['votes' .. i .. '_2'] = votesi
if votesi > winner_votes[2] then
winner[2] = i
winner_votes[2] = votesi
end
valid[2] = valid[2] + votesi
end
if args['votes' .. i .. '_3'] then
has_votes = true
rounds = (rounds < 3) and 3 or rounds
if tonumber(args['votes' .. i .. '_3']) then showtotal.votes_3 = 1 end
local votesi = tonumber(args['votes' .. i .. '_3']) or 0
args['votes' .. i .. '_3'] = votesi
if votesi > winner_votes[3] then
winner[3] = i
winner_votes[3] = votesi
end
valid[3] = valid[3] + votesi
end
if args['seats' .. i] then
if tonumber(args['seats' .. i]) then showtotal.seats = 1 end
seats = seats + (tonumber(args['seats' .. i]) or 0)
end
if args['seats' .. i .. '_2'] or args['iseats' .. i .. '_2'] then
has_seats2 = true
rounds = (rounds < 2) and 2 or rounds
if tonumber(args['seats' .. i ..'_2']) then showtotal.seats_2 = 1 end
seats_2 = seats_2 + (tonumber(args['seats' .. i .. '_2']) or 0)
end
if args['seats' .. i .. '_3'] then
has_seats3 = true
rounds = (rounds < 3) and 3 or rounds
if tonumber(args['seats' .. i ..'_3']) then showtotal.seats_3 = 1 end
seats_3 = seats_3 + (tonumber(args['seats' .. i .. '_3']) or 0)
end
if args['st1t' .. i] then
if tonumber(args['st1t' .. i]) then showtotal.st1t = 1 end
st1t = st1t + (tonumber(args['st1t' .. i]) or 0)
end
if args['st2t' .. i] then
if tonumber(args['st2t' .. i]) then showtotal.st2t = 1 end
st2t = st2t + (tonumber(args['st2t' .. i]) or 0)
end
if args['st3t' .. i] then
if tonumber(args['st3t' .. i]) then showtotal.st3t = 1 end
st3t = st3t + (tonumber(args['st3t' .. i]) or 0)
end
if args['st4t' .. i] then
if tonumber(args['st4t' .. i]) then showtotal.st4t = 1 end
st4t = st4t + (tonumber(args['st4t' .. i]) or 0)
end
if args['st5t' .. i] then
if tonumber(args['st5t' .. i]) then showtotal.st5t = 1 end
st5t = st5t + (tonumber(args['st5t' .. i]) or 0)
end
if args['totseats' .. i] then
if tonumber(args['totseats' .. i]) then showtotal.totseats = 1 end
totseats = totseats + (tonumber(args['totseats' .. i]) or 0)
end
if has_seats2 and not has_votes or has_seats3 and not has_votes then
seats_only = true
end
end
end
end
local ovalid = {valid[1], valid[2], valid[3]}
seats = ((args['total_seats'] or '') == 'TOTAL' and seats) or args['total_seats'] or seats
totseats = ((args['total_totseats'] or '') == 'TOTAL' and totseats) or args['total_totseats'] or totseats
st1t = ((args['total_st1t'] or '') == 'TOTAL' and st1t) or args['total_st1t'] or st1t
st2t = ((args['total_st2t'] or '') == 'TOTAL' and st2t) or args['total_st2t'] or st2t
st3t = ((args['total_st3t'] or '') == 'TOTAL' and st3t) or args['total_st3t'] or st3t
st4t = ((args['total_st4t'] or '') == 'TOTAL' and st4t) or args['total_st4t'] or st4t
st5t = ((args['total_st5t'] or '') == 'TOTAL' and st5t) or args['total_st5t'] or st5t
if seats or totseats or st1t or st2t or st3t or st4t or st5t or args['total_sc'] or args['total_st1t'] or args['total_st2t'] or args['total_st3t'] or args['total_st4t'] or args['total_st5t'] or args['valid'] or ((rounds > 1) and args['valid2']) or ((rounds > 1) and args['valid3']) then
max_rows = max_rows + 1
local i = max_rows
table.insert(index, i)
args['votes' .. i] = showtotal.votes and valid[1] or nil
args['votes' .. i .. '_2'] = showtotal.votes_2 and valid[2] or nil
args['votes' .. i .. '_3'] = showtotal.votes_3 and valid[3] or nil
args['colour' .. i] = 'inherit'
args['color' .. i] = 'inherit'
args['row' .. i] = 'Total'
args['sw' .. i] = '–'
args['sw' .. i .. '_2'] = '–'
args['seats' .. i] = showtotal.seats and seats or nil
args['seats' .. i .. '_2'] = showtotal.seats_2 and seats_2 or nil
args['seats' .. i .. '_3'] = showtotal.seats_3 and seats_3 or nil
args['st1t' .. i] = showtotal.st1t and st1t or args.total_st1t
args['st2t' .. i] = showtotal.st2t and st2t or args.total_st2t
args['st3t' .. i] = showtotal.st3t and st3t or args.total_st3t
args['st4t' .. i] = showtotal.st4t and st4t or args.total_st4t
args['st5t' .. i] = showtotal.st5t and st5t or args.total_st5t
args['sc' .. i] = args['total_sc']
args['totseats' .. i] = showtotal.totseats and totseats or nil
args['font-weight' .. i] = 'bold'
args['class' .. i] = 'sortbottom'
ovalid[1] = tonumber(args['valid']) or valid[1]
ovalid[2] = tonumber(args['valid2']) or valid[2]
ovalid[3] = tonumber(args['valid3']) or valid[3]
end
-- build the table
local root = mw.html.create(args['embed'] and '' or 'table')
if args['embed'] == nil then
root
:addClass('wikitable sortable')
:tag('caption')
:wikitext(args.caption)
:done()
end
local topcell = nil
if args['image'] then
topcell = root
:tag('th')
:css('text-align', 'center')
:css('color', 'black')
:css('background', '#F8F9FA')
:wikitext(args['image'])
end
if args['reporting'] then
if (topcell == nil) then
topcell = root
:tag('td')
:css('text-align', 'center')
:css('color', 'black')
:css('background', '#F8F9FA')
end
topcell:tag('div')
:addClass('center')
:wikitext(frame:expandTemplate{
title = 'percentage bar',
args = {args.reporting,
args.reporting .. '% reporting',
['width'] = '200px',
['hex'] = '1BCE0E'
}})
end
local rowspan = (rounds > 1) and 2 or headings['st1t'] and 2 or nil
row = args['embed'] and mw.html.create('') or root:tag('tr')
if args['dsv'] and has_alliance and has_party then
row
:tag('th')
:wikitext(args.partytitle or 'Party or alliance')
:attr('scope', 'col')
:attr('colspan', 4)
:attr('rowspan', rowspan)
:done()
cols = cols + 4
row
:tag('th')
:wikitext(args.candtitle or 'Candidate')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:done()
cols = cols + 1
elseif args['dsv'] then
row
:tag('th')
:wikitext(args.partytitle or 'Party')
:attr('scope', 'col')
:attr('colspan', 2)
:attr('rowspan', rowspan)
:done()
cols = cols + 2
row
:tag('th')
:wikitext(args.candtitle or 'Candidate')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:done()
cols = cols + 1
elseif has_cand then
if has_cand and has_party and has_alliance then
row
:tag('th')
:wikitext('Candidate')
:attr('rowspan', rowspan)
:attr('colspan', 2)
row
:tag('th')
:wikitext(args.partytitle or 'Party or alliance')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:attr('colspan', 3)
:done()
cols = cols + 5
elseif has_cand and has_party then
row
:tag('th')
:wikitext('Candidate')
:attr('scope', 'col')
:attr('colspan', 2)
:attr('rowspan', rowspan)
:done()
cols = cols + 2
end
if has_cand and not has_party then
row
:tag('th')
:wikitext('Candidate')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:done()
cols = cols + 1
end
if headings['vp'] then
row
:tag('th')
:wikitext('Running mate')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:done()
cols = cols + 1
end
if has_party and not has_alliance then
row
:tag('th')
:wikitext(args.partytitle or 'Party')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:done()
cols = cols + 1
end
elseif has_party and has_alliance then
row
:tag('th')
:wikitext(args.partytitle or 'Party or alliance')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:attr('colspan', 4)
:done()
cols = cols + 4
else
row
:tag('th')
:wikitext(args.partytitle or 'Party')
:attr('scope', 'col')
:attr('colspan', 2)
:attr('rowspan', rowspan)
:done()
cols = cols + 2
end
if rounds > 1 then
if has_seats2 and headings['sw'] and not has_seats3 then
row
:tag('th')
:wikitext(args.firstround or 'First round')
:attr('scope', 'col')
:attr('colspan', 4)
:done()
:tag('th')
:wikitext(args.secondround or 'Second round')
:attr('scope', 'col')
:attr('colspan', 4)
:done()
elseif has_seats2 and not has_seats3 then
row
:tag('th')
:wikitext(args.firstround or 'First round')
:attr('scope', 'col')
:attr('colspan', 3)
:done()
:tag('th')
:wikitext(args.secondround or 'Second round')
:attr('scope', 'col')
:attr('colspan', 3)
:done()
elseif has_seats3 then
row
:tag('th')
:wikitext(args.firstround or 'First round')
:attr('scope', 'col')
:attr('colspan', 3)
:done()
:tag('th')
:wikitext(args.secondround or 'Second round')
:attr('scope', 'col')
:attr('colspan', 3)
:done()
:tag('th')
:wikitext(args.thirdround or 'Third round')
:attr('scope', 'col')
:attr('colspan', 3)
:done()
elseif has_votes3 then
row
:tag('th')
:wikitext(args.firstround or 'First round')
:attr('scope', 'col')
:attr('colspan', 2)
:done()
:tag('th')
:wikitext(args.secondround or 'Second round')
:attr('scope', 'col')
:attr('colspan', 2)
:done()
:tag('th')
:wikitext(args.thirdround or 'Third round')
:attr('scope', 'col')
:attr('colspan', 2)
:done()
elseif has_votes then
row
:tag('th')
:wikitext(args.firstround or 'First round')
:attr('scope', 'col')
:attr('colspan', 2)
:done()
:tag('th')
:wikitext(args.secondround or 'Second round')
:attr('scope', 'col')
:attr('colspan', 2)
:done()
end
secondrow = args['embed'] and mw.html.create('') or root:tag('tr')
else
secondrow = row
end
rowspan = (rounds > 1) and 1 or (rounds < 2 and headings['st1t']) and 2 or nil
if has_seats2 and not has_seats3 and headings['sw'] then
for k=1, rounds do
secondrow
:tag('th')
:wikitext(args.votestitle or 'Votes')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:done()
:tag('th')
:wikitext('%')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:done()
:tag('th')
:wikitext('+/–')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:done()
:tag('th')
:wikitext(args.seatstitle or 'Seats')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:done()
cols = cols + 4
end
end
if has_seats2 and not headings['sw'] or has_seats3 and not headings['sw'] then
for k=1, rounds do
secondrow
:tag('th')
:wikitext(args.votestitle or 'Votes')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:done()
:tag('th')
:wikitext('%')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:done()
:tag('th')
:wikitext(args.seatstitle or 'Seats')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:done()
cols = cols + 3
end
end
if has_votes and not has_seats2 then
for k=1, rounds do
secondrow
:tag('th')
:wikitext(args.votestitle or 'Votes')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:done()
:tag('th')
:wikitext('%')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:done()
cols = cols + 2
end
end
if headings['sw'] and not has_seats2 then
row
:tag('th')
:wikitext('+/–')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:done()
cols = cols + 1
end
rowspan = (rounds > 1) and 2 or headings['sc'] and headings['st1t'] and 2 or headings['seats'] and headings['st1t'] and 2 or nil
if headings['seats'] and not has_seats2 then
row
:tag('th')
:wikitext(args.seatstitle or 'Seats')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:done()
cols = cols + 1
end
if headings['st1t'] then
row
:tag('th')
:wikitext('Seats')
:attr('colspan', 5)
:attr('scope', 'col')
:done()
if rounds < 2 then secondrow = root:tag('tr')
end
secondrow
:tag('th')
:wikitext(args.seattype1)
:attr('scope', 'col')
:done()
cols = cols + 1
if headings['st2t'] then
secondrow
:tag('th')
:wikitext(args.seattype2)
:attr('scope', 'col')
:done()
cols = cols + 1
end
if headings['st3t'] then
secondrow
:tag('th')
:wikitext(args.seattype3)
:attr('scope', 'col')
:done()
cols = cols + 1
end
if headings['st4t'] then
secondrow
:tag('th')
:wikitext(args.seattype4)
:attr('scope', 'col')
:done()
cols = cols + 1
end
if headings['st5t'] then
secondrow
:tag('th')
:wikitext(args.seattype5)
:attr('scope', 'col')
:done()
cols = cols + 1
end
end
if headings['totseats'] then
row
:tag('th')
:wikitext(headings['totseats'] and 'Total<br>seats' or 'Totseats±')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:done()
cols = cols + 1
end
if headings['sc'] then
row
:tag('th')
:wikitext(args.sctitle or '+/–')
:attr('scope', 'col')
:attr('rowspan', rowspan)
:done()
cols = cols + 1
end
if topcell then
topcell:attr('colspan', cols)
end
local cs = cols - 2*rounds
- (headings['sw'] and 1 or 0)
- (headings['totseats'] and 1 or 0)
- (headings['seats'] and 1 or 0)
- (headings['sc'] and 1 or 0)
- (headings['st1t'] and 1 or 0)
- (headings['st2t'] and 1 or 0)
- (headings['st3t'] and 1 or 0)
- (headings['st4t'] and 1 or 0)
- (headings['st5t'] and 1 or 0)
- (has_seats2 and 1 or 0)
- (has_seats3 and 1 or 0)
- (has_sw2 and 1 or 0)
+ (has_votes and 0 or 2)
- (seats_only and 2 or 0)
local rsuff = (rounds > 1) and {'', '_2'} or (rounds > 2) and {'', '_3'} or {''}
for i, v in ipairs(index) do
local has_votesrow = args['votes' .. v] or args['ivotes' .. v] or args['avotes' .. v] or args['ipct' .. v] or args['apct' .. v] or args['atotal' .. v]
local has_seatsrow = args['seats' .. v] or args['iseats' .. v] or args['aseats' .. v]
local has_votesrow2 = args['votes' .. v .. '_2'] or args['ivotes' .. v .. '_2'] or args['avotes' .. v .. '_2'] or args['ipct' .. v .. '_2'] or args['apct' .. v .. '_2'] or args['atotal' .. v .. '_2']
local has_seatsrow2 = args['seats' .. v .. '_2'] or args['iseats' .. v .. '_2'] or args['aseats' .. v .. '_2']
local has_votesrow3 = args['votes' .. v .. '_3'] or args['ivotes' .. v .. '_3'] or args['avotes' .. v .. '_3'] or args['ipct' .. v .. '_3'] or args['apct' .. v .. '_3'] or args['atotal' .. v .. '_3']
local has_seatsrow3 = args['seats' .. v .. '_3'] or args['iseats' .. v .. '_3'] or args['aseats' .. v .. '_3']
row = root:tag('tr')
:addClass(args['class' .. v])
:css('font-weight', args['font-weight' .. v])
-- determine the colors
local color = get_color(args['colour' .. v] or args['color' .. v] or nil, args['party' .. v])
local acolor = get_color(args['acolour' .. v] or args['acolor' .. v] or nil, args['alliance' .. v])
local rcolor = get_color(args['rcolour' .. v] or args['rcolor' .. v] or nil)
-- headers
if args['header' .. v] then
row
:tag('th')
:wikitext(args['header' .. v])
:attr('colspan', cols)
else
if args['alliance' .. v] then
row
:tag('td')
:attr('rowspan', args['aspan' .. v])
:css('width', '0px')
:css('background-color', acolor)
elseif args['party' .. v] and not has_alliance or args['cand' .. v] and has_party and not has_alliance then
row
:tag('td')
:css('width', '0px')
:css('background-color', color)
end
if args['cand' .. v] and not args.dsv then
row
:css('background-color', rcolor)
:tag('td')
:attr('rowspan', args['candspan' .. v] or args['aspan' .. v])
:wikitext(args['cand' .. v])
end
if args['vp' .. v] then
row
:tag('td')
:wikitext(args['vp' .. v])
end
if args['alliance' .. v] and not has_party and args.dsv then
row
:tag('td')
:attr('rowspan', args['aspan' .. v])
:wikitext(args['alliance' .. v])
end
if args['alliance' .. v] and not args['party' .. v] and not args.dsv then
row
:tag('td')
:attr('rowspan', args['aspan' .. v])
:attr('colspan', 3)
:wikitext(args['alliance' .. v])
end
if args['alliance' .. v] and not args['party' .. v] and has_party and args.dsv then
row
:tag('td')
:attr('rowspan', args['aspan' .. v])
:attr('colspan', 3)
:wikitext(args['alliance' .. v])
end
if args['alliance' .. v] and args['party' .. v] then
row
:tag('td')
:attr('rowspan', args['aspan' .. v])
:wikitext(args['alliance' .. v])
end
if args['party' .. v] and not has_alliance or args['cand' .. v] and has_party and not has_alliance then
row
:tag('td')
:wikitext(args['party' .. v])
end
if args['row' .. v] then
row
:css('background-color', rcolor)
:tag('td')
:attr('colspan', cs)
:wikitext(args['row' .. v])
end
if has_alliance and args['party' .. v] then
row
:tag('td')
:css('background-color', color)
:tag('td')
:wikitext(args['party' .. v])
end
if args['cand' .. v] and args.dsv then
row
:tag('td')
:attr('rowspan', args['candspan' .. v])
:wikitext(args['cand' .. v])
end
if args['atotal' .. v] and has_party and not args.dsv or args['atotalnv' .. v] and has_party and not args.dsv then
row
:css('font-style', 'italic')
:tag('td')
:attr('colspan', 2)
:wikitext('Total')
end
if args['atotal' .. v] and not has_party or args['atotalnv' .. v] and not has_party then
row
:css('font-style', 'italic')
:tag('td')
:wikitext('Total')
end
if args['atotal' .. v] and has_cand and has_party and args.dsv or args['atotalnv' .. v] and has_party and args.dsv then
row
:css('font-style', 'italic')
:tag('td')
:attr('colspan', 3)
:wikitext('Total')
end
if args['votes' .. v] and args['divisor'] then
row:tag('td')
:attr('rowspan', args['vspan' .. v])
:css('text-align', 'right')
:wikitext(fmt(args['votes' .. v]))
row:tag('td')
:attr('rowspan', args['vspan' .. v])
:css('text-align', 'right')
:wikitext(pct(args['votes' .. v], (args['row' .. v] == 'Total') and args['votes' .. v] or args['divisor']))
elseif args['votes' .. v] then
row:tag('td')
:attr('rowspan', args['vspan' .. v])
:css('text-align', 'right')
:wikitext(fmt(args['votes' .. v]))
row:tag('td')
:attr('rowspan', args['vspan' .. v])
:css('text-align', 'right')
:wikitext(pct(args['votes' .. v], valid[1]))
elseif args['avotes' .. v] then
row:tag('td')
:attr('rowspan', args['vspan' .. v])
:css('text-align', 'right')
:css('font-style', 'italic')
:wikitext(fmt(args['avotes' .. v]))
row:tag('td')
:attr('rowspan', args['vspan' .. v])
:css('text-align', 'right')
:css('font-style', 'italic')
:wikitext(pct(args['avotes' .. v], valid[1]))
elseif args['ivotes' .. v] or args ['ipct' .. v] or args['atotal' .. v] then
row:tag('td')
:attr('rowspan', args['vspan' .. v])
:css('text-align', 'right')
:css('font-style', 'italic')
:wikitext(fmt(args['ivotes' .. v]) or fmt(args['atotal' .. v]))
if args['ipct' .. v] or args['apct' .. v] or args['atotal' .. v] then
row:tag('td')
:attr('rowspan', args['vspan' .. v])
:css('text-align', 'right')
:css('font-style', 'italic')
:wikitext(args['ipct' .. v] or args['apct' .. v] or pct(args['atotal' .. v], valid[1]))
else
row:tag('td')
:attr('rowspan', args['vspan' .. v])
:wikitext()
end
elseif has_votes and headings['seats'] and headings['sw'] and not has_votesrow and not has_seatsrow and not args['sw' .. v] and not has_rspan then
row:tag('td')
:attr('colspan', 4)
elseif has_votes and headings['seats'] and not has_votesrow and not has_seatsrow and not has_rspan or has_votes and headings['sw'] and not has_votesrow and not args['sw' .. v] and not has_rspan or has_seats2 and not has_votesrow and not has_seatsrow and not has_rspan then
row:tag('td')
:attr('colspan', 3)
elseif has_votes and not has_votesrow and not has_rspan or has_votes and args['row' .. v] and has_seatsrow and not has_votesrow or has_seats2 and not has_votesrow and not has_rspan then
row:tag('td')
:attr('colspan', 2)
elseif args['r1blockc' .. v] then
row:tag('td')
:attr('rowspan', args['r1blockr' .. v])
:attr('colspan', args['r1blockc' .. v])
:wikitext()
end
if headings['sw'] and has_votesrow then
row
:tag('td')
:css('text-align', 'right')
:wikitext(args['sw' .. v])
end
if headings['seats'] and not args['dsv'] and not has_seats2 and rounds < 2 or has_seats2 and args['seats' .. v] or has_seats2 and args['votes' .. v] or has_seats2 and args['iseats' .. v] or has_seats2 and args['aseats' .. v] then
if args['iseats' .. v] or args['aseats' .. v] then
row
:tag('td')
:css('font-style', 'italic')
:css('text-align', 'right')
:wikitext(args['iseats' .. v] or args['aseats' .. v])
elseif args['seats' .. v] or headings['seats'] and not has_sspan then
row
:tag('td')
:attr('rowspan', args['sspan' .. v])
:css('text-align', 'right')
:wikitext(fmt(args['seats' .. v]) or '–')
end
end
if args['votes' .. v .. '_2'] and args['divisor2'] then
row:tag('td')
:attr('rowspan', args['v2span' .. v])
:css('text-align', 'right')
:wikitext(fmt(args['votes' .. v .. '_2']))
row:tag('td')
:attr('rowspan', args['v2span' .. v])
:css('text-align', 'right')
:wikitext(pct(args['votes' .. v .. '_2'], (args['row' .. v] == 'Total') and args['votes' .. v .. '_2'] or args['divisor2']))
elseif args['votes' .. v .. '_2'] then
row:tag('td')
:attr('rowspan', args['v2span' .. v])
:css('text-align', 'right')
:wikitext(fmt(args['votes' .. v .. '_2']))
row:tag('td')
:attr('rowspan', args['v2span' .. v])
:css('text-align', 'right')
:wikitext(pct(args['votes' .. v .. '_2'], valid[2]))
elseif args['ivotes' .. v .. '_2'] or args ['ipct' .. v.. '_2'] or args['avotes' .. v .. '_2'] then
row:tag('td')
:attr('rowspan', args['v2span' .. v])
:css('text-align', 'right')
:css('font-style', 'italic')
:wikitext(fmt(args['ivotes' .. v .. '_2']) or fmt(args['avotes' .. v .. '_2']))
row:tag('td')
:attr('rowspan', args['v2span' .. v])
:css('text-align', 'right')
:css('font-style', 'italic')
:wikitext(args['ipct' .. v .. '_2'] or args['apct' .. v .. '_2'] or pct(args['avotes' .. v .. '_2'], valid[2]))
elseif has_votes2 and has_seats2 and has_sw2 and not has_votesrow2 and not has_seatsrow2 and not args['sw' .. v .. '_2'] and not has_rspan then
row:tag('td')
:attr('colspan', 4)
elseif has_votes2 and has_seats2 and not has_votesrow2 and not has_seatsrow2 and not has_rspan or has_votes2 and has_sw2 and not has_votesrow2 and not args['sw' .. v .. '_2'] and not has_rspan or has_seats2 and not has_votesrow2 and not has_seatsrow2 and not has_rspan then
row:tag('td')
:attr('colspan', 3)
elseif has_votes2 and not has_votesrow2 and not has_rspan or has_votes2 and args['row' .. v] and has_seatsrow2 and not has_votesrow2 or has_seats2 and not has_votesrow2 and not has_rspan then
row:tag('td')
:attr('colspan', 2)
elseif args['r2blockc' .. v] then
row:tag('td')
:attr('rowspan', args['r2blockr' .. v])
:attr('colspan', args['r2blockc' .. v])
:wikitext()
end
if headings['seats'] and args['dsv'] and not has_sspan or headings['seats'] and rounds > 1 and not has_seats2 and not has_sspan or args['seats' .. v] and has_sspan and rounds > 1 and not has_seats2 then
row
:tag('td')
:attr('rowspan', args['sspan' .. v])
:css('text-align', 'right')
:wikitext(fmt(args['seats' .. v]) or fmt(args['aseats' .. v]) or '–')
end
if has_sw2 and args['votes' .. v .. '_2'] then
row
:tag('td')
:css('text-align', 'right')
:wikitext(args['sw' .. v .. '_2'])
end
if args['seats' .. v .. '_2'] or has_seats2 and args['votes' .. v .. '_2'] then
row
:tag('td')
:css('text-align', 'right')
:wikitext(fmt(args['seats' .. v .. '_2']) or '–')
end
if args['iseats' .. v .. '_2'] or has_seats2 and args['ivotes' .. v .. '_2'] and not args['seats' .. v .. '_2'] or args['aseats' .. v .. '_2'] then
row
:tag('td')
:css('text-align', 'right')
:wikitext(fmt(args['iseats' .. v .. '_2']) or fmt(args['aseats' .. v .. '_2']))
end
if has_seats3 or has_votes3 then
if args['votes' .. v .. '_3'] then
row:tag('td')
:attr('rowspan', args['v3span' .. v])
:css('text-align', 'right')
:wikitext(fmt(args['votes' .. v .. '_3']))
row:tag('td')
:attr('rowspan', args['v3span' .. v])
:css('text-align', 'right')
:wikitext(pct(args['votes' .. v .. '_3'], valid[3]))
elseif args['ivotes' .. v .. '_3'] or args ['ipct' .. v.. '_3'] or args['avotes' .. v .. '_3'] then
row:tag('td')
:attr('rowspan', args['v3span' .. v])
:css('text-align', 'right')
:css('font-style', 'italic')
:wikitext(fmt(args['ivotes' .. v .. '_3']) or fmt(args['avotes' .. v .. '_3']))
row:tag('td')
:attr('rowspan', args['v3span' .. v])
:css('text-align', 'right')
:css('font-style', 'italic')
:wikitext(args['ipct' .. v .. '_3'] or args['apct' .. v .. '_3'] or pct(args['avotes' .. v .. '_3'], valid[3]))
elseif has_seats3 and not has_votesrow3 and not has_seatsrow3 and not has_rspan then
row:tag('td')
:attr('colspan', 3)
elseif has_seats3 and not has_votesrow3 and not has_rspan or has_seats3 and args['row' .. v] and has_seatsrow3 and not has_votesrow3 or has_votes3 and not has_votesrow3 and not has_rspan then
row:tag('td')
:attr('colspan', 2)
elseif args['r3blockc' .. v] then
row:tag('td')
:attr('rowspan', args['r3blockr' .. v])
:attr('colspan', args['r3blockc' .. v])
:wikitext()
end
if has_sw2 and args['votes' .. v .. '_3'] then
row
:tag('td')
:css('text-align', 'right')
:wikitext(args['sw' .. v .. '_3'])
end
if args['seats' .. v .. '_3'] or has_seats3 and args['votes' .. v .. '_3'] then
row
:tag('td')
:css('text-align', 'right')
:wikitext(fmt(args['seats' .. v .. '_3']) or '–')
end
if args['iseats' .. v .. '_3'] or has_seats3 and args['ivotes' .. v .. '_3'] and not args['seats' .. v .. '_3'] or args['aseats' .. v .. '_3'] then
row
:tag('td')
:css('text-align', 'right')
:wikitext(fmt(args['iseats' .. v .. '_3']) or fmt(args['aseats' .. v .. '_3']))
end
end
if args['st1t' .. v] and has_sspan or headings['st1t'] and not has_sspan then
row
:tag('td')
:attr('rowspan', args['sspan' .. v])
:css('text-align', 'right')
:wikitext(args['st1t' .. v] or '–')
end
if args['st2t' .. v] and has_sspan or headings['st2t'] and not has_sspan then
row
:tag('td')
:attr('rowspan', args['sspan' .. v])
:css('text-align', 'right')
:wikitext(args['st2t' .. v] or '–')
end
if args['st3t' .. v] and has_sspan or headings['st3t'] and not has_sspan then
row
:tag('td')
:attr('rowspan', args['sspan' .. v])
:css('text-align', 'right')
:wikitext(args['st3t' .. v] or '–')
end
if args['st4t' .. v] and has_sspan or headings['st4t'] and not has_sspan then
row
:tag('td')
:attr('rowspan', args['sspan' .. v])
:css('text-align', 'right')
:wikitext(args['st4t' .. v] or '–')
end
if args['st5t' .. v] and has_sspan or headings['st5t'] and not has_sspan then
row
:tag('td')
:attr('rowspan', args['sspan' .. v])
:css('text-align', 'right')
:wikitext(args['st5t' .. v] or '–')
end
if args['totseats' .. v] and has_sspan or args['atotseats' .. v] and has_sspan then
row
:tag('td')
:attr('rowspan', args['tsspan' .. v])
:css('text-align', 'right')
:wikitext(args['totseats' .. v] or args['atotseats' .. v] or '–')
end
if headings['totseats'] and not args['itotseats' .. v] and not args['atotseats' .. v] and not has_sspan then
row
:tag('td')
:css('text-align', 'right')
:wikitext(fmt(args['totseats' .. v]) or '–')
elseif headings['totseats'] and not has_sspan then
row
:tag('td')
:css('text-align', 'right')
:css('font-style', 'italic')
:wikitext(args['itotseats' .. v] or args['atotseats' .. v])
end
if headings['sc'] and args.sctitle then
row
:tag('td')
:wikitext(args['sc' .. v])
elseif headings['sc'] then
row
:tag('td')
:css('text-align', 'right')
:wikitext(args['sc' .. v] or '–')
end
end
end
-- separating line
if args['valid'] or args['valid2'] or args['valid3'] or args['invalid'] or args['invalid2'] or args['invalid3'] or args['totalvotes'] or args['totalvotes2'] or args['totalvotes3'] or args['electorate'] or args['electorate2'] or args['electorate3'] or args['turnout'] or args['turnout2'] or args['turnout3'] or args['source'] then
row = root
:tag('tr')
:addClass('sortbottom')
row
:tag('td')
:css('color', 'black')
:css('background', '#eaecf0')
:attr('colspan', cols)
end
-- valid votes
if args['invalid'] or args['invalid2'] or args['invalid3'] then
row = root
:tag('tr')
:addClass('sortbottom')
:css('text-align', 'right')
row
:tag('th')
:wikitext('Valid votes')
:attr('scope', 'row')
:attr('colspan', cs)
:css('text-align', 'left')
:css('font-weight', 'normal')
:css('color', 'inherit')
:css('background', 'inherit')
if args['invalid'] then
row
:tag('td')
:wikitext(fmt(ovalid[1]))
:tag('td')
:wikitext(pct(ovalid[1], ovalid[1] + invalid[1] + blank[1]))
elseif not args['invalid'] then
row
:tag('td')
:wikitext()
:tag('td')
:wikitext()
end
if has_seats2 and not headings['sw'] then
row
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and args['validsw'] then
row
:tag('td')
:wikitext(args['validsw'])
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and not args['validsw'] then
row
:tag('td')
:attr('colspan', 2)
:wikitext()
end
if rounds > 1 and args['invalid2'] then
row
:tag('td')
:wikitext(fmt(ovalid[2]))
:tag('td')
:wikitext(pct(ovalid[2], ovalid[2] + invalid[2] + blank[2]))
elseif rounds > 1 and not args['invalid2'] then
row
:tag('td')
:wikitext()
:tag('td')
:wikitext()
end
if has_seats2 and not headings['sw'] then
row
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and args['validsw2'] then
row
:tag('td')
:wikitext(args['validsw2'])
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and not args['validsw2'] then
row
:tag('td')
:attr('colspan', 2)
:wikitext()
end
if args['invalid3'] then
row
:tag('td')
:wikitext(fmt(ovalid[3]))
:tag('td')
:wikitext(pct(ovalid[3], ovalid[3] + invalid[3] + blank[3]))
elseif has_seats3 and not args['invalid3'] then
row
:tag('td')
:wikitext()
:tag('td')
:wikitext()
end
if args['invalidsw'] and not has_sw2 then
row:tag('td')
:wikitext(args['validsw'])
local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (headings['st1t'] and 1 or 0) + (headings['st2t'] and 1 or 0) + (headings['st3t'] and 1 or 0) + (headings['st4t'] and 1 or 0) + (headings['st5t'] and 1 or 0) + (has_seats3 and 1 or 0)
if headings['seats'] or headings['sc'] then
local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (headings['st1t'] and 1 or 0) + (headings['st2t'] and 1 or 0) + (headings['st3t'] and 1 or 0) + (headings['st4t'] and 1 or 0) + (headings['st5t'] and 1 or 0) + (has_seats3 and 1 or 0)
row
:tag('td')
:attr('colspan', cspan > 1 and cspan or nil)
end
elseif headings['sw'] or headings['seats'] or headings['sc'] or headings['st1t'] or headings['st2t'] or headings['st3t'] or headings['st4t'] or headings['st5t'] then
local cspan = (headings['sw'] and 1 or 0) + (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (headings['st1t'] and 1 or 0) + (headings['st2t'] and 1 or 0) + (headings['st3t'] and 1 or 0) + (headings['st4t'] and 1 or 0) + (headings['st5t'] and 1 or 0) + (has_seats3 and 1 or 0)
row
:tag('td')
:attr('colspan', cspan > 1 and cspan or nil)
end
-- invalid votes
row = root:tag('tr')
:addClass('sortbottom')
:css('text-align', 'right')
if args['invalidonly'] or args['blank'] then
row
:tag('th')
:wikitext('Invalid votes')
:attr('scope', 'row')
:attr('colspan', cs)
:css('text-align', 'left')
:css('font-weight', 'normal')
:css('color', 'inherit')
:css('background', 'inherit')
else
row
:tag('th')
:wikitext('Invalid/blank votes')
:wikitext(args.invalidnote)
:attr('scope', 'row')
:attr('colspan', cs)
:css('text-align', 'left')
:css('font-weight', 'normal')
:css('color', 'inherit')
:css('background', 'inherit')
end
if args['invalid'] then
row
:tag('td')
:wikitext(fmt(invalid[1]))
:tag('td')
:wikitext(pct(invalid[1], ovalid[1] + invalid[1] + blank[1]))
elseif not args['invalid'] then
row
:tag('td')
:wikitext()
:tag('td')
:wikitext()
end
if has_seats2 and not headings['sw'] then
row
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and args['invalidsw'] then
row
:tag('td')
:wikitext(args['invalidsw'])
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and not args['invalidsw'] then
row
:tag('td')
:attr('colspan', 2)
:wikitext()
end
if rounds > 1 and args['invalid2'] then
row
:tag('td')
:wikitext(fmt(invalid[2]))
:tag('td')
:wikitext(pct(invalid[2], ovalid[2] + invalid[2] + blank[2]))
elseif rounds > 1 and not args['invalid2'] then
row
:tag('td')
:wikitext()
:tag('td')
:wikitext()
end
if has_seats2 and not headings['sw'] then
row
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and args['invalidsw2'] then
row
:tag('td')
:wikitext(args['invalidsw2'])
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and not args['invalidsw2'] then
row
:tag('td')
:attr('colspan', 2)
:wikitext()
end
if has_seats3 and args['invalid3'] or has_votes3 and args['invalid3'] then
row
:tag('td')
:wikitext(fmt(invalid[3]))
:tag('td')
:wikitext(pct(invalid[3], ovalid[3] + invalid[3] + blank[3]))
elseif has_seats3 and not args['invalid3'] then
row
:tag('td')
:wikitext()
:tag('td')
:wikitext()
end
if args['invalidsw'] and not has_sw2 then
row:tag('td')
:wikitext(args['invalidsw'])
if headings['seats'] or headings['sc'] or headings['st1t'] or headings['st2t'] or headings['st3t'] or headings['st4t'] or headings['st5t'] then
local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (has_seats3 and 1 or 0)
row
:tag('td')
:attr('colspan', cspan > 1 and cspan or nil)
end
elseif headings['sw'] or headings['seats'] or headings['sc'] or headings['st1t'] or headings['st2t'] or headings['st3t'] or headings['st4t'] or headings['st5t'] then
local cspan = (headings['sw'] and 1 or 0) + (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (headings['st1t'] and 1 or 0) + (headings['st2t'] and 1 or 0) + (headings['st3t'] and 1 or 0) + (headings['st4t'] and 1 or 0) + (headings['st5t'] and 1 or 0) + (has_seats3 and 1 or 0)
row
:tag('td')
:attr('colspan', cspan > 1 and cspan or nil)
end
end
-- blank votes
if args['blank'] then
row = root:tag('tr')
:addClass('sortbottom')
:css('text-align', 'right')
row
:tag('th')
:wikitext('Blank votes')
:attr('scope', 'row')
:attr('colspan', cs)
:css('text-align', 'left')
:css('font-weight', 'normal')
:css('color', 'inherit')
:css('background', 'inherit')
row
:tag('td')
:wikitext(fmt(blank[1]))
:tag('td')
:wikitext(pct(blank[1], ovalid[1] + invalid[1] + blank[1]))
if has_seats2 and not headings['sw'] then
row
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and args['blanksw'] then
row
:tag('td')
:wikitext(args['blanksw'])
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and not args['blanksw'] then
row
:tag('td')
:attr('colspan', 2)
:wikitext()
end
if rounds > 1 and args['blank2'] then
row
:tag('td')
:wikitext(fmt(blank[2]))
:tag('td')
:wikitext(pct(blank[2], ovalid[2] + invalid[2] + blank[2]))
elseif rounds > 1 and not args['blank2'] then
row
:tag('td')
:wikitext()
:tag('td')
:wikitext()
end
if has_seats2 and not headings['sw'] then
row
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and args['blanksw2'] then
row
:tag('td')
:wikitext(args['blanksw2'])
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and not args['blanksw2'] then
row
:tag('td')
:attr('colspan', 2)
:wikitext()
end
if has_seats3 and args['blank3'] or has_votes3 and args['blank3'] then
row
:tag('td')
:wikitext(fmt(blank[3]))
:tag('td')
:wikitext(pct(blank[3], ovalid[3] + invalid[3] + blank[3]))
elseif has_seats3 and args['blank3'] or has_votes3 and args['blank3'] then
row
:tag('td')
:wikitext()
:tag('td')
:wikitext()
end
if args['blanksw'] and not has_sw2 then
row:tag('td')
:wikitext(args['blanksw'])
if headings['seats'] or headings['sc'] or headings['st1t'] or headings['st2t'] or headings['st3t'] or headings['st4t'] or headings['st5t'] then
local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (has_seats3 and 1 or 0)
row
:tag('td')
:attr('colspan', cspan > 1 and cspan or nil)
end
elseif headings['sw'] or headings['seats'] or headings['sc'] or headings['st1t'] or headings['st2t'] or headings['st3t'] or headings['st4t'] or headings['st5t'] then
local cspan = (headings['sw'] and 1 or 0) + (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (headings['st1t'] and 1 or 0) + (headings['st2t'] and 1 or 0) + (headings['st3t'] and 1 or 0) + (headings['st4t'] and 1 or 0) + (headings['st5t'] and 1 or 0) + (has_seats3 and 1 or 0)
row
:tag('td')
:attr('colspan', cspan > 1 and cspan or nil)
end
end
-- total
if args['invalid'] or args['totalvotes'] or args['invalid2'] or args['totalvotes2'] then
row = root:tag('tr')
:addClass('sortbottom')
:css('font-weight', 'bold')
:css('text-align', 'right')
row
:tag('th')
:wikitext(args.tvtitle or 'Total votes')
:attr('scope', 'row')
:attr('colspan', cs)
:css('text-align', 'left')
:css('background', 'inherit')
:css('color', 'inherit')
if not args['totalvotes'] and args['invalid'] then
row
:tag('td')
:wikitext(fmt(ovalid[1] + invalid[1] + blank[1]))
:tag('td')
:wikitext(pct(1, 1))
elseif args['totalvotes'] then
row
:tag('td')
:wikitext(fmt(args.totalvotes))
:tag('td')
:wikitext('–')
elseif not args['invalid'] and not args['totalvotes'] then
row
:tag('td')
:wikitext()
:tag('td')
:wikitext()
end
if has_seats2 and not headings['sw'] then
row
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and args['invalidsw'] then
row
:tag('td')
:wikitext('–')
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and not args['invalidsw'] then
row
:tag('td')
:attr('colspan', 2)
:wikitext()
end
if rounds > 1 and args['invalid2'] and not args['totalvotes2'] then
row
:tag('td')
:wikitext(fmt(ovalid[2] + invalid[2] + blank[2]))
:tag('td')
:wikitext(pct(1, 1))
elseif rounds > 1 and args['totalvotes2'] then
row
:tag('td')
:wikitext(fmt(args.totalvotes2))
:tag('td')
:wikitext('–')
elseif rounds > 1 and not args['invalid2'] or rounds > 1 and not args['totalvotes2'] then
row
:tag('td')
:wikitext()
:tag('td')
:wikitext()
end
if has_seats2 and not headings['sw'] then
row
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and args['invalidsw2'] then
row
:tag('td')
:wikitext('–')
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and not args['invalidsw2'] then
row
:tag('td')
:attr('colspan', 2)
:wikitext()
end
if has_seats3 and not args['totalvotes3'] and args['invalid3'] or has_votes3 and not args['totalvotes3'] and args['invalid3'] then
row
:tag('td')
:wikitext(fmt(ovalid[3] + invalid[3] + blank[3]))
:tag('td')
:wikitext(pct(1, 1))
elseif has_seats3 and args['totalvotes3'] or has_votes3 and args['totalvotes3'] then
row
:tag('td')
:wikitext(fmt(args.totalvotes3))
:tag('td')
:wikitext('–')
elseif has_seats3 and not args['invalid3'] or has_votes3 and not args['invalid3'] then
row
:tag('td')
:wikitext()
:tag('td')
:wikitext()
end
if args['invalidsw'] and not has_sw2 then
row:tag('td')
:wikitext('–')
if headings['seats'] or headings['sc'] or headings['st1t'] or headings['st2t'] or headings['st3t'] or headings['st4t'] or headings['st5t'] then
local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (headings['st1t'] and 1 or 0) + (headings['st2t'] and 1 or 0) + (headings['st3t'] and 1 or 0) + (headings['st4t'] and 1 or 0) + (headings['st5t'] and 1 or 0) + (has_seats3 and 1 or 0)
row
:tag('td')
:attr('colspan', cspan > 1 and cspan or nil)
end
elseif headings['sw'] or headings['seats'] or headings['sc'] or headings['st1t'] or headings['st2t'] or headings['st3t'] or headings['st4t'] or headings['st5t'] then
local cspan = (headings['sw'] and 1 or 0) + (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (headings['st1t'] and 1 or 0) + (headings['st2t'] and 1 or 0) + (headings['st3t'] and 1 or 0) + (headings['st4t'] and 1 or 0) + (headings['st5t'] and 1 or 0) + (has_seats3 and 1 or 0)
row
:tag('td')
:attr('colspan', cspan > 1 and cspan or nil)
end
end
-- registered
if args['electorate'] or args['electorate2'] or args['turnout'] or args['turnout2'] then
row = root:tag('tr')
:addClass('sortbottom')
:css('text-align', 'right')
row
:tag('th')
:wikitext('Registered voters/turnout')
:attr('scope', 'row')
:attr('colspan', cs)
:css('text-align', 'left')
:css('font-weight', 'normal')
:css('color', 'inherit')
:css('background', 'inherit')
row
:tag('td')
:wikitext(fmt(electorate[1]))
if args['invalid'] and args['electorate'] and not args['totalvotes'] then
row
:tag('td')
:wikitext(args.turnout or pct(ovalid[1] + invalid[1] + blank[1], electorate[1]))
elseif args['totalvotes'] and args['electorate'] then
row
:tag('td')
:wikitext(args.turnout or pct(totalvotes[1], electorate[1]))
elseif args['electorate'] then
row
:tag('td')
:wikitext(args.turnout or '–')
else
row
:tag('td')
:wikitext(args.turnout)
end
if has_seats2 and not headings['sw'] then
row
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and args['turnoutsw'] then
row
:tag('td')
:wikitext(args['turnoutsw'])
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and not args['turnoutsw'] then
row
:tag('td')
:attr('colspan', 2)
:wikitext()
end
if rounds > 1 then
row
:tag('td')
:wikitext(fmt(electorate[2]))
if args['invalid2'] and args['electorate2'] then
row
:tag('td')
:wikitext(args.turnout2 or pct(ovalid[2] + invalid[2] + blank[2], electorate[2]))
elseif args['totalvotes2'] and args['electorate2'] then
row
:tag('td')
:wikitext(args.turnout2 or pct(totalvotes[2], electorate[2]))
elseif args['electorate2'] then
row
:tag('td')
:wikitext(args.turnout2 or '–')
else
row
:tag('td')
:wikitext(args.turnout2)
end
if has_seats2 and not headings['sw'] then
row
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and args['turnoutsw2'] then
row
:tag('td')
:wikitext(args['turnoutsw2'])
:tag('td')
:wikitext()
end
if has_seats2 and headings['sw'] and not args['turnoutsw2'] then
row
:tag('td')
:attr('colspan', 2)
:wikitext()
end
end
if has_seats3 or has_votes3 then
row
:tag('td')
:wikitext(fmt(electorate[3]))
if args['invalid3'] and args['electorate3'] then
row
:tag('td')
:wikitext(args.turnout3 or pct(ovalid[3] + invalid[3] + blank[3], electorate[3]))
elseif args['totalvotes3'] and args['electorate3'] then
row
:tag('td')
:wikitext(args.turnout3 or pct(totalvotes[3], electorate[3]))
elseif args['electorate3'] then
row
:tag('td')
:wikitext(args.turnout3 or '–')
else
row
:tag('td')
:wikitext(args.turnout3)
end
end
if args['turnoutsw'] and not has_sw2 then
row:tag('td')
:wikitext(args['turnoutsw'])
if headings['seats'] or headings['sc'] or headings['st1t'] or headings['st2t'] or headings['st3t'] or headings['st4t'] or headings['st5t'] then
local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (headings['st1t'] and 1 or 0) + (headings['st2t'] and 1 or 0) + (headings['st3t'] and 1 or 0) + (headings['st4t'] and 1 or 0) + (headings['st5t'] and 1 or 0) + (has_seats3 and 1 or 0)
row
:tag('td')
:attr('colspan', cspan > 1 and cspan or nil)
end
elseif headings['sw'] or headings['seats'] or headings['sc'] or headings['st1t'] or headings['st2t'] or headings['st3t'] or headings['st4t'] or headings['st5t'] then
local cspan = (headings['sw'] and 1 or 0) + (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0) + (headings['st1t'] and 1 or 0) + (headings['st2t'] and 1 or 0) + (headings['st3t'] and 1 or 0) + (headings['st4t'] and 1 or 0) + (headings['st5t'] and 1 or 0) + (has_seats3 and 1 or 0)
row
:tag('td')
:attr('colspan', cspan > 1 and cspan or nil)
end
end
if args['majority'] then
if args['invalid'] or args['electorate'] then
row = root
:tag('tr')
:addClass('sortbottom')
row
:tag('td')
:css('color', 'black')
:css('background', '#eaecf0')
:attr('colspan', cols)
end
row = root
:tag('tr')
:addClass('sortbottom')
:css('text-align', 'right')
row
:tag('th')
:wikitext('Majority')
:attr('scope', 'row')
:attr('colspan', cs)
:css('text-align', 'left')
:css('font-weight', 'normal')
:css('color', 'inherit')
:css('background', 'inherit')
for k=1, rounds do
row
:tag('td')
:wikitext(fmt(majority[k]))
:tag('td')
:wikitext(fmt(majoritypct[k]))
end
if args['majoritysw'] then
row
:tag('td')
:wikitext(args['majoritysw'])
end
end
if args['result'] then
row = root:tag('tr')
:addClass('sortbottom')
-- determine the color
local color = get_color(args['resultcolour'] or nil, args['result'])
if args['resultsw'] then
row
:tag('td')
:css('background-color', color)
row
:tag('td')
:attr('colspan', 2)
:wikitext(args['result'])
row
:tag('td')
:attr('colspan', 2)
:css('text-align', 'right')
:wikitext('Swing')
row
:tag('td')
:css('text-align', 'right')
:wikitext(args['resultsw'])
else
row
:tag('td')
:css('background-color', color)
row
:tag('td')
:attr('colspan', cols - 1)
:wikitext(args['result'])
end
end
if args['majority2'] then
row = root
:tag('tr')
:addClass('sortbottom')
:css('text-align', 'right')
row
:tag('th')
:wikitext('Majority')
:attr('scope', 'row')
:attr('colspan', cs)
:css('text-align', 'left')
:css('font-weight', 'normal')
:css('color', 'inherit')
:css('background', 'inherit')
for k=1, rounds do
row
:tag('td')
:wikitext(fmt(majority2[k]))
:tag('td')
:wikitext(fmt(majoritypct2[k]))
end
if args['majoritysw2'] then
row
:tag('td')
:wikitext(args['majoritysw2'])
end
end
if args['result2'] then
row = root:tag('tr')
:addClass('sortbottom')
-- determine the color
local color = get_color(args['resultcolour'] or nil, args['result2'])
if args['resultsw2'] then
row
:tag('td')
:css('background-color', color)
row
:tag('td')
:attr('colspan', 2)
:wikitext(args['result2'])
row
:tag('td')
:attr('colspan', 2)
:css('text-align', 'right')
:wikitext('Swing')
row
:tag('td')
:css('text-align', 'right')
:wikitext(args['resultsw2'])
else
row
:tag('td')
:css('background-color', color)
row
:tag('td')
:attr('colspan', cols - 1)
:wikitext(args['result2'])
end
end
if args['source'] then
row = root:tag('tr')
:addClass('sortbottom')
:css('text-align', 'right')
row:tag('td')
:wikitext('Source: ', args.source)
:attr('colspan', cols)
:css('text-align', 'left')
end
if args['embedded'] then
root:wikitext(args['embedded'])
end
return tostring(root) .. tracking
end
return p