Module:RecipeLoader: Difference between revisions

From Evospace
Jump to navigation Jump to search
No edit summary
No edit summary
Line 22: Line 22:


     local tableNode = mw.html.create("table")
     local tableNode = mw.html.create("table")
         :addClass("wikitable recipe-table")
         :addClass("recipe-table")


     -- Заголовок карточки
     -- Заголовок карточки с иконкой результата
     tableNode:tag("caption"):wikitext(recipe.name or "(no name)")
     local title = recipe.name or "(no name)"
    if outputs[1] and outputs[1][1] then
        tableNode:tag("caption")
            :wikitext(string.format("[[File:T_%s.png|20px]] %s", outputs[1][1], title))
    else
        tableNode:tag("caption"):wikitext(title)
    end


     -- Input
     -- Input
Line 32: Line 38:
         for _, ing in ipairs(inputs) do
         for _, ing in ipairs(inputs) do
             local tr = tableNode:tag("tr"):addClass("input-row")
             local tr = tableNode:tag("tr"):addClass("input-row")
             tr:tag("td"):wikitext(string.format("[[File:T_%s.png|28px]]", ing[1]))
             tr:tag("td"):wikitext(string.format("[[File:T_%s.png|22px]]", ing[1]))
             tr:tag("td"):wikitext(string.format("[[%s]]", ing[1]))
             tr:tag("td"):wikitext(string.format("[[%s]]", ing[1]))
             tr:tag("td"):wikitext("× " .. tostring(ing[2]))
             tr:tag("td"):wikitext("× " .. tostring(ing[2]))
Line 45: Line 51:
         for _, res in ipairs(outputs) do
         for _, res in ipairs(outputs) do
             local tr = tableNode:tag("tr"):addClass("output-row")
             local tr = tableNode:tag("tr"):addClass("output-row")
             tr:tag("td"):wikitext(string.format("[[File:T_%s.png|28px]]", res[1]))
             tr:tag("td"):wikitext(string.format("[[File:T_%s.png|22px]]", res[1]))
             tr:tag("td"):wikitext(string.format("[[%s]]", res[1]))
             tr:tag("td"):wikitext(string.format("[[%s]]", res[1]))
             tr:tag("td"):wikitext("× " .. tostring(res[2]))
             tr:tag("td"):wikitext("× " .. tostring(res[2]))
Line 62: Line 68:
     return tableNode
     return tableNode
end
end
-- Вывод одного конкретного рецепта
-- Вывод одного конкретного рецепта
function p.get(frame)
function p.get(frame)

Revision as of 18:10, 31 July 2025

Documentation for this module may be created at Module:RecipeLoader/doc

local p = {}

local function normalizeArray(tbl)
    local result = {}
    if not tbl then return result end
    for k, v in pairs(tbl) do
        -- Каждая строка тоже может быть ассоциативной таблицей
        if type(v) == "table" then
            local name = v[1] or v.name or v["1"]
            local count = v[2] or v.count or v["2"] or 1
            table.insert(result, {name, count})
        end
    end
    table.sort(result, function(a,b) return tostring(a[1]) < tostring(b[1]) end)
    return result
end

local function renderRecipe(recipe)
    local inputs = normalizeArray(recipe.input)
    local outputs = normalizeArray(recipe.output)
    local ticks = recipe.ticks or recipe.time or ""

    local tableNode = mw.html.create("table")
        :addClass("recipe-table")

    -- Заголовок карточки с иконкой результата
    local title = recipe.name or "(no name)"
    if outputs[1] and outputs[1][1] then
        tableNode:tag("caption")
            :wikitext(string.format("[[File:T_%s.png|20px]] %s", outputs[1][1], title))
    else
        tableNode:tag("caption"):wikitext(title)
    end

    -- Input
    tableNode:tag("tr"):tag("th"):attr("colspan", 3):wikitext("Input")
    if #inputs > 0 then
        for _, ing in ipairs(inputs) do
            local tr = tableNode:tag("tr"):addClass("input-row")
            tr:tag("td"):wikitext(string.format("[[File:T_%s.png|22px]]", ing[1]))
            tr:tag("td"):wikitext(string.format("[[%s]]", ing[1]))
            tr:tag("td"):wikitext("× " .. tostring(ing[2]))
        end
    else
        tableNode:tag("tr"):tag("td"):attr("colspan", 3):wikitext("—")
    end

    -- Output
    tableNode:tag("tr"):tag("th"):attr("colspan", 3):wikitext("Output")
    if #outputs > 0 then
        for _, res in ipairs(outputs) do
            local tr = tableNode:tag("tr"):addClass("output-row")
            tr:tag("td"):wikitext(string.format("[[File:T_%s.png|22px]]", res[1]))
            tr:tag("td"):wikitext(string.format("[[%s]]", res[1]))
            tr:tag("td"):wikitext("× " .. tostring(res[2]))
        end
    else
        tableNode:tag("tr"):tag("td"):attr("colspan", 3):wikitext("—")
    end

    -- Time
    tableNode:tag("tr"):tag("th"):attr("colspan", 3):wikitext("Time")
    tableNode:tag("tr")
        :tag("td"):attr("colspan", 3)
        :css("text-align", "center")
        :wikitext(tostring(ticks) .. " ticks")

    return tableNode
end
-- Вывод одного конкретного рецепта
function p.get(frame)
    local dictName = frame.args[1]
    local recipeName = frame.args[2]

    if not dictName or not recipeName then
        return "❌ Missing parameters: {{Recipe|DictionaryName|RecipeName}}"
    end

    local success, recipes = pcall(mw.loadData, "Module:" .. dictName)
    if not success or type(recipes) ~= "table" then
        return "❌ Recipe dictionary not found: " .. tostring(dictName)
    end

    local html = mw.html.create()
    for _, recipe in ipairs(recipes) do
        if recipe.name == recipeName then
            html:node(renderRecipe(recipe))
        end
    end

    if tostring(html) == "" then
        return "⚠️ Recipe not found: " .. tostring(recipeName)
    end

    return tostring(html)
end

-- Вывод всех рецептов из словаря
function p.getAll(frame)
    local dictName = frame.args[1]

    if not dictName then
        return "❌ Missing parameter: {{AllRecipes|DictionaryName}}"
    end

    local success, recipes = pcall(mw.loadData, "Module:" .. dictName)
    if not success or type(recipes) ~= "table" then
        return "❌ Recipe dictionary not found: " .. tostring(dictName)
    end

    local html = mw.html.create()

    for _, recipe in ipairs(recipes) do
        html:node(renderRecipe(recipe))
    end

    return tostring(html)
end

return p