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

Материал из Space Stories Wiki
Нет описания правки
Метка: ручная отмена
Нет описания правки
Строка 1: Строка 1:
local p = {}
local p = {}


local function listBlock(text)
local darkColors = {
local items = {}
    border = "#338833",
for item in mw.text.gsplit(text, ";") do
    bg = "#1a2a1a",
table.insert(items, "<div>" .. mw.text.trim(item) .. "</div>")
    border2 = "#cc7744",
end
    bg2 = "#2a1a12",
return table.concat(items, "\n")
    border3 = "#2277cc",
    bg3 = "#121a26"
}
 
local function renderIngredients(ingredients)
    local parts = {}
    for _, item in ipairs(ingredients) do
        table.insert(parts, mw.html.create("div"):wikitext(item):allDone())
    end
    return table.concat(parts, "\n")
end
end


local function listUL(text)
local function renderEffect(text)
local items = {}
    return mw.html.create("div"):addClass("alchemy-effect"):wikitext(text):allDone()
for item in mw.text.gsplit(text, ";") do
table.insert(items, "<li>" .. mw.text.trim(item) .. "</li>")
end
return table.concat(items, "\n")
end
end


local function makeCard(recipe)
local function renderRecipe(text)
local title = recipe["Название"] or "Без названия"
    return mw.html.create("div"):addClass("alchemy-recipe-block"):wikitext(text):allDone()
local ingredients = recipe["Ингредиенты"] or ""
end
local result = recipe["Результат"] or ""
local effects = recipe["Эффекты"] or ""
local effectsDesc = recipe["ОписаниеЭффектов"] or ""
local borderColor = recipe["ЦветРамки"] or "#338833"
local backgroundColor = recipe["ЦветФона"] or "#1a2a1a"


local html = {}
function p.main(frame)
table.insert(html, string.format(
    local args = frame:getParent().args
'<div class="alchemy-card" style="border-color: %s; background-color: %s;">',
borderColor, backgroundColor
))
table.insert(html, '<h3 class="alchemy-title">' .. mw.text.encode(title) .. '</h3>')


table.insert(html, '<div class="alchemy-main-row">')
    local ingredients = {}
    for k,v in pairs(args) do
        if k:match("^ingredient%d*$") then
            table.insert(ingredients, v)
        end
    end


table.insert(html, '<div class="alchemy-ingredients">')
    local result = args.result or "?"
-- убираем строку с "Рецепт:"
    local effect = args.effect or ""
-- table.insert(html, '<div class="alchemy-label">Рецепт:</div>')
    local recipe = args.recipe or ""
table.insert(html, listBlock(ingredients))
table.insert(html, '</div>')


table.insert(html, '<div class="alchemy-plus">СМЕШАТЬ</div>')
    local html = mw.html.create("div")
        :addClass("alchemy-card")


table.insert(html, '<div class="alchemy-result">')
    local content = mw.html.create("div")
table.insert(html, listBlock(result))
        :addClass("alchemy-content")
table.insert(html, '</div>')
        :css("display", "flex")
        :css("justify-content", "center")
        :css("align-items", "center")


table.insert(html, '</div>')
    -- Левая колонка: ингредиенты вертикально
    local left = mw.html.create("div")
        :addClass("alchemy-ingredients")
        :css("display", "flex")
        :css("flex-direction", "column")
        :css("gap", "6px")
        :css("min-width", "150px")
        :wikitext(renderIngredients(ingredients))


if effects ~= "" then
    -- Центр: слово Смешайте
table.insert(html, '<b>Эффекты:</b><ul class="alchemy-effects">')
    local center = mw.html.create("div")
table.insert(html, listUL(effects))
        :addClass("alchemy-mix")
table.insert(html, '</ul>')
        :css("margin", "0 20px")
if effectsDesc ~= "" then
        :css("font-weight", "bold")
table.insert(html, '<div class="alchemy-effects-desc">' .. mw.text.encode(effectsDesc) .. '</div>')
        :css("color", darkColors.border)
end
        :wikitext("Смешайте")
end


table.insert(html, '</div>')
    -- Правая колонка: результат
return table.concat(html, "\n")
    local right = mw.html.create("div")
end
        :addClass("alchemy-result")
        :css("display", "flex")
        :css("flex-direction", "column")
        :css("gap", "10px")


function p.grid(frame)
    right:node(mw.html.create("div"):addClass("alchemy-result-name"):wikitext(result))
local count = tonumber(frame.args.count) or 0
if count == 0 then return "Ошибка: параметр count обязателен и должен быть числом." end


local allRecipes = {}
    if effect ~= "" then
for i = 1, count do
        right:node(mw.html.create("div"):addClass("alchemy-effect-block"):wikitext(effect))
local r = {}
    end
for _, key in ipairs({"Название", "Ингредиенты", "Результат", "Эффекты", "ОписаниеЭффектов", "ЦветРамки", "ЦветФона"}) do
local val = frame.args[key .. i]
if val then r[key] = val end
end
table.insert(allRecipes, r)
end


local html = {}
    if recipe ~= "" then
html[#html + 1] = '<div class="alchemy-grid">'
        right:node(mw.html.create("div"):addClass("alchemy-recipe-block"):wikitext(recipe))
    end


for _, recipe in ipairs(allRecipes) do
    content
html[#html + 1] = makeCard(recipe)
        :node(left)
end
        :node(center)
        :node(right)


html[#html + 1] = '</div>'
    html
        :node(content)


return table.concat(html, "\n")
    return tostring(html)
end
end


return p
return p

Версия от 18:30, 16 мая 2025

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

local p = {}

local darkColors = {
    border = "#338833",
    bg = "#1a2a1a",
    border2 = "#cc7744",
    bg2 = "#2a1a12",
    border3 = "#2277cc",
    bg3 = "#121a26"
}

local function renderIngredients(ingredients)
    local parts = {}
    for _, item in ipairs(ingredients) do
        table.insert(parts, mw.html.create("div"):wikitext(item):allDone())
    end
    return table.concat(parts, "\n")
end

local function renderEffect(text)
    return mw.html.create("div"):addClass("alchemy-effect"):wikitext(text):allDone()
end

local function renderRecipe(text)
    return mw.html.create("div"):addClass("alchemy-recipe-block"):wikitext(text):allDone()
end

function p.main(frame)
    local args = frame:getParent().args

    local ingredients = {}
    for k,v in pairs(args) do
        if k:match("^ingredient%d*$") then
            table.insert(ingredients, v)
        end
    end

    local result = args.result or "?"
    local effect = args.effect or ""
    local recipe = args.recipe or ""

    local html = mw.html.create("div")
        :addClass("alchemy-card")

    local content = mw.html.create("div")
        :addClass("alchemy-content")
        :css("display", "flex")
        :css("justify-content", "center")
        :css("align-items", "center")

    -- Левая колонка: ингредиенты вертикально
    local left = mw.html.create("div")
        :addClass("alchemy-ingredients")
        :css("display", "flex")
        :css("flex-direction", "column")
        :css("gap", "6px")
        :css("min-width", "150px")
        :wikitext(renderIngredients(ingredients))

    -- Центр: слово Смешайте
    local center = mw.html.create("div")
        :addClass("alchemy-mix")
        :css("margin", "0 20px")
        :css("font-weight", "bold")
        :css("color", darkColors.border)
        :wikitext("Смешайте")

    -- Правая колонка: результат
    local right = mw.html.create("div")
        :addClass("alchemy-result")
        :css("display", "flex")
        :css("flex-direction", "column")
        :css("gap", "10px")

    right:node(mw.html.create("div"):addClass("alchemy-result-name"):wikitext(result))

    if effect ~= "" then
        right:node(mw.html.create("div"):addClass("alchemy-effect-block"):wikitext(effect))
    end

    if recipe ~= "" then
        right:node(mw.html.create("div"):addClass("alchemy-recipe-block"):wikitext(recipe))
    end

    content
        :node(left)
        :node(center)
        :node(right)

    html
        :node(content)

    return tostring(html)
end

return p