Перейти к содержимому страницы
Открыть меню
Переключить меню настроек
Открыть персональное меню
Вы не представились системе
Ваш IP-адрес будет виден всем, если вы внесёте какие-либо изменения.

Модуль:Country by code

Материал из вики «Вече»
Версия от 03:25, 30 сентября 2026; wp>ru.wikipedia (Импорт из русской Википедии, версия 155353727)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)

Для документации этого модуля может быть создана страница Модуль:Country by code/doc

-- Преобразует название страны, код ФИФА/МОК/ISO α-3 (и α-2) или национальный
-- домен верхнего уровня (без точки) в общепринятое название страны
-- в именительном или родительном падеже.
-- Данные лежат в [[Модуль:Country by code/data]] и загружаются через mw.loadData,
-- поэтому при многократных вызовах на одной странице таблица не копируется
-- и не строится заново.
-- Отслеживаемые ключи (английские названия и  устаревшие коды) разрешаются как обычно,
-- но страницы основного пространства имён, где такой ключ встретился, попадают в категорию отслеживания.

local p = {}

local data = mw.loadData('Модуль:Country by code/data')
local countries     = data.countries      -- [id] = { им, род }
local aliases       = data.aliases        -- [точный ключ] = id
local aliasesLower  = data.aliases_lower  -- [ключ в нижнем регистре] = id
local tracked       = data.tracked        -- [точный ключ] = true
local trackedLower  = data.tracked_lower  -- [ключ в нижнем регистре] = true

-- Категория отслеживания: страница категории создаётся отдельно; значение nil отключает слежение.
local TRACKING_CATEGORY = 'Википедия:Страницы с английским названием или устаревшим кодом страны'

local ulower = mw.ustring.lower
local trim   = mw.text.trim

-- Индекс падежа в записи страны. Всё неизвестное трактуем как именительный.
local CASE_INDEX = {
	['р']   = 2, -- родительный
	['r']   = 2, -- на случай латинской буквы в параметре
	['gen'] = 2,
}

-- Ищет запись страны по коду или названию.
-- Возвращает запись (или nil) и признак «ключ отслеживаемый» (true/false).
-- Порядок поиска:
-- 1) точное совпадение с ключом (регистр важен: «LTU» и «lt» — разные ключи);
-- 2) запасной поиск в нижнем регистре («rus» найдёт «RUS»).
local function findEntry(key)
	key = trim(key)
	if key == '' then
		return nil, false
	end
	local id = aliases[key]
	if id then
		return countries[id], tracked[key] == true
	end
	local lkey = ulower(key)
	id = aliasesLower[lkey]
	if id then
		return countries[id], trackedLower[lkey] == true
	end
	return nil, false
end

-- Возвращает три значения: результат, статус ('ok', 'unknown' или 'empty')
-- и признак «ключ отслеживаемый». Если код не найден, результат — введённая строка.
function p._lookup(code, case)
	code = trim(code or '')
	if code == '' then
		return '', 'empty', false
	end
	local entry, isTracked = findEntry(code)
	if not entry then
		return code, 'unknown', false
	end
	local idx = CASE_INDEX[ulower(trim(case or ''))] or 1
	return entry[idx] or entry[1], 'ok', isTracked
end

-- Основная функция для вызова из других модулей.
-- code — название страны, код ФИФА/МОК/ISO или домен;
-- case — 'и' (по умолчанию) или 'р';
-- Если страна не найдена, возвращается исходная строка.
function p._name(code, case)
	return (p._lookup(code, case))
end

-- Проверка существования, чтобы другие модули могли отличить
-- «нет в базе» от «название совпало с кодом».
function p._exists(code)
	return findEntry(code or '') ~= nil
end

-- true, если ключ разрешается, но относится к отслеживаемым
-- (английское название или устаревший код).
function p._tracked(code)
	local entry, isTracked = findEntry(code or '')
	return entry ~= nil and isTracked
end

-- Аргументы: если код передан прямо в #invoke, используется он (так удобно тестировать),
-- иначе используются параметры из вызова шаблона (родительский фрейм).
local function getArgs(frame)
	local args = frame.args
	if (args[1] == nil or trim(args[1]) == '') then
		local parent = frame:getParent()
		if parent then
			args = parent.args
		end
	end
	return args
end

-- {{#invoke:Country by code|main|<код>|<падеж>}}
-- Обычно используется через шаблон {{СтранаПоКоду|<код>|<падеж>}}.
function p.main(frame)
	local args = getArgs(frame)
	local name, status, isTracked = p._lookup(args[1], args[2])
	if isTracked and TRACKING_CATEGORY
		and mw.title.getCurrentTitle().namespace == 0 then
		name = name .. '[[Категория:' .. TRACKING_CATEGORY .. ']]'
	end
	return name
end

-- {{#invoke:Country by code|exists|<код>}} → 1 или пустая строка
-- (удобно для #if вместо проверки существования подстраницы).
function p.exists(frame)
	local args = getArgs(frame)
	return p._exists(args[1]) and '1' or ''
end

return p