Module:Country alias

From NationStates Sports Wiki
Revision as of 20:03, 6 October 2024 by Kelssek (talk | contribs)
Jump to navigation Jump to search

Documentation for this module may be created at Module:Country alias/doc

-- 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
    ARI								Ariddia became Ariddian Isles for 2nd-4th Olympics, then Ariddia from 5th cycle onwards
    QUE								The Royal Kingdom of Quebec became Quebec and Shingoryeo
    LEN								Liverpool England, Liventia after
Real examples:
    SWZ                              Swaziland became Eswatini after the 2018 Commonwealth Games
    MKD								 Macedonia became North Macedonia in 2019

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


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 == 'ARI' then
		if fullName then
			if year and year >= 2 and year <=5 and fullName ~= '2nd Summer' then
				alias = 'ARI_YO2'
			end
		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 <flag> <country link> <athletes>, 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}|22x20px|border|alt=|link=]]&nbsp;[[{name} at the {games}|{dispName}]]{athletes}')
		:gsub('{(%w+)}', {
			athletes = athletes and
				('&nbsp;<span style="font-size:90%;">(' .. athletes .. ')</span>') 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:			<flag> <country link> <athletes>, with the third value optional
	--	from flagIOC2team:		<flag> <country link> <country alias>
	--	from flagIOC2athlete:	<flag> <athlete(s)> <country alias/link>
	--	from flagIOC2medalist:	<athlete(s)><br><flag> <country link>
	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 = '[[{name} at the {games}|{dispName}]]'
	if (games == '') then
		link = (dispType == 'athlete') and '<abbr title="{name}">{dispName}</abbr>' or '[[{name}|{dispName}]]'
	end
	if dispType == 'name' then
		return (('[[File:{flag}|22x20px|border|alt=|link=]]&nbsp;'..link..'{athletes}')
			:gsub('{(%w+)}', {
				athletes = athletes and
					('&nbsp;<span style="font-size:90%;">(' .. athletes .. ')</span>') or
					'',
				flag = countryAlias(parms),
				games = games,
				name = fullName,
				dispName = dispName or fullName,
			}))
	elseif dispType == 'team' then
		return (('[[File:{flag}|22x20px|border|alt=|link=]]&nbsp;'..link..'{alias}')
			:gsub('{(%w+)}', {
				alias = ('&nbsp;<span style="font-size:90%;">(' .. code .. ')</span>'),
				flag = countryAlias(parms),
				games = games,
				name = fullName,
				dispName = dispName or fullName,
			}))
	elseif dispType == 'athlete' then
		return (('[[File:{flag}|22x20px|border|alt=|link=]]&nbsp;{athletes}&nbsp;<span style="font-size:90%;">('..link..')</span>')
			:gsub('{(%w+)}', {
				athletes = athletes,
				flag = countryAlias(parms),
				games = games,
				name = fullName,
				dispName = code,
			}))
	elseif dispType == 'medalist' then
		return (('{athletes}<br>[[File:{flag}|23x15px|border|alt=|link=]]&nbsp;'..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,
}