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

Модуль:TableRole: различия между версиями

Материал из Space Station 14 | Время приключений Вики
м Исправление фона
м Удаление лишней функции
 
(не показано 7 промежуточных версий этого же участника)
Строка 1: Строка 1:
local p = {}
local p = {}


function p.render(frame)
-- Задаем фиксированный порядок параметров
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
Строка 26: Строка 58:
     end
     end
      
      
     -- Умная сортировка: если ключи числовые (например, 01, 2, 10),
     -- Сортировка по заданному порядкуту
    -- они сортируются как числа, а текстовые — по алфавиту
     table.sort(keys, function(a, b)  
     table.sort(keys, function(a, b)  
         local numA, numB = tonumber(a), tonumber(b)
         local posA = orderMap[a]
         if numA and numB then
        local posB = orderMap[b]
             return numA < numB
       
         elseif numA then
         if posA and posB then
             return true  -- Числа идут раньше строк
             return posA < posB
         elseif numB then
         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