Открыть меню
Открыть персональное меню
Вы не представились системе
Your IP address will be publicly visible if you make any edits.

Модуль:Версия модификации: различия между версиями

Материал из Create Wiki
(поддержка настраиваемых ссылок в таблице)
 
м (1 версия импортирована)
 

Текущая версия от 08:10, 20 июля 2024

Для документации этого модуля может быть создана страница Модуль:Версия модификации/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
Сайт использует Cookie для нормальной работы