Modul:BündelGalerie: Unterschied zwischen den Versionen
Aus Dreamlight Valley Wiki
Freya (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Freya (Diskussion | Beiträge) 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 | -- 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 | end | ||
if not value then | |||
return nil, 'Bündel "' .. bundleKey .. '" nicht gefunden.' | |||
end | |||
return trim(value), nil | |||
end | |||
local | -- Hauptfunktion: {{#invoke:BündelGalerie|render|bundle=...}} | ||
local | 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"> | return '<span class="error">Lua-Fehler: Kein Bündel angegeben. Nutze bundle=...</span>' | ||
end | end | ||
local | -- optionaler Titel (du wolltest am Ende lieber Wiki-Überschriften -> daher default leer) | ||
local | local title = trim(args.title or "") | ||
-- optional: Badge-Ecke im GalerieElement (premium / sternenpfad) | |||
local badge = trim(args.badge or "") | |||
if | local raw, err = getBundleData(bundle) | ||
return '<span class="error"> | if err then | ||
return '<span class="error">Lua-Fehler: ' .. mw.text.nowiki(err) .. "</span>" | |||
end | end | ||
local items = splitItems( | 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 | -- optionaler Titel | ||
table.insert(out, " | if title ~= "" then | ||
table.insert(out, "==" .. title .. "==") | |||
end | end | ||
table.insert(out, | -- 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 | ||
-- GalerieElement erwartet als 1. Parameter den Dateinamen OHNE .png, | |||
title = | -- 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