Modul:BündelGalerie: Unterschied zwischen den Versionen

Aus Dreamlight Valley Wiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 5: Zeile 5:
if not s then return "" end
if not s then return "" end
return mw.text.trim(tostring(s))
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
end


Zeile 41: Zeile 46:
-- holt Bündeldaten aus Vorlage:BündelDaten (Wikitext)
-- holt Bündeldaten aus Vorlage:BündelDaten (Wikitext)
local function getBundleData(bundleKey)
local function getBundleData(bundleKey)
-- bundleKey = "kuechentheke" o.ä.
-- In Vorlage:BündelDaten steht dann: kuechentheke = ...
local tpl = mw.title.new("Vorlage:BündelDaten")
local tpl = mw.title.new("Vorlage:BündelDaten")
if not tpl or not tpl.exists then
if not tpl or not tpl.exists then
Zeile 49: Zeile 52:


local content = tpl:getContent() or ""
local content = tpl:getContent() or ""
-- Muster: key = value  (wir erlauben Leerzeichen)
bundleKey = trim(bundleKey)
-- value geht bis Zeilenende
local pattern = "%f[%w_]" .. mw.ustring.gsub(bundleKey, "([^%w_])", "%%%1") .. "%f[^%w_]%s*=%s*(.-)\n"
local value = mw.ustring.match(content .. "\n", pattern)


if not value then
-- Robust: Zeilenanfang + Key (auch mit Leerzeichen/"") + optional spaces + = + value bis Zeilenende
-- als Fallback: letzte Zeile ohne \n am Ende
local keyEsc = escapeLuaPattern(bundleKey)
pattern = "%f[%w_]" .. mw.ustring.gsub(bundleKey, "([^%w_])", "%%%1") .. "%f[^%w_]%s*=%s*(.+)$"
local pattern = "\n%s*" .. keyEsc .. "%s*=%s*(.-)%s*\n"
value = mw.ustring.match(content, pattern)
local value = mw.ustring.match("\n" .. content .. "\n", pattern)
end


if not value then
if not value then
Zeile 71: Zeile 70:
local args = frame.args or {}
local args = frame.args or {}
local parent = frame:getParent()
local parent = frame:getParent()
-- Parent-Args übernehmen (für Aufruf über Vorlage)
if parent and parent.args then
if parent and parent.args then
-- Parent-Args überschreiben/ergänzen (damit du es in Vorlagen nutzen kannst)
for k, v in pairs(parent.args) do
for k, v in pairs(parent.args) do
if args[k] == nil or args[k] == "" then
if args[k] == nil or args[k] == "" then
Zeile 85: Zeile 85:
end
end


-- optionaler Titel (du wolltest am Ende lieber Wiki-Überschriften -> daher default leer)
-- optionaler Titel (Wiki-Überschrift)
local title = trim(args.title or "")
local title = trim(args.title or "")
-- optional: Badge-Ecke im GalerieElement (premium / sternenpfad)
-- optional: Badge-Ecke im GalerieElement (premium / sternenpfad)
Zeile 107: Zeile 107:
end
end


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


for _, item in ipairs(items) do
for _, item in ipairs(items) do
-- GalerieElement erwartet als 1. Parameter den Dateinamen OHNE .png,
-- GalerieElement erwartet als 1. Parameter den Dateinamen OHNE .png
-- weil dein Template selbst ".png" anhängt.
local imageBase = item.image:gsub("%.png$", "")
local imageBase = item.image:gsub("%.png$", "")
local wikitext = frame:expandTemplate{
local wikitext = frame:expandTemplate{
Zeile 129: Zeile 128:
return table.concat(out, "\n")
return table.concat(out, "\n")
end
end
-- optionaler Alias: falls irgendwo noch |main aufgerufen wird
p.main = p.render


return p
return p

Version vom 24. Februar 2026, 17:24 Uhr

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 GalerieElement (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
		-- GalerieElement erwartet als 1. Parameter den Dateinamen OHNE .png
		local imageBase = item.image:gsub("%.png$", "")
		local wikitext = frame:expandTemplate{
			title = "GalerieElement",
			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