Дополнительные действия
Для документации этого модуля может быть создана страница Модуль:Версия модификации/doc
local p = {}
--[=[
Получает CSS-класс(ы) code, в который помещается номер версии модификации. Эти
классы нужны для различного оформления номеров версий из веток с разной
стабильностью (релизная / стабильная, бета-версия, альфа-версия).
Параметры:
• branch_type: тип ветки (см. документацию к модулю
[[Модуль:Версия модификации/Данные]]). Ветки без типов или с неизвестным
тмпом считаются стабильными.
Возвращает строку, содержащую соответствующие классы.
]=]
local function get_version_class(branch_type)
local classes = {
stable = "modversion modversion-stable",
beta = "modversion modversion-beta",
alpha = "modversion modversion-alpha",
unmaintained = "modversion modversion-unmaintained"
}
return classes[branch_type] or classes.stable
end
--[=[
Получает текст всплывающей подсказки для номера версии в зависимости от типа
ветки.
Параметры:
• branch_type: тип ветки (см. документацию к модулю
[[Модуль:Версия модификации/Данные]]). Ветки без типов или с неизвестным
тмпом считаются стабильными.
Возвращает строку, содержащую текст всплывающей подсказки.
]=]
local function get_tooltip(branch_type)
local tooltips = {
stable = "Стабильная версия",
beta = "Бета-версия",
alpha = "Альфа-версия",
unmaintained = "Неподдерживаемая версия"
}
return tooltips[branch_type] or tooltips.stable
end
--[=[
Сравнивает два номера версий, соответствующих одному и тому же формату: оба
номера версий должны состоять из последовательностей чисел одинаковой длины, в
которых числа разделены точками.
Поведение функции не определено при использовании любого другого формата.
Параметры:
• ver1 (строка): номер первой версии;
• ver2 (строка): номер второй версии.
Возвращает булево значение, равное `true`, если и только если ver1 больше ver2.
]=]
local function compare_version(ver1, ver2)
local parts1 = mw.text.split(ver1, '%.')
local parts2 = mw.text.split(ver2, '%.')
for i, part in ipairs(parts1) do
local part1_number = tonumber(part)
local part2_number = tonumber(parts2[i])
if part1_number > part2_number then
return true
elseif part1_number < part2_number then
return false
end
end
return false
end
--[=[
Форматирует один номер версии согласно приведённому типу ветки.
Параметры:
• version (строка): номер версии
• branch_type (строка): тип ветки
Возвращает строку с готовым вики-текстом.
]=]
local function format_single_version(version, branch_type)
local ver_class = get_version_class(branch_type)
local tooltip = get_tooltip(branch_type)
return '<code class="explain tooltip ' .. ver_class .. '" title="' .. tooltip .. '">' .. version .. '</code>'
end
--[=[
Функция, форматирующая номера версий какой-либо модификации.
Параметры:
• mod_struct: структура с данными о соответствующей модификации (см.
документацию модуля [[Модуль:Версия модификации/Данные]]).
Возвращает строку с готовым вики-текстом.
]=]
local function format_ver(mod_struct)
local versions = {}
for i, branch in ipairs(mod_struct) do
table.insert(versions, format_single_version(branch.v, branch.type))
end
return table.concat(versions, " / ")
end
--[=[
Функция, форматирующая номера версий какой-либо модификации вместе с
соответствующими версиями Minecraft. Предназначена для использования в карточках
модификаций.
Параметры:
• mod_struct: структура с данными о соответствующей модификации (см.
документацию модуля [[Модуль:Версия модификации/Данные]]).
Возвращает строку с готовым вики-текстом.
]=]
local function format_infobox(mod_struct)
local versions1 = {}
for i, branch in ipairs(mod_struct) do
if not versions1[branch.mc] then
versions1[branch.mc] = {}
end
table.insert(versions1[branch.mc], branch)
end
local versions2 = {}
for mcver, branch_array in pairs(versions1) do
table.insert(versions2, {mcver, branch_array})
end
table.sort(versions2, function(ver1, ver2) return compare_version(ver1[1], ver2[1]) end)
local result = {}
for i, v in ipairs(versions2) do
table.insert(result, ';' .. v[1])
for i2, branch in ipairs(v[2]) do
table.insert(result, ':' .. format_single_version(branch.v, branch.type))
end
end
return table.concat(result, '\n')
end
--[=[
Функция, форматирующая номера версий Minecraft, с которыми совместима какая-либо
модификация.
Параметры:
• mod_struct: структура с данными о соответствующей модификации (см.
документацию модуля [[Модуль:Версия модификации/Данные]]).
Возвращает строку с готовым вики-текстом.
]=]
local function format_mc(mod_struct)
local versions = {}
for i, branch in ipairs(mod_struct) do
table.insert(versions, branch.mc)
end
return table.concat(versions, " / ")
end
--[=[
Функция, форматирующая номера версий Minecraft, с которыми совместима какая-либо
модификация. Эта функция предназначена для встраивания значения в таблицу и
окрашивает ячейку с результатом в красный / зелёный цвет в зависимости от того,
есть ли у модификации ветка, поддерживающая последнюю версию Minecraft (Java
Edition).
Параметры:
• mod_struct: структура с данными о соответствующей модификации (см.
документацию модуля [[Модуль:Версия модификации/Данные]]).
Возвращает строку с готовым вики-текстом.
]=]
local function format_mct(mod_struct)
local versions = {}
local supports_latest = false
local latest = mw.loadData([[Модуль:Версия/Значения]]).m
for i, branch in ipairs(mod_struct) do
local mc_version = branch.mc
if mc_version == latest then
supports_latest = true
end
table.insert(versions, mc_version)
end
local result = table.concat(versions, " / ")
if supports_latest then
result = 'style="background: #C6EFCE; color: #006100" |' .. result
else
result = 'style="background: #FFC7CE; color: #9C0006" |' .. result
end
return result
end
local formatters = {
ver = format_ver,
infobox = format_infobox,
mc = format_mc,
mct = format_mct
}
--[=[
Точка входа для шаблона [[Шаблон:Модверсия]]. Для информации о параметрах см.
документацию этого шаблона.
]=]
function p.main(args)
local mod_data = mw.loadData([[Модуль:Версия модификации/Данные]])
local mod_struct = assert(
mod_data[args.mod],
("Модификации %s не найдено"):format(args.mod)
)
local formatter = assert( formatters[args.format], ("Некорректный формат: %s"):format(args.format) )
return formatter(mod_struct)
end
function p.version(f)
local args = require([[Модуль:ProcessArgs]]).merge(true)
local mod_name = assert(args[1], "Не указано название модификации")
local output_format = args[2]
local format = "ver"
if output_format then
if formatters[output_format] then
format = output_format
else
error(("Указан неверный формат: %s"):format(output_format))
end
end
return p.main({mod = mod_name, format = format})
end
--[=[
Дополнительная точка входа для документации шаблона [[Шаблон:Модверсия]].
Никаких параметров не принимает. Возвращает таблицу со всеми известными
модификациями.
]=]
function p.list_all()
local mod_data = mw.loadData([[Модуль:Версия модификации/Данные]])
local all_mods = {}
for k, v in pairs(mod_data) do
table.insert(all_mods, {k, v})
end
table.sort(all_mods, function(a, b) return a[2].name < b[2].name end)
local result = {}
table.insert(result, '{| class="wikitable"\n! Код\n! Название\n! Версия модификации\n! Версия Minecraft')
for i, mod in ipairs(all_mods) do
local mod_link = mod[2].link and (mod[2].link .. '|' .. mod[2].name) or mod[2].name
table.insert(result, '|-\n| <code>' .. mod[1] .. '</code>\n| [[' .. mod_link .. ']]\n| ' .. format_ver(mod[2]) .. '\n| ' .. format_mc(mod[2]))
end
table.insert(result, '|}')
return table.concat(result, '\n')
end
return p