Modul:BündelGalerie: Unterschied zwischen den Versionen

Aus Dreamlight Valley Wiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
local p = {}
local p = {}


-- kleine Helfer
local function trim(s)
local function trim(s)
if not s then return "" end
if not s then return "" end
Zeile 6: Zeile 7:
end
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 function splitItems(s)
local out = {}
local out = {}
if not s or s == "" then return out end
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
for part in mw.text.gsplit(s, "%s*;%s*") do
part = trim(part)
part = trim(part)
if part ~= "" then
if part ~= "" then
table.insert(out, part)
-- 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
end
end
return out
return out
end
end


local function findBundleLine(content, key)
-- holt Bündeldaten aus Vorlage:BündelDaten (Wikitext)
key = mw.ustring.lower(trim(key or ""))
local function getBundleData(bundleKey)
if key == "" then return nil end
-- bundleKey = "kuechentheke" o.ä.
-- In Vorlage:BündelDaten steht dann: kuechentheke = ...
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 ""
-- Muster: key = value  (wir erlauben Leerzeichen)
-- 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)


for line in mw.text.gsplit(content or "", "\n", true) do
if not value then
local raw = trim(line)
-- als Fallback: letzte Zeile ohne \n am Ende
if raw ~= "" and raw:sub(1,1) ~= "<" then
pattern = "%f[%w_]" .. mw.ustring.gsub(bundleKey, "([^%w_])", "%%%1") .. "%f[^%w_]%s*=%s*(.+)$"
local k, v = raw:match("^([^=]+)=%s*(.+)$")
value = mw.ustring.match(content, pattern)
if k and v then
k = mw.ustring.lower(trim(k))
if k == key then
return trim(v)
end
end
end
end
end
return nil
end


function p.main(frame)
if not value then
local args = frame:getParent() and frame:getParent().args or frame.args
return nil, 'Bündel "' .. bundleKey .. '" nicht gefunden.'
end


local bundle = trim(args[1] or args.name)
return trim(value), nil
local headline = trim(args.headline)
end


local dataPage = "Vorlage:BündelDaten"
-- Hauptfunktion: {{#invoke:BündelGalerie|render|bundle=...}}
local elementTemplate = "Galerie" -- ← Hier ggf. anpassen, falls deine Vorlage anders heißt
function p.render(frame)
local args = frame.args or {}
local parent = frame:getParent()
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
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
if bundle == "" then
return '<span class="error">BündelGalerie: Kein Bündelname angegeben.</span>'
return '<span class="error">Lua-Fehler: Kein Bündel angegeben. Nutze bundle=...</span>'
end
 
local title = mw.title.new(dataPage)
if not title then
return '<span class="error">BündelGalerie: Datenseite nicht gefunden.</span>'
end
end


local content = title:getContent() or ""
-- optionaler Titel (du wolltest am Ende lieber Wiki-Überschriften -> daher default leer)
local itemsStr = findBundleLine(content, bundle)
local title = trim(args.title or "")
-- optional: Badge-Ecke im GalerieElement (premium / sternenpfad)
local badge = trim(args.badge or "")


if not itemsStr or itemsStr == "" then
local raw, err = getBundleData(bundle)
return '<span class="error">BündelGalerie: Bündel nicht gefunden: ' .. mw.text.nowiki(bundle) .. '</span>'
if err then
return '<span class="error">Lua-Fehler: ' .. mw.text.nowiki(err) .. "</span>"
end
end


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


local out = {}
local out = {}


if headline ~= "" then
-- optionaler Titel
table.insert(out, "<div class='bundle-headline'>" .. mw.text.nowiki(headline) .. "</div>")
if title ~= "" then
table.insert(out, "==" .. title .. "==")
end
end


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


for _, item in ipairs(items) do
for _, item in ipairs(items) do
table.insert(out, frame:expandTemplate{
-- GalerieElement erwartet als 1. Parameter den Dateinamen OHNE .png,
title = elementTemplate,
-- weil dein Template selbst ".png" anhängt.
args = { item }
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
end



Version vom 24. Februar 2026, 12:46 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

-- 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)
	-- bundleKey = "kuechentheke" o.ä.
	-- In Vorlage:BündelDaten steht dann: kuechentheke = ...
	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 ""
	-- Muster: key = value  (wir erlauben Leerzeichen)
	-- 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
		-- als Fallback: letzte Zeile ohne \n am Ende
		pattern = "%f[%w_]" .. mw.ustring.gsub(bundleKey, "([^%w_])", "%%%1") .. "%f[^%w_]%s*=%s*(.+)$"
		value = mw.ustring.match(content, pattern)
	end

	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()
	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
			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 (du wolltest am Ende lieber Wiki-Überschriften -> daher default leer)
	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 (kannst du 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,
		-- weil dein Template selbst ".png" anhängt.
		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

return p