Mô đun:Medals table/sandbox

require('strict')
local getArgs = require('Module:Arguments').getArgs

local p = {}

local function deflag(s)
s = mw.ustring.gsub(s or , '%[%[[Ff][Ii][Ll][Ee]:[^%[%]]%]%]', )
s = mw.ustring.gsub(s, '%[%[[Ii][Mm][Aa][Gg][Ee]:[^%[%]]%]%]', )
s = mw.ustring.gsub(s, ']>', )
s = mw.ustring.gsub(s, '%s%([A-Z][A-Z][A-Z]%)%s$', )
while s:match('^%s&[Nn][Bb][Ss][Pp];%s') do
s = mw.ustring.gsub(s, '^%s&[Nn][Bb][Ss][Pp];%s', )
end
s = mw.ustring.gsub(s, '%s&[Nn][Bb][Ss][Pp];%s$', )
s = mw.ustring.gsub(s, '%s%s+', ' ')
s = mw.ustring.gsub(s, '^%s(.-?)%s$', '%1')
return s
end

function p.createTable(frame, args)
if not args then
args = getArgs(frame)
end

local team = args['team'] or 'Nation'
local root = mw.html.create()
local host = args['host'] or
local hostColor = 'ccccff'
local defaultRowColor = 'f8f9fa'
local flagTemplate = args['flag_template'] or 'flagteam'
local event = args['event']
local legendpos = (args['legend_position'] or 't'):lower()
local header, footer = ,
local totalGold = 0
local totalSilver = 0
local totalBronze = 0

local remainingGold = 0
local remainingSilver = 0
local remainingBronze = 0
local remainingStart = 0
local remainingEnd = 0
local limitReached = false
local showLimit = tonumber(args['show_limit'])

-- build the legend
if host ~= then
if args['name_' .. host] then
host = args['name_' .. host]
host = 'Host nation (' .. deflag(host) .. ')'
elseif host:match('^([A-Z][A-Z][A-Z])') then
host = frame:expandTemplate{title = flagTemplate, args = {host, event} }
host = 'Host nation (' .. deflag(host) .. ')'
end
host = host .. (args['host_note'] or )
host = frame:expandTemplate{title = 'color box', args = {hostColor, '&nbsp;&nbsp;', 'border=darkgray'}} ..'&nbsp;'.. host
end

local leading =
if args['leading'] then
leading = frame:expandTemplate{title = 'legend', args = {'E9D66B', "Leading in that sport"}}
end

if legendpos == 't' then
header = header .. host .. leading
else
footer = footer .. host .. leading
end

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
local row = root:tag('tr')

if args['hide_rank'] then else
row:tag('th')
:attr('scope', 'col')
:wikitext('Rank')
end
row
:tag('th')
:attr('scope', 'col')
:wikitext(team)
:tag('th')
:attr('scope', 'col')
:addClass('headerSort')
:css('width', '4em')
:css('background-color', 'gold')
:wikitext('Gold')
:tag('th')
:attr('scope', 'col')
:addClass('headerSort')
:css('width', '4em')
:css('background-color', 'silver')
:wikitext('Silver')
:tag('th')
:attr('scope', 'col')
:addClass('headerSort')
:css('width', '4em')
:css('background-color', 'c96')
:wikitext('Bronze')
:tag('th')
:attr('scope', 'col')
:css('width', '4em')
:wikitext('Total')

-- enumerate the rows
local rowNums = {}
local IOCs = {}
for k,v in pairs(args) do
k = ..k
local IOC = k:match('^gold_([A-Z][A-Z][A-Z])$') or k:match('^gold_(%d+)$')
or k:match('^silver_([A-Z][A-Z][A-Z])$') or k:match('^silver_(%d+)$')
or k:match('^bronze_([A-Z][A-Z][A-Z])$') or k:match('^bronze_(%d+)$')
if IOC and IOCs[IOC] == nil then
IOCs[IOC] = 1
local gold = (tonumber(args['gold_' .. IOC]) or 0)
local silver = (tonumber(args['silver_' .. IOC]) or 0)
local bronze = (tonumber(args['bronze_' .. IOC]) or 0)
local noskip = args['skip_' .. IOC] and 0 or 1
local nation = args['name_' .. IOC] or
frame:expandTemplate{title = flagTemplate, args = {IOC, event} }
nation = deflag(nation)
if nation:match('%[%[[^%[%]%|]%|([^%[%]])%]%]') then
nation = nation:match('%[%[[^%[%]%|]%|([^%[%]])%]%]')
end
if nation:match('%[%[([^%[%]%|])%]%]') then
nation = nation:match('%[%[([^%[%]%|])%]%]')
end
table.insert(rowNums, {gold, silver, bronze, noskip, nation, IOC})
end
end
if args['team'] 'Games' then
table.sort(rowNums, function (a,b)
return a[5] b[1] or (a[1] b[1] and a[2] > b[2])
or (a[1] b[1] and a[2] b[2] and a[3] > b[3])
or (a[1] b[1] and a[2] b[2] and a[3] b[3] and a[4] > b[4])
or (a[1] b[1] and a[2] b[2] and a[3] b[3] and a[4] b[4] and a[5] showLimit) then
if remainingStart 0 then remainingStart = rank end
limitReached = true
remainingGold = remainingGold + gold
remainingSilver = remainingSilver + silver
remainingBronze = remainingBronze + bronze
else
local row
if args['leading_' .. IOC] then
row = root:tag('tr'):css('background-color', 'E9D66B')
color = 'E9D66B'
else
row = root:tag('tr')
end

--Don't put the color on the row because of ranks spanning multiple rows.
--:css('background-color', color)

if args['hide_rank'] then else
if (gold lastGold) and (silver lastSilver) and (bronze == lastBronze) then
lastspan = lastspan + 1
lastrankcell:attr('rowspan',lastspan)
else
lastspan = 1
if args['skip_' .. IOC] then
lastrankcell = row:tag('td'):wikitext(frame:expandTemplate{title = 'sort', args = {'999', '–'}})
else
lastrankcell = row:tag('td'):wikitext(rank)
lastGold = gold
lastSilver = silver
lastBronze = bronze
end
end
end
row:tag('th')
:attr('scope', 'row')
:css('background-color', color)
:css('text-align','left')
:wikitext(nation)
:tag('td')
:wikitext(gold)
:tag('td')
:wikitext(silver)
:tag('td')
:wikitext(bronze)
:tag('td')
:wikitext(total)
end
remainingEnd = rank
end

if limitReached then
root:tag('tr')
:tag('td')
:wikitext(remainingStart..'–'..remainingEnd)
:tag('td')
:css('font-style', 'italic')
:css('text-align','left')
:wikitext(args['remaining_link'] or args['remaining_text'] or 'Remaining')
:tag('td')
:wikitext(remainingGold)
:tag('td')
:wikitext(remainingSilver)
:tag('td')
:wikitext(remainingBronze)
:tag('td')
:wikitext(remainingGold+remainingSilver+remainingBronze)
end

if team:match('^[A-Z][A-Z][A-Z]$') or team:match('>[A-Z][A-Z][A-Z]'
end
footer = frame:expandTemplate{ title = 'refbegin' } .. footer

if args['source'] then
footer = footer .. 'Source: ' .. args['source']
end
if args['notes'] then
if args['source'] then
footer = footer ..
end
footer = footer .. 'Notes: ' .. args['notes']
end
footer = footer .. frame:expandTemplate{ title = 'refend' }
end

return header .. tostring(root) .. footer
end

return p