יחידה:Election results – הבדלי גרסאות
תוכן שנמחק תוכן שנוסף
typo |
Copy over from sandbox |
||
שורה 292: | שורה 292: | ||
end |
end |
||
end |
end |
||
-- separating line |
|||
row = root |
row = root |
||
:tag('tr') |
:tag('tr') |
||
:addClass('sortbottom') |
:addClass('sortbottom') |
||
row |
|||
:tag('td') |
|||
:css('background', '#eaecf0') |
:css('background', '#eaecf0') |
||
:attr('colspan', cols) |
|||
-- valid votes |
|||
row = root |
|||
:tag('tr') |
|||
:addClass('sortbottom') |
|||
:css('text-align', 'right') |
:css('text-align', 'right') |
||
row |
row |
||
שורה 305: | שורה 312: | ||
:css('text-align', 'left') |
:css('text-align', 'left') |
||
:css('font-weight', 'normal') |
:css('font-weight', 'normal') |
||
⚫ | |||
for k=1,rounds do |
for k=1,rounds do |
||
row |
row |
||
שורה 318: | שורה 326: | ||
:attr('colspan', cspan > 1 and cspan or nil) |
:attr('colspan', cspan > 1 and cspan or nil) |
||
end |
end |
||
-- invalid votes |
|||
row = root:tag('tr') |
row = root:tag('tr') |
||
:addClass('sortbottom') |
:addClass('sortbottom') |
||
⚫ | |||
:css('text-align', 'right') |
:css('text-align', 'right') |
||
row |
row |
||
שורה 330: | שורה 337: | ||
:css('text-align', 'left') |
:css('text-align', 'left') |
||
:css('font-weight', 'normal') |
:css('font-weight', 'normal') |
||
⚫ | |||
for k=1,rounds do |
for k=1,rounds do |
||
row |
row |
||
שורה 343: | שורה 351: | ||
:attr('colspan', cspan > 1 and cspan or nil) |
:attr('colspan', cspan > 1 and cspan or nil) |
||
end |
end |
||
-- total |
|||
row = root:tag('tr') |
row = root:tag('tr') |
||
:addClass('sortbottom') |
:addClass('sortbottom') |
||
:css('font-weight', 'bold') |
:css('font-weight', 'bold') |
||
⚫ | |||
:css('text-align', 'right') |
:css('text-align', 'right') |
||
row |
row |
||
שורה 355: | שורה 362: | ||
:attr('colspan', cs) |
:attr('colspan', cs) |
||
:css('text-align', 'left') |
:css('text-align', 'left') |
||
⚫ | |||
for k=1,rounds do |
for k=1,rounds do |
||
row |
row |
||
שורה 367: | שורה 375: | ||
:tag('td') |
:tag('td') |
||
:attr('colspan', cspan > 1 and cspan or nil) |
:attr('colspan', cspan > 1 and cspan or nil) |
||
end |
|||
-- registered |
|||
row = root:tag('tr') |
row = root:tag('tr') |
||
:addClass('sortbottom') |
:addClass('sortbottom') |
||
⚫ | |||
:css('text-align', 'right') |
:css('text-align', 'right') |
||
row |
row |
||
שורה 379: | שורה 387: | ||
:css('text-align', 'left') |
:css('text-align', 'left') |
||
:css('font-weight', 'normal') |
:css('font-weight', 'normal') |
||
⚫ | |||
for k=1,rounds do |
for k=1,rounds do |
||
row:tag('td') |
row:tag('td') |
||
שורה 394: | שורה 403: | ||
row = root:tag('tr') |
row = root:tag('tr') |
||
:addClass('sortbottom') |
:addClass('sortbottom') |
||
⚫ | |||
:css('text-align', 'right') |
:css('text-align', 'right') |
||
row:tag('td') |
row:tag('td') |
גרסה מ־17:17, 31 באוגוסט 2020
- השימוש ביחידה נעשה בעזרת תבנית:תוצאות בחירות - ראו שם לתיעוד נוסף.
- ליצירת צבע קבוע למפלגה ניתן ליצור תבנית מהצורה תבנית:שם המפלגה/meta/color
require('Module:No globals')
local p = {}
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame)
local index, headings = {}, {}
local cols, rounds = 0, 1
local winner, winner_votes = {0, 0}, {0, 0}
local valid = {0, 0}
local invalid = {tonumber(args.invalid) or 0, tonumber(args.invalid2) or 0}
local electorate = {tonumber(args.electorate) or 0, tonumber(args.electorate2) or tonumber(args.electorate) or 0}
local seats, seatdiff = 0, 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
-- preprocess the input
local stop_flag = false
local i = 0
while stop_flag == false do
stop_flag = true
for kk = 1, 20 do
i = i + 1
for k, key in ipairs({'cand', 'vp', 'party', 'sc', 'seats'}) 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] then
table.insert(index, i)
if args['votes' .. i] then
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'] then
rounds = 2
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['seats' .. i] then
seats = seats + (tonumber(args['seats' .. i]) or 0)
end
if args['sc' .. i] then
seatdiff = seatdiff + tonumdash(args['sc' .. i])
end
end
end
end
-- optional against all
if args['against_all'] or args['against_all2'] then
max_rows = max_rows + 1
local i = max_rows
table.insert(index, i)
args['votes' .. i] = tonumber(args['against_all']) or 0
args['votes' .. i .. '_2'] = tonumber(args['against_all_2']) or 0
args['colour' .. i] = 'inherit'
args['color' .. i] = 'inherit'
args['row' .. i] = 'Against all'
valid[1] = valid[1] + args['votes' .. i]
valid[2] = valid[2] + args['votes' .. i .. '_2']
tracking = tracking .. '[[Category:Pages using election results with against all]]'
end
local ovalid = {valid[1], valid[2]}
seats = ((args['total_seats'] or '') == 'TOTAL' and seats) or args['total_seats'] or seats
seatdiff = (args['total_sc'] or '') == 'TOTAL' and seatdiff or args['total_sc']
if seats or seatdiff or args['valid'] or ((rounds > 1) and args['valid2']) then
max_rows = max_rows + 1
local i = max_rows
table.insert(index,i)
args['votes' .. i] = valid[1]
args['votes' .. i .. '_2'] = valid[2]
args['colour' .. i] = 'inherit'
args['color' .. i] = 'inherit'
args['row' .. i] = 'Total'
args['seats' .. i] = seats
args['sc' .. i] = seatdiff
args['font-weight' .. i] = 'bold'
ovalid[1] = tonumber(args['valid']) or valid[1]
ovalid[2] = tonumber(args['valid2']) or valid[2]
end
-- build the table
local root = mw.html.create('table')
root
:addClass('wikitable sortable')
:tag('caption')
:wikitext(args.caption)
local topcell = nil
if args['image'] then
topcell = root
:tag('tr')
:tag('td')
:wikitext(args['image'])
:css('text-align', 'center')
end
local rowspan = (rounds > 1) and 2 or nil
row = root:tag('tr')
if headings['cand'] then
row
:tag('th')
:wikitext('Candidate')
:attr('scope', 'col')
:attr('colspan', 2)
:attr('rowspan', rowspan)
cols = cols + 2
if headings['vp'] then
row
:tag('th')
:wikitext('Running mate')
:attr('scope', 'col')
:attr('rowspan', rowspan)
cols = cols + 1
end
if headings['party'] then
row
:tag('th')
:wikitext('Party')
:attr('scope', 'col')
:attr('rowspan', rowspan)
cols = cols + 1
end
else
row
:tag('th')
:wikitext(headings['party'] and 'Party' or '')
:attr('scope', 'col')
:attr('colspan', 2)
:attr('rowspan', rowspan)
cols = cols + 2
end
if rounds > 1 then
row
:tag('th')
:wikitext('First round')
:attr('scope', 'col')
:attr('colspan', 2)
:tag('th')
:wikitext('Second round')
:attr('scope', 'col')
:attr('colspan', 2)
secondrow = root:tag('tr')
else
secondrow = row
end
for k=1,rounds do
secondrow
:tag('th')
:wikitext('Votes')
:attr('scope', 'col')
:tag('th')
:wikitext('%')
:attr('scope', 'col')
cols = cols + 2
end
if headings['seats'] then
row
:tag('th')
:wikitext('Seats')
:attr('scope', 'col')
:attr('rowspan', rowspan)
cols = cols + 1
end
if headings['sc'] then
row
:tag('th')
:wikitext(headings['seats'] and '+/–' or 'Seats±')
:attr('scope', 'col')
:attr('rowspan', rowspan)
cols = cols + 1
end
if topcell then
topcell:attr('colspan', cols)
end
local cs = cols - 2*rounds
- (headings['seats'] and 1 or 0)
- (headings['sc'] and 1 or 0)
local rsuff = (rounds > 1) and {'', '_2'} or {''}
for i, v in ipairs(index) do
row = root:tag('tr'):css('font-weight', args['font-weight' .. v])
-- determine the color
local color = args['colour' .. v] or args['color' .. v] or nil
if color == nil then
local party = unlink(args['party' .. v]) or ''
if party ~= '' and mw.title.new('Template:' .. party .. '/meta/color').exists then
color = frame:expandTemplate{title = party .. '/meta/color'}
end
end
if args['row' .. v] then
row
:tag('td')
:wikitext(args['row' .. v])
:attr('colspan', cs)
else
-- create the empty color cell
row
:tag('td')
:css('background-color', color)
-- add the rest of the row
if headings['cand'] then
row
:tag('td')
:wikitext(args['cand' .. v])
if headings['vp'] then
row
:tag('td')
:wikitext(args['vp' .. v])
end
end
if headings['party'] then
row
:tag('td')
:wikitext(args['party' .. v])
end
end
for kk, suf in ipairs(rsuff) do
if(args['votes' .. v .. suf]) then
row:tag('td')
:css('text-align', 'right')
:wikitext(fmt(args['votes' .. v .. suf]))
row:tag('td')
:css('text-align', 'right')
:wikitext(pct(args['votes' .. v .. suf], valid[kk]))
else
row:tag('td'):attr('colspan', 2)
end
end
if headings['seats'] then
row
:tag('td')
:css('text-align', 'right')
:wikitext(fmt(args['seats' .. v]))
end
if headings['sc'] then
row
:tag('td')
:css('text-align', 'right')
:wikitext(args['sc' .. v])
end
end
-- separating line
row = root
:tag('tr')
:addClass('sortbottom')
row
:tag('td')
:css('background', '#eaecf0')
:attr('colspan', cols)
-- valid votes
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('background', 'inherit')
for k=1,rounds do
row
:tag('td')
:wikitext(fmt(ovalid[k]))
:tag('td')
:wikitext(pct(ovalid[k], ovalid[k] + invalid[k]))
end
if headings['seats'] or headings['sc'] then
local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] 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')
row
:tag('th')
:wikitext('Invalid votes')
:attr('scope', 'row')
:attr('colspan', cs)
:css('text-align', 'left')
:css('font-weight', 'normal')
:css('background', 'inherit')
for k=1,rounds do
row
:tag('td')
:wikitext(fmt(invalid[k]))
:tag('td')
:wikitext(pct(invalid[k], ovalid[k] + invalid[k]))
end
if headings['seats'] or headings['sc'] then
local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0)
row
:tag('td')
:attr('colspan', cspan > 1 and cspan or nil)
end
-- total
row = root:tag('tr')
:addClass('sortbottom')
:css('font-weight', 'bold')
:css('text-align', 'right')
row
:tag('th')
:wikitext('Total votes')
:attr('scope', 'row')
:attr('colspan', cs)
:css('text-align', 'left')
:css('background', 'inherit')
for k=1,rounds do
row
:tag('td')
:wikitext(fmt(ovalid[k] + invalid[k]))
:tag('td')
:wikitext(pct(1,1))
end
if headings['seats'] or headings['sc'] then
local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0)
row
:tag('td')
:attr('colspan', cspan > 1 and cspan or nil)
end
-- registered
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('background', 'inherit')
for k=1,rounds do
row:tag('td')
:wikitext(fmt(electorate[k]))
row:tag('td')
:wikitext(pct(ovalid[k] + invalid[k], electorate[k]))
end
if headings['seats'] or headings['sc'] then
local cspan = (headings['seats'] and 1 or 0) + (headings['sc'] and 1 or 0)
row
:tag('td')
:attr('colspan', cspan > 1 and cspan or nil)
end
row = root:tag('tr')
:addClass('sortbottom')
:css('text-align', 'right')
row:tag('td')
:wikitext('Source: ', args.source)
:attr('colspan', cols)
:css('text-align', 'left')
return tostring(root) .. tracking
end
return p