Module:Country alias

-- This module returns the country name or the flag name for a country,

-- based on the three-letter IOC/CGA/FINA alias.

--[[

The following country code is used for multiple countries:

ANG (workaround: added ANG_CGF for use with Commonwealth Games)

The following names have different names/flags based on sport/year

Great Britain (and N.I.) GBR, GBR_WCA (latter added to add text in parens)

Hong Kong HKG, HKG_CGF (latter added to keep colonial flag)

Individual Olympic Athletes IOA, IOA_2000 (IOA changed to Independent Olympic Athletes in 2012)

Russian Athletes OAR (2018), ROC_2020 (2020 Summer, 2022 Winter)

SWZ Swaziland became Eswatini after the 2018 Commonwealth Games

MKD Macedonia became North Macedonia in 2019

ART No "Athlete" before Refugee Team @ 2017 AIMAG

D.R. of the Congo Was Zaire (ZAI) and Congo-Kinshasa (COK_COD)

The following countries have multiple aliases due to CGF/IOC/FINA/IAAF/etc differences, or deprecated uses

Anguilla AIA, ANG_CGF

Antigua and Barbuda ANT, ATG

Bahrain BHN, BHR, BRN

Curaçao CUR, CUW

East Timor TLS, TMP

Falkand Islands FAI, FLK

Faroe Islands FAR, FRO

Guernsey GGY, GUE

Iran IRI, IRN

Ireland IRE, IRL - IRE is *only* for CGF apps

Jersey JER, JEY

Lebanon LBN, LIB

Montserrat MNT, MSR

Nicaragua NCA, NIC

Norfolk Island NFI, NFK

Oman OMA, OMN

Refugee Olympic Team ROA, ROT, EOR

Romania ROM, ROU

Saint Helena SHE, SHN

Saint Vincent and the Grenadines SVG, VIN

Sarawak SAR, SWK

Singapore SGP, SIN

South Africa RSA, SAF

Tonga TGA, TON

Trinidad and Tobago TRI, TTO

Turks and Caicos Islands TCA, TCI, TKS

Oddity that needs to be revisited

French Polynesia PYF, TAH - TAH has been converted to Tahiti per SILENCE

]]

local function stripToNil(text)

-- If text is a string, return its trimmed content, or nil if empty.

-- Otherwise return text (which may, for example, be nil).

if type(text) == 'string' then

text = text:match('(%S.-)%s*$')

end

return text

end

local function yes(parameter)

-- Return true if parameter should be interpreted as "yes".

return ({ y = true, yes = true, on = true, [true] = true })[parameter]

end

local function getAlias(args)

-- Return alias parameter, possibly modified for exceptional cases.

local alias = stripToNil(args.alias)

local games = stripToNil(args.games)

local year = tonumber(args.year)

local fullName = stripToNil(args.fullName)

if fullName then

year = tonumber(fullName:match('^%d+')) -- ignore args.year

end

if alias == 'ANG' then

if games == 'Commonwealth Games' then

alias = 'ANG_CGF'

end

elseif alias == 'ART' then

if games == 'Asian Indoor and Martial Arts Games' then

alias = 'ART_AIMAG'

end

elseif alias == 'GBR' then

if games == 'World Championships in Athletics' or games == 'World Athletics Championships' or games == 'European Athletics Championships' then

alias = 'GBR_WCA'

elseif games == 'European Championships' then

if year == 2018 then

alias = 'GBR_WCA'

end

end

elseif alias == 'HKG' then

if games == 'Commonwealth Games' then

alias = 'HKG_CGF'

end

elseif alias == 'IOA' then

if year == 2000 then

alias = 'IOA_2000'

end

elseif alias == 'MAL' or alias == 'MAS' then

if year and year < 1963 then

alias = 'MAL'

else

alias = 'MAS'

end

elseif alias == 'SWZ' then

if fullName then

if year and year >= 2018 and fullName ~= '2018 Commonwealth Games' then

alias = 'SWZ_YO2018'

end

elseif year and year >= 2018 and games ~= 'Commonwealth Games' then

alias = 'SWZ_YO2018'

else

alias = 'SWZ_YO2018'

end

elseif alias == 'MKD' then

if year and year < 2019 then

alias = 'MKD'

else

alias = 'MKD_2019'

end

elseif alias == 'VNM' then

if year and year <= 1954 then

alias = 'VIE'

end

elseif alias == 'RUS' then

if year and year==2020 then

if games=='Summer Olympics' then

alias = 'ROC_2020'

elseif games=='Summer Paralympics' then

alias = 'RPC'

end

elseif year and year==2022 and games=='Winter Olympics' then

alias = 'ROC_2020'

end

elseif alias == 'ROC' then

if year and year==1960 and games=='Summer Olympics' then

alias = 'ROC_Formosa'

elseif year and ( year==1964 or year==1968 ) and games=='Summer Olympics' then

alias = 'ROC_Taiwan'

elseif year and year==2020 and games=='Summer Olympics' then

alias = 'ROC_2020'

elseif year and year==2022 and games=='Winter Olympics' then

alias = 'ROC_2020'

elseif year and year==2020 and games=='Summer Paralympics' then

alias = 'RPC'

else

local pageName = mw.title.getCurrentTitle().text

if pageName == 'Russian Olympic Committee athletes at the Olympics' then

alias = 'ROC_2020'

end

end

elseif alias == 'YUG' or alias == 'SCG' then

if year and year > 1992 and year < 2004 and games ~= 'Summer Paralympics' then

alias = 'FR_YUG'

end

elseif alias == 'ZAI' or alias == 'COD' then

if year and year < 1971 then

alias = 'COK_COD'

elseif year and year <= 1996 then

alias = 'ZAI'

else

alias = 'COD'

end

elseif alias == 'COK' then

if year and year == 1968 then

alias = 'COK_COD'

else

alias = 'COK'

end

end

return alias

end

local function getFlag(args, country)

-- Return name of flag selected from country data (nil if none defined).

local year = tonumber(args.year)

local games = stripToNil(args.games)

if games then

local gdata = country[games]

if gdata then

if type(gdata) == 'string' then

return gdata

end

if gdata[year] then

return gdata[year]

end

if type(gdata[1]) == 'string' then

return gdata[1]

end

end

end

for _, item in ipairs(country) do

if type(item) == 'string' then

return item

end

if year and year <= item[1] then

return item[2]

end

end

end

local data = mw.loadData('Module:Country alias/data')

local function countryAlias(args)

local alias = getAlias(args)

local country = data.countries[alias] or data.countries[data.countryAliases[alias]]

local function quit(message)

return args.error or error(message)

end

if not country then

return quit('Invalid country alias: ' .. tostring(alias))

end

if yes(args.flag) then

return getFlag(args, country) or quit('No flag defined for ' .. alias)

else

return country.name or quit('No name defined for ' .. alias)

end

end

local function flagIOC(frame)

-- Implement {{flagIOC}} which previously called this module three times.

-- Returns , with the third value optional

local args = frame:getParent().args

local code = stripToNil(args[1]) or error('flagIOC parameter 1 should be a country code')

local games = stripToNil(args[2])

local athletes = stripToNil(args[3])

games = games and (games .. ' Olympics') or 'Olympics'

local parms = {

alias = code,

fullName = games,

year = games:match('^%d+'),

games = games:gsub('^%d+ ?', ''),

}

local fullName = countryAlias(parms)

parms.flag = true

local dispName = fullName

if fullName == 'ROC' then

fullName = 'Russian Olympic Committee athletes'

end

return (('File:{flag} {dispName}{athletes}')

:gsub('{(%w+)}', {

athletes = athletes and

(' (' .. athletes .. ')') or

'',

flag = countryAlias(parms),

games = games,

name = fullName,

dispName = dispName,

}))

end

local function flagXYZ(frame)

-- Implement {{flagIOC2}} and its variants which previously called this module three times.

-- Returns one of four possible outputs:

-- from flagIOC2: , with the third value optional

-- from flagIOC2team:

-- from flagIOC2athlete:

-- from flagIOC2medalist:

local args = frame:getParent().args

local dispType = stripToNil(frame.args['type'])

local code=''

local games=''

local athletes=''

if dispType == 'athlete-O' then

-- Implement Template:FlagIOCathlete.

dispType = 'athlete'

args[3] = (args[3] or '') .. ' Olympics'

end

if dispType == 'name' or dispType == 'team' then

code = stripToNil(args[1]) or error('Parameter 1 should be a country code')

games = stripToNil(args[2]) or ''

athletes = stripToNil(args[3])

elseif dispType == 'athlete' or dispType == 'medalist' then

athletes = stripToNil(args[1]) or error('Parameter 1 should be the name(s) of the athlete(s)')

code = stripToNil(args[2]) or error('Parameter 2 should be a country code')

games = stripToNil(args[3]) or ''

end

local parms = {

alias = code,

fullName = games,

year = games:match('^%d+'),

games = games:gsub('^%d+ ?', ''),

}

local fullName = countryAlias(parms)

parms.flag = true

local dispName = stripToNil(args.name)

if fullName == 'ROC' then

fullName = 'Russian Olympic Committee athletes'

dispName = 'ROC'

if dispType == 'team' then dispType = 'name' end

end

local link = '{dispName}'

if (games == '') then

link = (dispType == 'athlete') and '{dispName}' or '{dispName}'

end

if dispType == 'name' then

return (('File:{flag} '..link..'{athletes}')

:gsub('{(%w+)}', {

athletes = athletes and

(' (' .. athletes .. ')') or

'',

flag = countryAlias(parms),

games = games,

name = fullName,

dispName = dispName or fullName,

}))

elseif dispType == 'team' then

return (('File:{flag} '..link..'{alias}')

:gsub('{(%w+)}', {

alias = (' (' .. code .. ')'),

flag = countryAlias(parms),

games = games,

name = fullName,

dispName = dispName or fullName,

}))

elseif dispType == 'athlete' then

return (('File:{flag} {athletes} ('..link..')')

:gsub('{(%w+)}', {

athletes = athletes,

flag = countryAlias(parms),

games = games,

name = fullName,

dispName = code,

}))

elseif dispType == 'medalist' then

return (('{athletes}
File:{flag} '..link..'')

:gsub('{(%w+)}', {

athletes = athletes,

flag = countryAlias(parms),

games = games,

name = fullName,

dispName = dispName or fullName,

}))

end

end

local function main(frame)

return countryAlias(frame.args)

end

return {

flagIOC = flagIOC,

flagXYZ = flagXYZ,

main = main,

}