Модуль:TableRole: различия между версиями
Материал из Space Station 14 | Время приключений Вики
Дополнительные действия
Torgovec (обсуждение | вклад) Модуль для тестов |
Torgovec (обсуждение | вклад) м Удаление лишней функции |
||
| (не показано 8 промежуточных версий этого же участника) | |||
| Строка 1: | Строка 1: | ||
local p = {} | local p = {} | ||
function p. | -- Задаем фиксированный порядок параметров | ||
local predefinedOrder = { | |||
"Управление шаттлом", | |||
"Продвинутый атмос", | |||
"Химия", | |||
"Сборка ДАМ/Сингулярность/Тесла", | |||
"Постройка сложных объектов", | |||
"Робототехника", | |||
"Постройка приборов", | |||
"Исследования и разработка", | |||
"Хирургия", | |||
"Магия", | |||
"Медицинское оборудование", | |||
"Вирусология", | |||
"Фармакология", | |||
"Атмос", | |||
"Продвинутая ботаника", | |||
"Взлом", | |||
"Коктейли", | |||
"Готовка", | |||
"Базовая ботаника", | |||
"Базовое лечение", | |||
"Простые конструкции", | |||
"Работа с P.A.C.M.A.N" | |||
} | |||
-- Создаем карту для быстрого поиска индекса каждого параметра | |||
local orderMap = {} | |||
for index, name in ipairs(predefinedOrder) do | |||
orderMap[name] = index | |||
end | |||
function p.role(frame) | |||
local args = frame:getParent().args | local args = frame:getParent().args | ||
-- Поддерживаем как позиционный аргумент 1, так и именованный title | -- Поддерживаем как позиционный аргумент 1, так и именованный title | ||
| Строка 15: | Строка 47: | ||
:attr('colspan', '2') | :attr('colspan', '2') | ||
:css('text-align', 'center') | :css('text-align', 'center') | ||
:css('background', '# | :css('background', '#08245c') | ||
:wikitext(title) | :wikitext(title) | ||
| Строка 26: | Строка 58: | ||
end | end | ||
-- | -- Сортировка по заданному порядкуту | ||
table.sort(keys, function(a, b) | table.sort(keys, function(a, b) | ||
local | local posA = orderMap[a] | ||
if | local posB = orderMap[b] | ||
return | |||
elseif | if posA and posB then | ||
return true -- | return posA < posB | ||
elseif | elseif posA then | ||
return true -- Параметры из вашего списка идут первыми | |||
elseif posB then | |||
return false | return false | ||
else | else | ||
return tostring(a) < tostring(b) | return tostring(a) < tostring(b) -- Неизвестные параметры сортируются по алфавиту в конце | ||
end | end | ||
end) | end) | ||
| Строка 62: | Строка 95: | ||
return tostring(root) | return tostring(root) | ||
end | |||
-- Функция для генерации строки для общей таблицы навыков | |||
function p.row(frame) | |||
local args = frame:getParent().args | |||
-- Получаем название роли (позиционный аргумент 1 или title) | |||
local title = args[1] or args.title or "Роль" | |||
-- Добавляем точку в конце, если её там нет | |||
if not title:match("%.$") then | |||
title = title .. "." | |||
end | |||
local cells = {} | |||
-- Первая ячейка — название роли (используем вики-синтаксис с палочками, как в шаблонах) | |||
table.insert(cells, string.format('|style="background-color:rgba(0, 0, 255, 0.12);"|\'\'\'%s\'\'\'', title)) | |||
-- Перебираем все навыки в строгом порядке из predefinedOrder | |||
for _, skillName in ipairs(predefinedOrder) do | |||
-- Ищем значение параметра регистронезависимо | |||
local val = nil | |||
for k, v in pairs(args) do | |||
if type(k) == "string" and k:lower() == skillName:lower() then | |||
val = v | |||
break | |||
end | |||
end | |||
-- Безопасная проверка на пустоту (решает проблему с пустой строкой в Lua) | |||
local trimmedVal = (val and type(val) == "string") and mw.text.trim(val) or "" | |||
local lowerVal = trimmedVal == "" and "нет" or trimmedVal:lower() | |||
-- Выбираем шаблон в зависимости от значения | |||
local templateName = 'Шаблон:Ячейка/Нет' | |||
if lowerVal == "да" or lowerVal == "yes" or lowerVal == "true" then | |||
templateName = 'Шаблон:Ячейка/Да' | |||
end | |||
-- Рендерим шаблон через Lua API и оборачиваем в mw.html ячейку | |||
local expanded = frame:expandTemplate{ title = templateName } | |||
table.insert(cells, expanded) | |||
end | |||
-- Объединяем ячейки через перенос строки | |||
return table.concat(cells, "\n") | |||
end | end | ||
return p | return p | ||
Текущая версия от 09:36, 4 ноября 2026
Для документации этого модуля может быть создана страница Модуль:TableRole/doc
local p = {}
-- Задаем фиксированный порядок параметров
local predefinedOrder = {
"Управление шаттлом",
"Продвинутый атмос",
"Химия",
"Сборка ДАМ/Сингулярность/Тесла",
"Постройка сложных объектов",
"Робототехника",
"Постройка приборов",
"Исследования и разработка",
"Хирургия",
"Магия",
"Медицинское оборудование",
"Вирусология",
"Фармакология",
"Атмос",
"Продвинутая ботаника",
"Взлом",
"Коктейли",
"Готовка",
"Базовая ботаника",
"Базовое лечение",
"Простые конструкции",
"Работа с P.A.C.M.A.N"
}
-- Создаем карту для быстрого поиска индекса каждого параметра
local orderMap = {}
for index, name in ipairs(predefinedOrder) do
orderMap[name] = index
end
function p.role(frame)
local args = frame:getParent().args
-- Поддерживаем как позиционный аргумент 1, так и именованный title
local title = args[1] or args.title or "Информация"
-- Используем встроенную библиотеку mw.html (рекомендация MediaWiki)
local root = mw.html.create('table')
:addClass('wikitable')
-- Заголовок таблицы
root:tag('tr')
:tag('th')
:attr('colspan', '2')
:css('text-align', 'center')
:css('background', '#08245c')
:wikitext(title)
-- Собираем все ключи, кроме первого (заголовка)
local keys = {}
for k, _ in pairs(args) do
if k ~= 1 and k ~= "1" and k ~= "title" then
table.insert(keys, k)
end
end
-- Сортировка по заданному порядкуту
table.sort(keys, function(a, b)
local posA = orderMap[a]
local posB = orderMap[b]
if posA and posB then
return posA < posB
elseif posA then
return true -- Параметры из вашего списка идут первыми
elseif posB then
return false
else
return tostring(a) < tostring(b) -- Неизвестные параметры сортируются по алфавиту в конце
end
end)
-- Перебираем каждый параметр и формируем строки таблицы
for _, k in ipairs(keys) do
local rawVal = args[k]
local trimmedVal = mw.text.trim(rawVal)
local lowerVal = trimmedVal:lower()
local displayVal = trimmedVal
-- Красивое оформление для да/нет
if lowerVal == "да" or lowerVal == "yes" or lowerVal == "true" then
displayVal = '<span style="color: green; font-weight: bold;">✔ Да</span>'
elseif lowerVal == "нет" or lowerVal == "no" or lowerVal == "false" then
displayVal = '<span style="color: red;">✖ Нет</span>'
end
-- Добавляем строку в таблицу
root:tag('tr')
:tag('td'):wikitext(k):done()
:tag('td'):wikitext(displayVal):done()
end
return tostring(root)
end
-- Функция для генерации строки для общей таблицы навыков
function p.row(frame)
local args = frame:getParent().args
-- Получаем название роли (позиционный аргумент 1 или title)
local title = args[1] or args.title or "Роль"
-- Добавляем точку в конце, если её там нет
if not title:match("%.$") then
title = title .. "."
end
local cells = {}
-- Первая ячейка — название роли (используем вики-синтаксис с палочками, как в шаблонах)
table.insert(cells, string.format('|style="background-color:rgba(0, 0, 255, 0.12);"|\'\'\'%s\'\'\'', title))
-- Перебираем все навыки в строгом порядке из predefinedOrder
for _, skillName in ipairs(predefinedOrder) do
-- Ищем значение параметра регистронезависимо
local val = nil
for k, v in pairs(args) do
if type(k) == "string" and k:lower() == skillName:lower() then
val = v
break
end
end
-- Безопасная проверка на пустоту (решает проблему с пустой строкой в Lua)
local trimmedVal = (val and type(val) == "string") and mw.text.trim(val) or ""
local lowerVal = trimmedVal == "" and "нет" or trimmedVal:lower()
-- Выбираем шаблон в зависимости от значения
local templateName = 'Шаблон:Ячейка/Нет'
if lowerVal == "да" or lowerVal == "yes" or lowerVal == "true" then
templateName = 'Шаблон:Ячейка/Да'
end
-- Рендерим шаблон через Lua API и оборачиваем в mw.html ячейку
local expanded = frame:expandTemplate{ title = templateName }
table.insert(cells, expanded)
end
-- Объединяем ячейки через перенос строки
return table.concat(cells, "\n")
end
return p