Modul:ZauberNachGrad: Unterschied zwischen den Versionen

Aus Splitterwiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
--[[
--[[
Erstellt eine tabellarische Übersicht aller Zauber einer Magieschule,
Erstellt eine tabellarische Übersicht aller Zauber einer Magieschule,
gruppiert nach Zaubergrad mit Vorschaubild, Titel, Kurzbeschreibung und weiteren Eigenschaften.
gruppiert nach Zaubergrad mit Vorschaubild, Titel, Kurzbeschreibung, Eigenschaften und Quellenangaben.


getSpellList – holt die Daten.
getSpellList – holt die Daten.
Zeile 33: Zeile 33:
end
end


-- Gibt die Tabellenansicht mit Vorschaubild, Titel, Beschreibung und weiteren Attributen aus
-- Gibt die Tabellenansicht aus
function p.renderSpellList(frame)
function p.renderSpellList(frame)
     local spellsByGrad = p.getSpellList(frame)
     local spellsByGrad = p.getSpellList(frame)
Zeile 52: Zeile 52:
     table.insert(output, string.format('<h2>%d Zauber der Magieschule %s</h2>', totalCount, schuleArg))
     table.insert(output, string.format('<h2>%d Zauber der Magieschule %s</h2>', totalCount, schuleArg))
     table.insert(output, '<table class="wikitable">')
     table.insert(output, '<table class="wikitable">')
     table.insert(output, '<tr><th>Bild</th><th>Titel</th><th>Beschreibung</th><th>Typus</th><th>Art</th><th>Schwierigkeit</th><th>Option</th><th>Weitere Magieschulen</th></tr>')
     table.insert(output, '<tr><th>Bild</th><th>Titel</th><th>Beschreibung</th><th>Typus</th><th>Art</th><th>Schwierigkeit</th><th>Option</th><th>Weitere Magieschulen</th><th>Quellen</th></tr>')


     -- Hilfsfunktion zur sicheren Stringausgabe
     -- Hilfsfunktion zur sicheren Stringausgabe
Zeile 84: Zeile 84:
         local spells = spellsByGrad[grad]
         local spells = spellsByGrad[grad]
         if spells and #spells > 0 then
         if spells and #spells > 0 then
             table.insert(output, string.format('<tr><th colspan="8">Zaubergrad %d</th></tr>', grad))
             table.insert(output, string.format('<tr><th colspan="9">Zaubergrad %d</th></tr>', grad))
             for _, spell in ipairs(spells) do
             for _, spell in ipairs(spells) do
                 local title = spell["Seitentitel"] or "Unbenannt"
                 local title = spell["Seitentitel"] or "Unbenannt"
Zeile 99: Zeile 99:
                 local option = safeString(spell["Zauberoption"])
                 local option = safeString(spell["Zauberoption"])


                 -- Andere Magieschulen herausfiltern
                 -- Weitere Magieschulen
                 local magieschulen = spell["Magieschule"]
                 local magieschulen = spell["Magieschule"]
                 local weitere = {}
                 local weitere = {}
Zeile 114: Zeile 114:
                 end
                 end
                 local schuleAnzeigen = (#weitere > 0) and table.concat(weitere, ", ") or "–"
                 local schuleAnzeigen = (#weitere > 0) and table.concat(weitere, ", ") or "–"
                -- Quellen ermitteln aus Unterobjekten
                local quellenQuery = string.format(
                    '[[Hat Unterobjekt::%s#*]][[Subobject Type::Quellenverzeichnis]]|?Publikation|?Quelleninformationen|limit=10',
                    title
                )
                local quellenResult = mw.smw.ask(quellenQuery)
                local quellen = {}
                if quellenResult then
                    for _, eintrag in ipairs(quellenResult) do
                        local pub = safeString(eintrag["Publikation"])
                        local seite = safeString(eintrag["Quelleninformationen"])
                        if pub ~= "–" and seite ~= "–" then
                            table.insert(quellen, string.format("%s S.&nbsp;%s", pub, seite))
                        end
                    end
                end
                local quellenText = (#quellen > 0) and table.concat(quellen, "<br>") or "–"


                 table.insert(output, string.format(
                 table.insert(output, string.format(
                     '<tr><td>%s</td><td>[[%s]]</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>',
                     '<tr><td>%s</td><td>[[%s]]</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>',
                     imageTag, title, description, typus, art, schwierigkeit, option, schuleAnzeigen
                     imageTag, title, description, typus, art, schwierigkeit, option, schuleAnzeigen, quellenText
                 ))
                 ))
             end
             end

Version vom 16. Mai 2025, 09:11 Uhr

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

--[[
Erstellt eine tabellarische Übersicht aller Zauber einer Magieschule,
gruppiert nach Zaubergrad mit Vorschaubild, Titel, Kurzbeschreibung, Eigenschaften und Quellenangaben.

getSpellList – holt die Daten.
renderSpellList – rendert die HTML-Ausgabe als Tabelle.

Verwendung:
{{#invoke:ZauberNachGrad|renderSpellList|Schule=Kampfmagie}}
--]]

local p = {}

-- Holt alle Zauber einer Magieschule, gruppiert nach Grad
function p.getSpellList(frame)
    local schule = frame.args['Schule']
    if not schule then return nil end

    local spellData = {}

    for grad = 0, 5 do
        local query = string.format(
            '[[Category::Zauber]][[%s::%d]]|?Seitentitel|?Kurzbeschreibung|?Profilbild|?Zaubertypus|?Zauberart|?Zauberschwierigkeit|?Zauberoption|?Magieschule|mainlabel=-|limit=199',
            schule, grad
        )
        local result = mw.smw.ask(query)
        if result then
            spellData[grad] = result
        end
    end

    return spellData
end

-- Gibt die Tabellenansicht aus
function p.renderSpellList(frame)
    local spellsByGrad = p.getSpellList(frame)
    if not spellsByGrad then
        return "Keine Zauber gefunden."
    end

    local output = {}
    local totalCount = 0
    for grad = 0, 5 do
        local spells = spellsByGrad[grad]
        if spells then
            totalCount = totalCount + #spells
        end
    end

    local schuleArg = frame.args["Schule"] or "Unbekannt"
    table.insert(output, string.format('<h2>%d Zauber der Magieschule %s</h2>', totalCount, schuleArg))
    table.insert(output, '<table class="wikitable">')
    table.insert(output, '<tr><th>Bild</th><th>Titel</th><th>Beschreibung</th><th>Typus</th><th>Art</th><th>Schwierigkeit</th><th>Option</th><th>Weitere Magieschulen</th><th>Quellen</th></tr>')

    -- Hilfsfunktion zur sicheren Stringausgabe
    local function safeString(value)
        if type(value) == "table" then
            local parts = {}
            for _, v in ipairs(value) do
                if type(v) == "table" and v.text then
                    table.insert(parts, v.text)
                else
                    table.insert(parts, tostring(v))
                end
            end
            return table.concat(parts, ", ")
        elseif value and value ~= "" then
            if type(value) == "table" and value.text then
                return value.text
            end
            return tostring(value)
        else
            return "–"
        end
    end

    -- Vergleichsbereinigung
    local function clean(str)
        return mw.ustring.lower(mw.text.trim(tostring(str)))
    end

    for grad = 0, 5 do
        local spells = spellsByGrad[grad]
        if spells and #spells > 0 then
            table.insert(output, string.format('<tr><th colspan="9">Zaubergrad %d</th></tr>', grad))
            for _, spell in ipairs(spells) do
                local title = spell["Seitentitel"] or "Unbenannt"
                local description = spell["Kurzbeschreibung"] or ""
                local image = spell["Profilbild"]
                if not image or image == "" then
                    image = "Icon_Vorlage_Platzhalter_dunkel_64.png"
                end
                local imageTag = string.format('[[Datei:%s|50px]]', image)

                local typus = safeString(spell["Zaubertypus"])
                local art = safeString(spell["Zauberart"])
                local schwierigkeit = safeString(spell["Zauberschwierigkeit"])
                local option = safeString(spell["Zauberoption"])

                -- Weitere Magieschulen
                local magieschulen = spell["Magieschule"]
                local weitere = {}
                if magieschulen then
                    if type(magieschulen) ~= "table" then
                        magieschulen = { magieschulen }
                    end
                    for _, s in ipairs(magieschulen) do
                        local label = (type(s) == "table" and s.text) or tostring(s)
                        if clean(label) ~= clean(schuleArg) then
                            table.insert(weitere, label)
                        end
                    end
                end
                local schuleAnzeigen = (#weitere > 0) and table.concat(weitere, ", ") or "–"

                -- Quellen ermitteln aus Unterobjekten
                local quellenQuery = string.format(
                    '[[Hat Unterobjekt::%s#*]][[Subobject Type::Quellenverzeichnis]]|?Publikation|?Quelleninformationen|limit=10',
                    title
                )
                local quellenResult = mw.smw.ask(quellenQuery)
                local quellen = {}
                if quellenResult then
                    for _, eintrag in ipairs(quellenResult) do
                        local pub = safeString(eintrag["Publikation"])
                        local seite = safeString(eintrag["Quelleninformationen"])
                        if pub ~= "–" and seite ~= "–" then
                            table.insert(quellen, string.format("%s S.&nbsp;%s", pub, seite))
                        end
                    end
                end
                local quellenText = (#quellen > 0) and table.concat(quellen, "<br>") or "–"

                table.insert(output, string.format(
                    '<tr><td>%s</td><td>[[%s]]</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>',
                    imageTag, title, description, typus, art, schwierigkeit, option, schuleAnzeigen, quellenText
                ))
            end
        end
    end

    table.insert(output, '</table>')
    return table.concat(output, '\n')
end

return p