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

Материал из Space Stories Wiki
Нет описания правки
Нет описания правки
Строка 3: Строка 3:
function p.main(frame)
function p.main(frame)
local args = frame:getParent().args
local args = frame:getParent().args
local name = args.name or "Без названия"
local name = args.name or "Без названия"
local recipe = args.recipe or ""
local recipe = args.recipe or ""
local effects = args.effects or "Нет описания."
local effects = args.effects or "Нет описания."
local method = recipe ~= "" and "Смешайте" or "Неизвестно"
local method = (recipe ~= "" and "Смешайте") or "Неизвестно"


local function formatReagents(str)
local function formatReagents(input)
local out = {}
local result = {}
for reagent in mw.text.gsplit(str, ",") do
for item in mw.text.gsplit(input, ",") do
local trimmed = mw.text.trim(reagent)
local trimmed = mw.text.trim(item)
local name, qty = trimmed:match("^(.-)%s*%[(%d+)%]$")
local rname, qty = trimmed:match("^(.-)%s*%[(%d+)%]$")
if name and qty then
if rname and qty then
table.insert(out, string.format(
table.insert(result, string.format(
'<div class="reagent-item">🧪 <span class="reagent">%s</span> <span class="qty">[%s]</span></div>',
'<div class="reagent-item">🧪 <span class="reagent">%s</span> <span class="qty">[%s]</span></div>',
mw.text.nowiki(name),
mw.text.nowiki(rname), mw.text.nowiki(qty)
mw.text.nowiki(qty)
))
))
else
else
table.insert(out, '<div class="reagent-item">' .. mw.text.nowiki(trimmed) .. '</div>')
table.insert(result, '<div class="reagent-item">' .. mw.text.nowiki(trimmed) .. '</div>')
end
end
end
end
return table.concat(out)
return table.concat(result)
end
end


local function collapsible(title, content)
local function makeCollapsible(title, body)
return string.format([[
return string.format([[
<div class="collapsible-container">
<div class="collapsible-container">
<div class="collapsible-header" onclick="this.nextElementSibling.classList.toggle('collapsed')">%s</div>
<div class="collapsible-header" onclick="this.nextElementSibling.classList.toggle('collapsed')">%s</div>
<div class="collapsible-body collapsed">%s</div>
<div class="collapsible-body collapsed">%s</div>
</div>]], title, content)
</div>]], title, body)
end
end


local html = mw.html.create("div")
-- Главный HTML блок
html:addClass("alchemy-card")
local html = {}
table.insert(html, '<div class="alchemy-card">')
 
table.insert(html, '<div class="alchemy-title">' .. name .. '</div>')


html:tag("div")
table.insert(html, '<div class="alchemy-section">')
:addClass("alchemy-title")
table.insert(html, makeCollapsible("Рецепт", formatReagents(recipe) .. '<div class="method">🔄 ' .. method .. '</div>'))
:wikitext(name)
table.insert(html, '</div>')


html:tag("div")
table.insert(html, '<div class="alchemy-section">')
:addClass("alchemy-section")
table.insert(html, makeCollapsible("Эффекты", effects))
:wikitext(collapsible("Рецепт", formatReagents(recipe) .. '<div class="method">🔄 ' .. method .. '</div>'))
table.insert(html, '</div>')


html:tag("div")
table.insert(html, '</div>') -- end alchemy-card
:addClass("alchemy-section")
:wikitext(collapsible("Эффекты", effects))


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


return p
return p

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

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

local p = {}

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

	local name = args.name or "Без названия"
	local recipe = args.recipe or ""
	local effects = args.effects or "Нет описания."
	local method = (recipe ~= "" and "Смешайте") or "Неизвестно"

	local function formatReagents(input)
		local result = {}
		for item in mw.text.gsplit(input, ",") do
			local trimmed = mw.text.trim(item)
			local rname, qty = trimmed:match("^(.-)%s*%[(%d+)%]$")
			if rname and qty then
				table.insert(result, string.format(
					'<div class="reagent-item">🧪 <span class="reagent">%s</span> <span class="qty">[%s]</span></div>',
					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)
		return string.format([[
<div class="collapsible-container">
	<div class="collapsible-header" onclick="this.nextElementSibling.classList.toggle('collapsed')">%s</div>
	<div class="collapsible-body collapsed">%s</div>
</div>]], title, body)
	end

	-- Главный HTML блок
	local html = {}
	table.insert(html, '<div class="alchemy-card">')

	table.insert(html, '<div class="alchemy-title">' .. name .. '</div>')

	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