require('Module:No globals')
local getArgs = require('Module:Arguments').getArgs
local p = {}
function p.createTable(frame, args)
if not args then
args = getArgs(frame)
end
local root = mw.html.create()
local host = args['host']
local hostColor = '#ccccff'
local defaultRowColor = '#f8f9fa'
local flagTemplate = args['flag_template']
local event = args['event']
local totalGold = 0
local totalSilver = 0
local totalBronze = 0
root = root
:tag('table')
:addClass('wikitable')
:addClass('sortable')
:addClass('plainrowheaders')
:addClass('jquery-tablesorter')
:css('text-align', 'center')
root:tag('caption')
:wikitext(args['caption'])
-- add the header row
root:tag('tr')
:tag('th')
:wikitext('Rank')
:tag('th')
:wikitext('Nation')
:tag('th')
:addClass('headerSort')
:css('width', '6em')
:css('background-color', 'gold')
:wikitext('Gold')
:tag('th')
:addClass('headerSort')
:css('width', '6em')
:css('background-color', 'silver')
:wikitext('Silver')
:tag('th')
:addClass('headerSort')
:css('width', '6em')
:css('background-color', '#c96')
:wikitext('Bronze')
:tag('th')
:css('width', '6em')
:wikitext('Total')
-- enumerate the rows
local rowNums = {}
for k,v in pairs(args) do
k = ''..k
local num = k:match('^nation(%d+)$')
if num then
local total = tonumber(args['total' .. num]) or (
(tonumber(args['gold' .. num]) or 0) +
(tonumber(args['silver' .. num]) or 0) +
(tonumber(args['bronze' .. num]) or 0))
table.insert(rowNums, {total, num})
end
end
table.sort(rowNums, function (a, b) return a[1] > b[1] end)
local lasttotal, lastspan, lastrankcell = -1, 1, nil
for i, anum in ipairs(rowNums) do
local num = anum[2]
local nation = args['nation' .. num]
local gold = args['gold' .. num]
local silver = args['silver' .. num]
local bronze = args['bronze' .. num]
local isHost = args['host' .. num]
-- this is mainly for the parameter names example so you can override it.
local total = args['total' .. num] or gold + silver + bronze
local color
if isHost then color = hostColor else color = defaultRowColor end
if args['grand_total'] then else
totalGold = totalGold + gold
totalSilver = totalSilver + silver
totalBronze = totalBronze + bronze
end
local row = root:tag('tr'):css('background-color', color)
if (flagTemplate and event) then
nation = mw.getCurrentFrame():expandTemplate({title = flagTemplate, args = { nation, event } })
end
if total == lasttotal then
lastspan = lastspan + 1
lastrankcell:attr('rowspan',lastspan)
else
lastspan = 1
lastrankcell = row:tag('td'):wikitext(i)
lasttotal = total
end
row:tag('td')
:css('text-align','left')
:wikitext(nation)
:tag('td')
:wikitext(gold)
:tag('td')
:wikitext(silver)
:tag('td')
:wikitext(bronze)
:tag('td')
:wikitext(total)
end
root:tag('tr')
:addClass('sortbottom')
:tag('th')
:wikitext('Totals')
:attr('colspan',2)
:tag('th')
:wikitext(args['total_gold'] or totalGold)
:tag('th')
:wikitext(args['total_silver'] or totalSilver)
:tag('th')
:wikitext(args['total_bronze'] or totalBronze)
:tag('th')
:wikitext(args['grand_total'] or totalGold+totalSilver+totalBronze)
if host then
root
:tag('p')
:wikitext(host)
:tag('span')
:css('background-color', hostColor)
:css('text-align', 'center')
:css('padding', '2px')
:css('margin', '2px')
:css('border', '1px solid darkgray')
:css('float', 'left')
:css('height', '1em')
:wikitext(' ')
end
return tostring(root)
end
return p