Die Dokumentation für dieses Modul kann unter Modul:BündelGalerie/Doku erstellt werden

local p = {}

-- kleine Helfer
local function trim(s)
	if not s then return "" end
	return mw.text.trim(tostring(s))
end

local function escapeLuaPattern(s)
	-- escaped Sonderzeichen für Lua-Patterns
	return (mw.ustring.gsub(tostring(s), "([%%%^%$%(%)%.%[%]%*%+%-%?])", "%%%1"))
end

-- liest "Item; Item2; Item3" ODER "Item|Bild.png; Item2; Item3|Bild2.png"
-- und liefert eine Tabelle mit { name = "...", image = "....png" }
local function splitItems(s)
	local out = {}
	if not s or s == "" then
		return out
	end

	-- Trennung: Semikolon, mit optionalen Leerzeichen drumherum
	for part in mw.text.gsplit(s, "%s*;%s*") do
		part = trim(part)
		if part ~= "" then
			-- optionales Format: name|image
			local name, image = part:match("^(.-)%|(.-)$")
			if name then
				name = trim(name)
				image = trim(image)
				-- falls jemand ".png" vergisst, ergänzen wir es sanft
				if image ~= "" and not image:lower():match("%.png$") then
					image = image .. ".png"
				end
				table.insert(out, { name = name, image = image })
			else
				-- Standard: Bildname = Itemname + .png
				table.insert(out, { name = part, image = part .. ".png" })
			end
		end
	end

	return out
end

-- holt Bündeldaten aus Vorlage:BündelDaten (Wikitext)
local function getBundleData(bundleKey)
	local tpl = mw.title.new("Vorlage:BündelDaten")
	if not tpl or not tpl.exists then
		return nil, 'Vorlage "BündelDaten" existiert nicht.'
	end

	local content = tpl:getContent() or ""
	bundleKey = trim(bundleKey)

	-- Robust: Zeilenanfang + Key (auch mit Leerzeichen/"") + optional spaces + = + value bis Zeilenende
	local keyEsc = escapeLuaPattern(bundleKey)
	local pattern = "\n%s*" .. keyEsc .. "%s*=%s*(.-)%s*\n"
	local value = mw.ustring.match("\n" .. content .. "\n", pattern)

	if not value then
		return nil, 'Bündel "' .. bundleKey .. '" nicht gefunden.'
	end

	return trim(value), nil
end

-- Hauptfunktion: {{#invoke:BündelGalerie|render|bundle=...}}
function p.render(frame)
	local args = frame.args or {}
	local parent = frame:getParent()

	-- Parent-Args übernehmen (für Aufruf über Vorlage)
	if parent and parent.args then
		for k, v in pairs(parent.args) do
			if args[k] == nil or args[k] == "" then
				args[k] = v
			end
		end
	end

	local bundle = trim(args.bundle or args[1])
	if bundle == "" then
		return '<span class="error">Lua-Fehler: Kein Bündel angegeben. Nutze bundle=...</span>'
	end

	-- optionaler Titel (Wiki-Überschrift)
	local title = trim(args.title or "")
	-- optional: Badge-Ecke im Galerie (premium / sternenpfad)
	local badge = trim(args.badge or "")

	local raw, err = getBundleData(bundle)
	if err then
		return '<span class="error">Lua-Fehler: ' .. mw.text.nowiki(err) .. "</span>"
	end

	local items = splitItems(raw)
	if #items == 0 then
		return '<span class="error">Lua-Fehler: Bündel "' .. mw.text.nowiki(bundle) .. '" ist leer.</span>'
	end

	local out = {}

	-- optionaler Titel
	if title ~= "" then
		table.insert(out, "==" .. title .. "==")
	end

	-- Galerie-Wrapper (via CSS stylen)
	table.insert(out, '<div class="bundle-gallery">')

	for _, item in ipairs(items) do
		-- Galerie erwartet als 1. Parameter den Dateinamen OHNE .png
		local imageBase = item.image:gsub("%.png$", "")
		local wikitext = frame:expandTemplate{
			title = "Galerie",
			args = {
				[1] = imageBase,
				[2] = badge,
				link = item.name
			}
		}
		table.insert(out, wikitext)
	end

	table.insert(out, "</div>")

	return table.concat(out, "\n")
end

-- optionaler Alias: falls irgendwo noch |main aufgerufen wird
p.main = p.render

return p