Модуль:Country by code
Материал из вики «Вече»
Дополнительные действия
Для документации этого модуля может быть создана страница Модуль: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