Module:Canadian federal election results

require('strict')

local p = {}

local templatestyles = 'Module:Canadian federal election results/styles.css'

local tracking, preview

local rows = {}

local rowcount = 0

local function checkarg(k,v)

if not k or type(k) ~= 'string' then return end

if k:find('^party[1-9]%d*[a-e]$') then

-- valid and not tracked

if k:find('^party[1-9]%d*a$') then

local n = mw.ustring.gsub(k, '^party([1-9]%d*)[a-e]', '%1')

table.insert(rows, tonumber(n))

rowcount = rowcount + 1

end

elseif k == 'title' or k:find('^year[1-9]%d*$') or k:find('^seats[1-9]%d*[a-e]') then

-- valid and not tracked

else

-- invalid

local vlen = mw.ustring.len(k)

k = mw.ustring.sub(k, 1, (vlen < 25) and vlen or 25)

k = mw.ustring.gsub(k, '[^%w\-_ ]', '?')

table.insert(tracking, '' .. k .. '')

table.insert(preview, '"' .. k .. '"')

end

end

local function makecell(frame, p, s)

local res = ''

for i = 1,#p do

if p[i] ~= '' then

local c = frame:expandTemplate{

title = 'Canadian party colour',

args = {'CA', p[i]}

}

res = res .. frame:expandTemplate{

title = 'composition histogram',

args = {c, s[i], title = p[i]}

}

end

end

return res

end

function p.main(frame)

local args = require('Module:Arguments').getArgs(frame)

tracking, preview = {}, {}

for k, v in pairs(args) do

if v ~= '' then

checkarg(k,v)

end

end

table.sort(rows)

local root = mw.html.create('table')

:addClass('ca-fed-elect-results wikitable floatright')

root:tag('caption'):wikitext(args['title'] or 'Electoral history')

local row = root:tag('tr')

row:tag('th'):attr('scope','col'):wikitext('Year')

row:tag('th'):attr('scope','col'):wikitext('Results')

for j = 1, rowcount do

local k = rows[j]

if args['party' .. k .. 'a'] then

row = root:tag('tr')

row:tag('th'):attr('scope', 'row'):wikitext(args['year' .. k] or '?')

row:tag('td'):wikitext(makecell(frame,

{args['party' .. k .. 'a'] or '',

args['party' .. k .. 'b'] or '',

args['party' .. k .. 'c'] or '',

args['party' .. k .. 'd'] or '',

args['party' .. k .. 'e'] or ''},

{args['seats' .. k .. 'a'] or '0',

args['seats' .. k .. 'b'] or '0',

args['seats' .. k .. 'c'] or '0',

args['seats' .. k .. 'd'] or '0',

args['seats' .. k .. 'e'] or '0'}))

end

end

local trackstr = (#tracking > 0) and table.concat(tracking, ) or

if #preview > 0 then

trackstr = require('Module:If preview')._warning({

'Unknown parameters: ' .. table.concat(preview, '; ')

})

end

return frame:extensionTag{

name = 'templatestyles', args = { src = templatestyles}

} .. tostring(root) .. trackstr

end

return p