require('strict')local getArgs = require('Module:Arguments').getArgslocal flagg = require('Module:Flagg').luaMain
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 send
local function ifexists(arg) return ((arg or ) ~= ) and arg or falseend
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 host1 = args['host1'] or local host2 = args['host2'] or local hostColor = '#ccccff' local defaultRowColor = 'inherit' local flagTemplate = ifexists(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']) local lang = mw.getContentLanguage
local function getFlag(code) if (flagTemplate
'flagcountry') then local alias = ifexists(event) or '23px' local fout = flagg(frame,) if (flagTemplate
-- build the legend if host2 ~= and host1 ~= then if args['name_' .. host1] then host1 = args['name_' .. host1] elseif host1:match('^([A-Z][A-Z][A-Z])') then host1 = getFlag(host1) end if args['name_' .. host2] then host2 = args['name_' .. host2] elseif host2:match('^([A-Z][A-Z][A-Z])') then host2 = getFlag(host2) end host = 'Host nations (' .. deflag(host1) .. ', ' .. deflag(host2) .. ')' host = frame:expandTemplate ..' '.. host elseif host ~= then if args['name_' .. host] then host = args['name_' .. host] elseif host:match('^([A-Z][A-Z][A-Z])') then host = getFlag(host) end host = 'Host nation (' .. deflag(host) .. ')' host = host .. (args['host_note'] or ) host = frame:expandTemplate ..' '.. host end local leading = if args['leading'] then leading = frame:expandTemplate end if legendpos
root:tag('caption') :wikitext(args['caption']) -- add the header row local row = root:tag('tr') if not args['hide_rank'] then row:tag('th') :attr('scope', 'col') :css('color', 'inherit') :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') :css('color', '#333') :wikitext('Gold') :tag('th') :attr('scope', 'col') :addClass('headerSort') :css('width', '4em') :css('background-color', 'silver') :css('color', '#333') :wikitext('Silver') :tag('th') :attr('scope', 'col') :addClass('headerSort') :css('width', '4em') :css('background-color', '#c96') :css('color', '#333') :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]
'Games' then table.sort(rowNums, function (a,b) return a[5] < b[5] end ) else table.sort(rowNums, function (a, b) return a[1] > b[1] or (a[1]
b[1] and a[2]
b[1] and a[2]
b[3] and a[4] > b[4]) or (a[1]
b[2] and a[3]
b[4] and a[5] < b[5]) end ) end local lastGold, lastSilver, lastBronze = -1 local rank = 0 local lastspan, lastrankcell = 1, nil for i, anum in ipairs(rowNums) do local IOC = anum[6] if args['skip_' .. IOC] then lastGold, lastSilver, lastBronze, lastspan = -1, -1, -1, 1 else rank = rank + 1 end local nation = args['name_' .. IOC] or getFlag(IOC) 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 isHost = args['host_' .. IOC] -- this is mainly for the parameter names example so you can override it. local total = args['total_' .. IOC] or gold + silver + bronze local color = isHost and hostColor or defaultRowColor
if not args['grand_total'] then totalGold = totalGold + gold totalSilver = totalSilver + silver totalBronze = totalBronze + bronze end
if args['host_' .. IOC] then nation = nation .. '*' end
if args['note_' .. IOC] then nation = nation .. args['note_' .. IOC] end
if showLimit and (rank>showLimit) then if remainingStart
lastGold) and (silver
lastBronze) then lastspan = lastspan + 1 lastrankcell:attr('rowspan',lastspan) else lastspan = 1 if args['skip_' .. IOC] then lastrankcell = row:tag('td'):wikitext(frame:expandTemplate) 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('color', 'inherit') :css('text-align','left') :wikitext(nation) :tag('td') :wikitext(lang:formatNum(gold)) :tag('td') :wikitext(lang:formatNum(silver)) :tag('td') :wikitext(lang:formatNum(bronze)) :tag('td') :wikitext(lang:formatNum(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(lang:formatNum(remainingGold)) :tag('td') :wikitext(lang:formatNum(remainingSilver)) :tag('td') :wikitext(lang:formatNum(remainingBronze)) :tag('td') :wikitext(lang:formatNum(remainingGold + remainingSilver + remainingBronze)) end
if not (team:match('^[A-Z][A-Z][A-Z]$') or team:match('>[A-Z][A-Z][A-Z]<')) then team = team:lower end if team:match('^games$') then team = 'game' end local colspan if args['hide_rank'] then colspan = 1 else colspan = 2 end if not args['hide_totals'] then root:tag('tr') :addClass('sortbottom') :tag('th') :wikitext('Totals ('..remainingEnd..' entries)') :attr('scope', 'row') :css('font-weight', 'bold') :attr('colspan', colspan) :tag('th') :wikitext(lang:formatNum(args['total_gold'] or totalGold)) :css('font-weight', 'bold') :tag('th') :wikitext(lang:formatNum(args['total_silver'] or totalSilver)) :css('font-weight', 'bold') :tag('th') :wikitext(lang:formatNum(args['total_bronze'] or totalBronze)) :css('font-weight', 'bold') :tag('th') :wikitext(lang:formatNum(args['grand_total'] or totalGold + totalSilver + totalBronze)) :css('font-weight', 'bold') end
-- Build the rest of the footer if args['source'] or args['notes'] then if footer ~= then footer = footer .. '
' end footer = frame:expandTemplate .. 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 end
return header .. sticky .. tostring(root) .. footerend
return p