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

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


local darkColors = {
function p.recipe(frame)
    border = "#338833",
local args = frame:getParent().args
    bg = "#101910",
local name = args.name or 'Неизвестно'
    border2 = "#cc7744",
local color = args.color or '#cccccc'
    bg2 = "#1a110a",
local product = args.product or ''
    border3 = "#2277cc",
local description = args.description or ''
    bg3 = "#0d1117"
local effect = args.effect or ''
}
local recipe = args.recipe or ''


-- Рендеринг списка ингредиентов с обработкой вики-разметки
local function collapse(title, content)
local function renderIngredients(ingredients, frame)
return string.format(
    local list = mw.html.create("ul"):addClass("alchemy-ingredient-list")
'<div class="alchemy-collapse">' ..
    for _, item in ipairs(ingredients) do
'<div class="alchemy-toggle" onclick="this.classList.toggle(\'open\')">%s</div>' ..
        if item and item ~= "" then
'<div class="alchemy-content">%s</div>' ..
            list:tag("li"):wikitext(frame:preprocess(item))
'</div>',
        end
title, content
    end
)
    return tostring(list)
end
end


function p.main(frame)
local recipeBlock = collapse('Рецепт', recipe)
    local args = frame.args
local effectBlock = collapse('Эффекты', effect)
    if not next(args) then
        args = frame:getParent().args
    end


    local ingredients = {}
return string.format([[
    for k, v in pairs(args) do
<div class="alchemy-block" style="border-color:%s">
        if k:match("^ingredient%d*$") and v and v ~= "" then
<div class="alchemy-header" style="background:%s">%s</div>
            table.insert(ingredients, v)
<div class="alchemy-body">
        end
<div class="alchemy-product">%s</div>
    end
%s
 
%s
    local result = args.result or ""
<div class="alchemy-description">%s</div>
    local effect = args.effect or ""
</div>
    local recipe = args.recipe or ""
</div>
 
]], color, color, name, product, recipeBlock, effectBlock, description)
    local card = mw.html.create("div")
        :addClass("alchemy-card")
        :css({
            ["border"] = "1px solid " .. darkColors.border,
            ["background-color"] = darkColors.bg,
            ["padding"] = "12px",
            ["margin"] = "8px",
            ["border-radius"] = "10px",
            ["width"] = "280px",
            ["box-shadow"] = "0 0 6px rgba(0,0,0,0.6)",
            ["display"] = "flex",
            ["flex-direction"] = "column",
            ["gap"] = "10px",
            ["word-wrap"] = "break-word"
        })
 
    -- Название результата
    if result ~= "" then
        card:tag("div")
            :addClass("alchemy-result-name")
            :css("color", darkColors.border)
            :css("font-size", "18px")
            :css("font-weight", "bold")
            :css("text-align", "center")
            :wikitext(frame:preprocess(result))
    end
 
    -- Ингредиенты
    if #ingredients > 0 then
        card:tag("div")
            :addClass("alchemy-ingredients")
            :wikitext(renderIngredients(ingredients, frame))
    end
 
    -- Рецепт
    if recipe ~= "" then
        card:tag("div")
            :addClass("alchemy-recipe")
            :css("color", darkColors.border2)
            :css("font-weight", "bold")
            :wikitext("Способ: " .. frame:preprocess(recipe))
    end
 
    -- Эффекты
    if effect ~= "" then
        card:tag("div")
            :addClass("alchemy-effect")
            :css("color", "#ccc")
            :css("font-size", "14px")
            :wikitext(frame:preprocess(effect))
    end
 
    return tostring(card)
end
end


return p
return p

Версия от 02:46, 17 июня 2025

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

local p = {}

function p.recipe(frame)
	local args = frame:getParent().args
	local name = args.name or 'Неизвестно'
	local color = args.color or '#cccccc'
	local product = args.product or ''
	local description = args.description or ''
	local effect = args.effect or ''
	local recipe = args.recipe or ''

	local function collapse(title, content)
		return string.format(
			'<div class="alchemy-collapse">' ..
				'<div class="alchemy-toggle" onclick="this.classList.toggle(\'open\')">%s</div>' ..
				'<div class="alchemy-content">%s</div>' ..
			'</div>',
			title, content
		)
	end

	local recipeBlock = collapse('Рецепт', recipe)
	local effectBlock = collapse('Эффекты', effect)

	return string.format([[
<div class="alchemy-block" style="border-color:%s">
	<div class="alchemy-header" style="background:%s">%s</div>
	<div class="alchemy-body">
		<div class="alchemy-product">%s</div>
		%s
		%s
		<div class="alchemy-description">%s</div>
	</div>
</div>
]], color, color, name, product, recipeBlock, effectBlock, description)
end

return p