-- This module implements [[Template:National squad]] and
-- [[Template:National squad no numbers]] to avoid articles being added to
-- [[:Category:Pages where template include size is exceeded]]
-- when the template is used many times.
local p = {}
local prefixes = {
['male'] = ' men\'s',
['men'] = ' men\'s',
['mens'] = ' men\'s',
['men\'s'] = ' men\'s',
['female'] = ' women\'s',
['women'] = ' women\'s',
['womens'] = ' women\'s',
['women\'s'] = ' women\'s',
[''] = ''
}
-- Recognised sports
local sports = {
['football'] = 'football',
['soccer'] = 'football', -- alias
['futsal'] = 'futsal',
['basketball'] = 'basketball',
['3x3 basketball'] = '3x3 basketball',
['3x3'] = '3x3 basketball', -- alias
['wheelchair basketball'] = 'wheelchair basketball',
['cricket'] = 'cricket',
['esports'] = 'esports',
['field hockey'] = 'field hockey',
['goalball'] = 'goalball',
['golf'] = 'golf',
['handball'] = 'handball',
['pool'] = 'pool',
['rugby'] = 'rugby',
['softball'] = 'softball',
['volleyball'] = 'volleyball',
['water polo'] = 'water polo',
}
function p.main(frame)
local getArgs = require('Module:Arguments').getArgs
local args = getArgs(frame, {parentFirst = true})
local country = args.country or '{{{country}}}'
local coach_label = args.coach_type or 'Coach'
local comp = args.comp or '{{{comp}}}'
local rawsport = args.sport or 'football'
local sport = sports[mw.ustring.lower(rawsport)]
local knownsport = sport ~= nil
if not knownsport then sport = rawsport end
local gender = prefixes[args.gender or ''] or ''
local bg = args.bg
local fg = args.fg
local bordercolor = args.bordercolor
local colortracking = ''
if sport == 'football' then
local colorkey = args.colorvar or args.country
if colorkey and colorkey ~= '' then
local teamcolors
local ok, colordata = pcall(mw.loadData, 'Module:Sports color/international football')
if ok and type(colordata) == 'table' then
local entry = colordata[colorkey]
if type(entry) == 'string' then entry = colordata[entry] end -- resolve alias
if type(entry) == 'table' then teamcolors = entry end
end
if teamcolors then
local function withhash(c) return '#' .. (tostring(c):gsub('^#', '')) end
bg = withhash(teamcolors[1])
fg = withhash(teamcolors[2])
bordercolor = withhash(teamcolors[3])
else
colortracking = '[[Category:Football squad templates using locally-defined colors]]'
end
end
end
local titlestyle = 'background-color:' .. (bg or 'transparent') .. ';'
.. 'color:' .. (fg or 'inherit') .. ';'
.. 'border:1px solid ' .. (bordercolor or '#aaa')
local flagvar = args.flagvar
if flagvar == nil or flagvar == '' then
flagvar = sport
end
local image = args.country ~= 'Unified Team' and require('Module:Flagg').luaMain(frame, {
'cxxl',
args.country or 'none',
flagvar,
size = '50px'
}) or frame:expandTemplate{
title = 'flagicon image',
args = {'Olympic flag.svg', size = '50px'}
}
local ospan = '<span style="color:' .. (fg or 'inherit') .. '">'
local cspan = '</span>'
local teamlink = args['team link']
if teamlink == nil or teamlink == '' then
local cdparams = {}
if gender ~= '' then cdparams.mw = gender end
local data = require('Module:CountryData').gettable(frame, country, cdparams)
local alias = data and data['link alias-' .. sport]
teamlink = (alias and alias ~= '' and alias)
or (country .. gender .. ' national ' .. sport .. ' team')
end
local title = string.format('[[%s|%s%s%s]] – [[%s|%s%s%s]]',
teamlink,
ospan, args.title or country .. ' squad', cspan,
args['comp link'] or comp, ospan, comp, cspan)
local haspos = false
-- Tracking and preview warnings
local knownargs = {['bg']=1, ['fg']=1, ['bordercolor']=1, ['colorvar']=1, ['coach']=1, ['coach_type']=1,
['comp']=1, ['comp link']=1, ['country']=1, ['flagvar']=1, ['gender']=1,
['list']=1, ['name']=1, ['nonumbers'] = 1, ['note']=1, ['sport']=1, ['team link']=1, ['title']=1}
local badargs = {}
local numlist = {}
for k, v in pairs(args) do
if knownargs[k] then
elseif type(k) == 'string' then
local n = tonumber(k:match('^p(%d+)$') or k:match('pos(%d+)') or '-1')
if k:match('^p%d+$') and n >= 0 and n <= 99 then
table.insert(numlist, k:match('^p(%d+)$'))
elseif args.nonumbers and (k:match('^pos%d+$') and n >= 0 and n <= 99) then
if v and v ~= '' then haspos = true end
elseif v and v ~= '' then
table.insert(badargs, k)
end
elseif v and v ~= '' then
table.insert(badargs, k)
end
end
table.sort(
numlist,
function (a, b)
return tonumber(a) < tonumber(b) or (tonumber(a) == tonumber(b) and #a > #b)
end
)
local pv = require('Module:If preview')
local preview, tracking, paramtracking = '', '', ''
tracking = tracking .. colortracking
if #badargs > 0 then
for k, v in pairs(badargs) do
if v == '' then v = ' ' end
v = mw.ustring.gsub(v, '[^%w\\-_ ]', '?')
preview = preview .. pv._warning({
'Page using national squad with unknown parameter "' .. v .. '".'
})
paramtracking = paramtracking .. '[[Category:Pages using national squad with unknown parameters|' .. v .. ']]'
end
end
if (args['title'] == nil and args['team link'] == nil and args.country == nil) or args.comp == nil then
paramtracking = paramtracking .. '[[Category:Pages using national squad with unknown parameters|!]]'
end
if not args['comp link'] then
tracking = tracking .. '[[Category:Pages using national squad without comp link]]'
end
if not args['sport'] then
if not args['team link'] then
tracking = tracking .. '[[Category:Pages using national squad without sport or team link]]'
end
end
if not knownsport then
if not args['team link'] then
local sortkey = mw.ustring.gsub(sport, '[^A-Za-z]', ' ')
tracking = tracking .. '[[Category:Pages using national squad without team link and with an atypical sport|' .. sortkey .. ' ]]'
end
end
if prefixes[args.gender or ''] == nil then
tracking = tracking .. '[[Category:Pages using national squad with unsupported gender]]'
end
if args.name == nil then
tracking = tracking .. '[[Category:Pages using national squad without name]]'
end
local ns = mw.title.getCurrentTitle().namespace
if ns ~= 10 then tracking = '' end
if ns ~= 0 and ns ~= 10 then paramtracking = '' end
local list1 = args.list or ''
if list1 == '' then
for i,k in ipairs(numlist) do
if args['p' .. k] then
local n = args.nonumbers and (args['pos' .. k] or '') or tostring(k)
if n ~= '' or haspos == true then
list1 = list1 .. string.format(
'*%s <span class="vcard agent"><span class="fn">%s</span></span>\n',
n, args['p' .. k])
else
list1 = list1 .. string.format(
'*<span class="vcard agent"><span class="fn">%s</span></span>\n', args['p' .. k])
end
end
end
if args.coach then
list1 = list1 .. string.format(
'*<span class="vcard agent">%s: <span class="fn">%s</span></span>',
coach_label, args.coach)
end
end
local list3 = args.note and ('' .. args.note .. '') or nil
return require('Module:Navbox')._navbox({
name = args.name,
titlestyle = titlestyle,
listclass = 'hlist', bodyclass = 'vcard', titleclass = 'fn org',
image = image, title = title, list1 = list1, list3 = list3
}) .. tracking .. paramtracking .. preview
end
return p