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

Материал из Space Stories Wiki
Нет описания правки
Нет описания правки
Строка 2: Строка 2:


function p.main(frame)
function p.main(frame)
local args = frame:getParent().args
    local args = frame:getParent().args
   
    -- Обработка и экранирование параметров
    local name = mw.text.killMarkers(args.name or "Без названия")
    local recipe = args.recipe or ""
    local effects = frame:preprocess(args.effects or "Нет описания.")
    local method = (recipe ~= "" and "Смешайте") or "Неизвестно"


local name = args.name or "Без названия"
    -- Функция для обработки реагентов (безопасная и с поддержкой запятых)
local recipe = args.recipe or ""
    local function formatReagents(input)
local effects = args.effects or "Нет описания."
        if input == "" then return "" end
local method = (recipe ~= "" and "Смешайте") or "Неизвестно"
       
        local result = {}
        -- Регулярка для обработки элементов вида "Название [10]"
        for item, qty in mw.ustring.gmatch(input, "([^%[%],]-)%s*%[(%d+)%]%s*,?") do
            item = mw.text.trim(item)
            if item ~= "" then
                table.insert(result, string.format(
                    '<div class="reagent-item">🧪 <span class="reagent">%s</span> <span class="qty">[%s]</span></div>',
                    mw.text.nowiki(item), qty
                ))
            end
        end
        return table.concat(result)
    end


local function formatReagents(input)
    -- Современное сворачивание без JavaScript
local result = {}
    local function makeCollapsible(title, body)
for item in mw.text.gsplit(input, ",") do
        return string.format([[
local trimmed = mw.text.trim(item)
        <details class="alchemy-collapsible">
local rname, qty = trimmed:match("^(.-)%s*%[(%d+)%]$")
            <summary>%s</summary>
if rname and qty then
            <div class="alchemy-collapsible-content">%s</div>
table.insert(result, string.format(
        </details>]], title, body)
'<div class="reagent-item">🧪 <span class="reagent">%s</span> <span class="qty">[%s]</span></div>',
    end
mw.text.nowiki(rname), mw.text.nowiki(qty)
))
else
table.insert(result, '<div class="reagent-item">' .. mw.text.nowiki(trimmed) .. '</div>')
end
end
return table.concat(result)
end


local function makeCollapsible(title, body)
    -- Сборка HTML-карточки
return string.format([[
    local html = {
<div class="collapsible-container">
        '<div class="alchemy-card">',
<div class="collapsible-header" onclick="this.nextElementSibling.classList.toggle('collapsed')">%s</div>
        '<div class="alchemy-title">' .. name .. '</div>',
<div class="collapsible-body collapsed">%s</div>
        '<div class="alchemy-section">',
</div>]], title, body)
        makeCollapsible("Рецепт", formatReagents(recipe) .. '<div class="method">🔄 ' .. method .. '</div>'),
end
        '</div>',
 
        '<div class="alchemy-section">',
-- Главный HTML блок
        makeCollapsible("Эффекты", effects),
local html = {}
        '</div>',
table.insert(html, '<div class="alchemy-card">')
        '</div>'
 
    }
table.insert(html, '<div class="alchemy-title">' .. name .. '</div>')
   
    return table.concat(html)
end


table.insert(html, '<div class="alchemy-section">')
table.insert(html, makeCollapsible("Рецепт", formatReagents(recipe) .. '<div class="method">🔄 ' .. method .. '</div>'))
table.insert(html, '</div>')
table.insert(html, '<div class="alchemy-section">')
table.insert(html, makeCollapsible("Эффекты", effects))
table.insert(html, '</div>')
table.insert(html, '</div>') -- end alchemy-card
return table.concat(html, "\n")
end
return p
return p

Версия от 10:55, 22 июня 2025

Для документации этого модуля может быть создана страница Модуль:AlchemyRecipe/doc

local p = {}

function p.main(frame)
    local args = frame:getParent().args
    
    -- Обработка и экранирование параметров
    local name = mw.text.killMarkers(args.name or "Без названия")
    local recipe = args.recipe or ""
    local effects = frame:preprocess(args.effects or "Нет описания.")
    local method = (recipe ~= "" and "Смешайте") or "Неизвестно"

    -- Функция для обработки реагентов (безопасная и с поддержкой запятых)
    local function formatReagents(input)
        if input == "" then return "" end
        
        local result = {}
        -- Регулярка для обработки элементов вида "Название [10]"
        for item, qty in mw.ustring.gmatch(input, "([^%[%],]-)%s*%[(%d+)%]%s*,?") do
            item = mw.text.trim(item)
            if item ~= "" then
                table.insert(result, string.format(
                    '<div class="reagent-item">🧪 <span class="reagent">%s</span> <span class="qty">[%s]</span></div>',
                    mw.text.nowiki(item), qty
                ))
            end
        end
        return table.concat(result)
    end

    -- Современное сворачивание без JavaScript
    local function makeCollapsible(title, body)
        return string.format([[
        <details class="alchemy-collapsible">
            <summary>%s</summary>
            <div class="alchemy-collapsible-content">%s</div>
        </details>]], title, body)
    end

    -- Сборка HTML-карточки
    local html = {
        '<div class="alchemy-card">',
        '<div class="alchemy-title">' .. name .. '</div>',
        '<div class="alchemy-section">',
        makeCollapsible("Рецепт", formatReagents(recipe) .. '<div class="method">🔄 ' .. method .. '</div>'),
        '</div>',
        '<div class="alchemy-section">',
        makeCollapsible("Эффекты", effects),
        '</div>',
        '</div>'
    }
    
    return table.concat(html)
end

return p