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

Материал из Space Stories Wiki
Нет описания правки
Нет описания правки
 
(не показано 5 промежуточных версий этого же участника)
Строка 1: Строка 1:
local p = {}
local p = {}


-- Функция для разделения строки по разделителю ';'
function p.recipe(frame)
local function split(str, sep)
local args = frame:getParent().args
    local result = {}
local name = args.name or 'Неизвестно'
    for part in mw.text.gsplit(str, sep) do
local color = args.color or '#cccccc'
        table.insert(result, mw.text.trim(part))
local product = args.product or ''
    end
local description = args.description or ''
    return result
local effect = args.effect or ''
end
local recipe = args.recipe or ''


-- Функция рендера одной карточки
local function collapse(title, content)
local function renderCard(name, ingredients_raw, result, effects_raw, effects_desc, border_color, bg_color)
return string.format(
    local ingredients = split(ingredients_raw or '', ';')
'<div class="alchemy-collapse">' ..
    local effects = split(effects_raw or '', ';')
'<div class="alchemy-toggle" onclick="this.classList.toggle(\'open\')">%s</div>' ..
'<div class="alchemy-content">%s</div>' ..
'</div>',
title, content
)
end


    local card = mw.html.create('div')
local recipeBlock = collapse('Рецепт', recipe)
        :addClass('alchemy-card')
local effectBlock = collapse('Эффекты', effect)
        :css('border-color', border_color or '#338833')
        :css('background-color', bg_color or '#1a2a1a')


    -- Название
return string.format([[
    card:tag('h3'):wikitext(name or '')
<div class="alchemy-block" style="border-color:%s">
 
<div class="alchemy-header" style="background:%s">%s</div>
    -- Ингредиенты (вертикально)
<div class="alchemy-body">
    local ingr_div = card:tag('div'):addClass('alchemy-ingredients')
<div class="alchemy-product">%s</div>
    for _, ingr in ipairs(ingredients) do
%s
        ingr_div:tag('div'):wikitext(ingr)
%s
    end
<div class="alchemy-description">%s</div>
 
</div>
    -- Центр — слово "Смешайте"
</div>
    card:tag('div'):addClass('alchemy-mix'):wikitext('Смешайте')
]], color, color, name, product, recipeBlock, effectBlock, description)
 
    -- Результат
    card:tag('div'):addClass('alchemy-result'):wikitext(result or '')
 
    -- Эффекты (без списка)
    local eff_div = card:tag('div'):addClass('alchemy-effects')
    for _, eff in ipairs(effects) do
        eff_div:tag('div'):addClass('alchemy-effect-line'):wikitext(eff)
    end
 
    -- Описание эффектов
    if effects_desc and effects_desc ~= '' then
        eff_div:tag('div'):addClass('alchemy-effect-desc'):wikitext(effects_desc)
    end
 
    return tostring(card)
end
 
-- Функция для рендера одной карточки через шаблон
function p.card(frame)
    local args = frame:getParent().args or {}
    return renderCard(
        args['Название'],
        args['Ингредиенты'],
        args['Результат'],
        args['Эффекты'],
        args['ОписаниеЭффектов'],
        args['ЦветРамки'],
        args['ЦветФона']
    )
end
 
-- Функция рендера сетки карточек
function p.grid(frame)
    local args = frame:getParent().args or {}
    local count = tonumber(args.count) or 0
 
    local html = mw.html.create('div'):addClass('alchemy-grid-container')
 
    for i = 1, count do
        local card_html = renderCard(
            args['Название' .. i],
            args['Ингредиенты' .. i],
            args['Результат' .. i],
            args['Эффекты' .. i],
            args['ОписаниеЭффектов' .. i],
            args['ЦветРамки' .. i],
            args['ЦветФона' .. i]
        )
        html:wikitext(card_html)
    end
 
    return tostring(html)
end
end


return p
return p

Текущая версия от 02:45, 17 июня 2025

Для документации этого модуля может быть создана страница Модуль:AlchemyRecipesGrid/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