Module:Country alias

From NationStates Sports Wiki
Revision as of 23:39, 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 countries have different names/flags based on sport/year
    ARI								Ariddia became Ariddian Isles from 2nd Summer to 4th Summer Olympics, then Ariddia from 5th cycle onwards
    QUE								The Royal Kingdom of Quebec became Quebec and Shingoryeo from 15th Summer Olympics
    LEN								Liverpool England became Liventia from 4th Summer Olympics
    COM								Commerce Heights became Capitalizt SLANI from 2nd Winter
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 organizational differences/carelessness, 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 == 'LEN' then
		if year and year >3 then
			alias = 'LEN'
			else
				alias = 'LEN_YO1'
		end
	elseif alias == 'ARI' then
			if year and year==2 and games=='2nd Summer' then
				alias = 'ARI_YO2'
			elseif year <= 3 and year >= 5 then
				alias = 'ARI_YO2'
			end
	elseif alias == 'QUE' then
		if year and year ==15 then
			if games == '15th Winter' then
				alias = 'QUE_RKQ'
		elseif year and year <= 15 then
			alias = 'QUE_RKQ'
		else
			alias = 'QUE'
		end
	end
	elseif alias == 'COM' then
		if year and year <= 1 then
			alias = 'COM_CH'
		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,
}