Module:Medals table: Difference between revisions
Appearance
Content deleted Content added
Tags: Mobile edit Mobile web edit Advanced mobile edit |
Reduce WP:PEIS by using Module:Flagg instead of Template:Flagteam, improve display of certain country flags by using 23px variant |
||
Line 1: | Line 1: | ||
require('strict') |
require('strict') |
||
local getArgs = require('Module:Arguments').getArgs |
local getArgs = require('Module:Arguments').getArgs |
||
local flagg = require('Module:Flagg').luaMain |
|||
local p = {} |
local p = {} |
||
Line 16: | Line 17: | ||
s = mw.ustring.gsub(s, '^%s*(.-?)%s*$', '%1') |
s = mw.ustring.gsub(s, '^%s*(.-?)%s*$', '%1') |
||
return s |
return s |
||
end |
|||
local function ifexists(arg) |
|||
return ((arg or '') ~= '') and arg or false |
|||
end |
end |
||
Line 30: | Line 35: | ||
local hostColor = '#ccccff' |
local hostColor = '#ccccff' |
||
local defaultRowColor = '#ffffff' |
local defaultRowColor = '#ffffff' |
||
local flagTemplate = args['flag_template'] or 'flagteam' |
local flagTemplate = ifexists(args['flag_template']) or 'flagteam' |
||
local event = args['event'] |
local event = args['event'] |
||
local legendpos = (args['legend_position'] or 't'):lower() |
local legendpos = (args['legend_position'] or 't'):lower() |
||
Line 45: | Line 50: | ||
local limitReached = false |
local limitReached = false |
||
local showLimit = tonumber(args['show_limit']) |
local showLimit = tonumber(args['show_limit']) |
||
local function getFlag(code) |
|||
if (flagTemplate == 'flagteam') then |
|||
local alias = ifexists(event) or '23px' |
|||
local fout = flagg(frame,{'usce', code, mw.ustring.match(alias, "[12]%d%d%d") or alias}) |
|||
return fout..' <span style="font-size:90%;">('..code..')</span>' |
|||
end |
|||
⚫ | |||
end |
|||
-- build the legend |
-- build the legend |
||
Line 51: | Line 65: | ||
host1 = args['name_' .. host1] |
host1 = args['name_' .. host1] |
||
elseif host1:match('^([A-Z][A-Z][A-Z])') then |
elseif host1:match('^([A-Z][A-Z][A-Z])') then |
||
host1 = |
host1 = getFlag(host1) |
||
end |
end |
||
if args['name_' .. host2] then |
if args['name_' .. host2] then |
||
host2 = args['name_' .. host2] |
host2 = args['name_' .. host2] |
||
elseif host2:match('^([A-Z][A-Z][A-Z])') then |
elseif host2:match('^([A-Z][A-Z][A-Z])') then |
||
host2 = |
host2 = getFlag(host2) |
||
end |
end |
||
host = 'Host nations (' .. deflag(host1) .. ', ' .. deflag(host2) .. ')' |
host = 'Host nations (' .. deflag(host1) .. ', ' .. deflag(host2) .. ')' |
||
Line 64: | Line 78: | ||
host = args['name_' .. host] |
host = args['name_' .. host] |
||
elseif host:match('^([A-Z][A-Z][A-Z])') then |
elseif host:match('^([A-Z][A-Z][A-Z])') then |
||
host = getFlag(host) |
|||
⚫ | |||
end |
end |
||
host = 'Host nation (' .. deflag(host) .. ')' |
host = 'Host nation (' .. deflag(host) .. ')' |
||
Line 148: | Line 162: | ||
local bronze = (tonumber(args['bronze_' .. IOC]) or 0) |
local bronze = (tonumber(args['bronze_' .. IOC]) or 0) |
||
local noskip = args['skip_' .. IOC] and 0 or 1 |
local noskip = args['skip_' .. IOC] and 0 or 1 |
||
local nation = args['name_' .. IOC] or |
local nation = args['name_' .. IOC] or getFlag(IOC) |
||
frame:expandTemplate{title = flagTemplate, args = {IOC, event} } |
|||
nation = deflag(nation) |
nation = deflag(nation) |
||
if nation:match('%[%[[^%[%]%|]*%|([^%[%]]*)%]%]') then |
if nation:match('%[%[[^%[%]%|]*%|([^%[%]]*)%]%]') then |
||
Line 185: | Line 198: | ||
rank = rank + 1 |
rank = rank + 1 |
||
end |
end |
||
local nation = args['name_' .. IOC] or |
local nation = args['name_' .. IOC] or getFlag(IOC) |
||
frame:expandTemplate{title = flagTemplate, args = {IOC, event} } |
|||
local gold = tonumber(args['gold_' .. IOC]) or 0 |
local gold = tonumber(args['gold_' .. IOC]) or 0 |
||
local silver = tonumber(args['silver_' .. IOC]) or 0 |
local silver = tonumber(args['silver_' .. IOC]) or 0 |
Revision as of 18:26, 18 April 2024
![]() | This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
![]() | This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
![]() | This Lua module is used on approximately 16,000 pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them. |
Usage
require('strict')
local getArgs = require('Module:Arguments').getArgs
local 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 s
end
local function ifexists(arg)
return ((arg or '') ~= '') and arg or false
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 host1 = args['host1'] or ''
local host2 = args['host2'] or ''
local hostColor = '#ccccff'
local defaultRowColor = '#ffffff'
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 function getFlag(code)
if (flagTemplate == 'flagteam') then
local alias = ifexists(event) or '23px'
local fout = flagg(frame,{'usce', code, mw.ustring.match(alias, "[12]%d%d%d") or alias})
return fout..' <span style="font-size:90%;">('..code..')</span>'
end
return frame:expandTemplate{title = flagTemplate, args = {code, event} }
end
-- 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{title = 'color box', args = {hostColor, ' * ', 'border=darkgray'}} ..' '.. 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{title = 'color box', args = {hostColor, ' * ', 'border=darkgray'}} ..' '.. 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('notheme')
:addClass('plainrowheaders')
:addClass('jquery-tablesorter')
:css('text-align', 'center')
:css('background-color', 'white')
:css('color', 'black')
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('background-color', 'white')
:css('color', 'inherit')
:wikitext('Rank')
end
row
:tag('th')
:attr('scope', 'col')
:css('background-color', 'white')
:css('color', 'inherit')
: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 getFlag(IOC)
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[5]
end
)
else
table.sort(rowNums, function (a, b)
return a[1] > 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] < 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 == 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 not args['hide_rank'] then
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 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')
:css('background-color', '#eaebef')
:addClass('sortbottom')
:tag('th')
:wikitext('Totals ('..remainingEnd..' entries)')
:attr('scope', 'row')
:css('background-color', '#eaebef')
:css('font-weight', 'bold')
:attr('colspan', colspan)
:tag('td')
:wikitext(args['total_gold'] or totalGold)
:css('font-weight', 'bold')
:tag('td')
:wikitext(args['total_silver'] or totalSilver)
:css('font-weight', 'bold')
:tag('td')
:wikitext(args['total_bronze'] or totalBronze)
:css('font-weight', 'bold')
:tag('td')
:wikitext(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 .. '<br>'
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 .. '<br>'
end
footer = footer .. 'Notes: ' .. args['notes']
end
footer = footer .. frame:expandTemplate{ title = 'refend' }
end
return header .. tostring(root) .. footer
end
return p