local p =
local function addNumbers (label,data) maxcols = math.max (maxcols,#data) table.insert (array,data) table.insert (labels,label)end
local function addRow (label,data) data = mw.text.split(data,",") for i = 1,#data do data [i] = tonumber (data [i]) end addNumbers (label,data)end
local function appendLine (line) result = result .. line .. "\n"end
local function buildReferences (r) r.ref1 = r.ref or r.ref1 r.ref_name1 = r.ref_name or r.ref_name1 local s = "" local i = 1 while true do local ref = r ["ref" .. i] local ref_name = r ["ref_name" .. i] -- an actual reference and/or a reference name may be provided if not (ref or ref_name) then return s end s = s .. "[1] " i = i + 1 endend
function p.table (frame) labels = -- first column array = -- matrix of numeric data maxcols = 0 -- maximum number of columns -- iterate over the numbered arguments with country data, e.g. ITA:113,92,94,95,95 for i,parameter in ipairs (frame.args) do local parts = mw.text.split (parameter,":") addRow (frame:expandTemplate,parts [#parts]); -- ITA yields, flag:Peru:state yields Peru end local last = #array addRow ("valid ballots",frame.args.valid) if frame.args.invalid and string.match(frame.args.invalid,"[^0,]") then addRow ("invalid ballots",frame.args.invalid) -- add invalid ballots if they’re specified and not all zero end addRow ("abstentions",frame.args.abstentions) -- compute vote count and required majority from counts of ballots and abstensions local voting = local required = for i=1,maxcols do local votes = array [last + 1] [i] - array [#array] [i] -- valid ballots minus abstentions table.insert (voting,votes) table.insert (required,math.ceil (votes * 2 / 3)) end
addNumbers ("present and voting",voting) addNumbers ("required majority",required)
result = "" appendLine ("
-") appendLine ("! colspan=\"" .. (maxcols + 1) .. "\" | " .. frame.args.group .. " election results" .. (frame.args.day and (" – day " .. frame.args.day) or "") .. frame:preprocess (buildReferences (frame.args))) appendLine (" | -") appendLine ("! Member") local round = frame.args.round or 1 for i=0,maxcols - 1 do appendLine (" | style=\"background:silver;\" | Round " .. (i + round) .. "") end for j,label in ipairs (labels) do result = result .. " | -\n | style=\"text-align:left;\" | " .. label local isCountry = j <= last for i=1,maxcols do local value = array [j] [i] local bold = isCountry and value and value >= array [#array] [i] and "" or "" -- bold vote count if it’s at least the required majority result = result .. " | " .. bold .. ((not isCountry or (value and value ~= 0)) and value or "—") .. bold -- missing or zero vote counts are replaced by em dashes end result = result .. "\n" end result = result .. " |
return resultend
return p