Modul:ZauberNachGrad: Unterschied zwischen den Versionen

Aus Splitterwiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
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, Eigenschaften und Quellenangaben.
gruppiert nach Zaubergrad mit Vorschaubild, Titel, Kurzbeschreibung und weiteren Eigenschaften.


getSpellList – holt die Daten.
Dieses Modul ist in zwei Hauptfunktionen unterteilt:
renderSpellList – rendert die HTML-Ausgabe als Tabelle.
 
1. getSpellList – Fragt die Daten mit Semantic MediaWiki (SMW) ab und strukturiert sie nach Zaubergrad.
2. renderSpellList – Wandelt diese Daten in eine HTML-Tabelle um und gibt sie aus.


Verwendung:
Verwendung:
{{#invoke:ZauberNachGrad|renderSpellList|Schule=Kampfmagie}}
{{#invoke:ZauberNachGrad|renderSpellList|Schule=Kampfmagie}}
Erforderlich ist ein gültiger Wert für den Parameter „Schule“, z. B. Kampfmagie oder Feuermagie.
--]]
--]]
-- Wir binden ein separates Modul ein, das sich um die Anzeige der Quellen kümmert
local QuellenModul = require('Modul:Quelleninformationen')


local p = {}
local p = {}


-- Holt alle Zauber einer Magieschule, gruppiert nach Grad
---------------------------------------------------------
-- Funktion: getSpellList(frame)
-- Diese Funktion holt alle Zauber einer bestimmten Magieschule.
-- Die Abfrage erfolgt getrennt für jeden Zaubergrad (0–5).
-- Rückgabe ist ein Lua-Array mit SMW-Ergebnissen je Grad.
---------------------------------------------------------
function p.getSpellList(frame)
function p.getSpellList(frame)
     local schule = frame.args['Schule']
     local schule = frame.args['Schule']
     if not schule then return nil end
     if not schule then return nil end -- Wenn keine Schule angegeben ist, abbrechen


     local spellData = {}
     local spellData = {}


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


-- Gibt die Tabellenansicht aus
---------------------------------------------------------
-- Funktion: renderSpellList(frame)
-- Diese Funktion nimmt die gruppierten Zauberlisten (von getSpellList),
-- erzeugt eine HTML-Tabelle und gibt sie als String zurück.
---------------------------------------------------------
function p.renderSpellList(frame)
function p.renderSpellList(frame)
    local schuleFilter = frame.args['Schule']
    if not schuleFilter then return "Fehlender Parameter: Schule" end
     local spellsByGrad = p.getSpellList(frame)
     local spellsByGrad = p.getSpellList(frame)
     if not spellsByGrad then
     if not spellsByGrad then return "Keine Zauber gefunden." end
        return "Keine Zauber gefunden."
    end


     local output = {}
     local output = {}
     local totalCount = 0
     local totalCount = 0
    -- Zählen, wie viele Zauber insgesamt gefunden wurden
     for grad = 0, 5 do
     for grad = 0, 5 do
         local spells = spellsByGrad[grad]
         local spells = spellsByGrad[grad]
Zeile 49: Zeile 72:
     end
     end


     local schuleArg = frame.args["Schule"] or "Unbekannt"
     -- Einleitung: Überschrift mit Gesamtanzahl
     table.insert(output, string.format('<h2>%d Zauber der Magieschule %s</h2>', totalCount, schuleArg))
     table.insert(output, string.format('<h2>%d Zauber der Magieschule</h2>', totalCount))
 
    -- Beginn der Tabelle mit Spaltenüberschriften
     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><th>Quellen</th></tr>')
     table.insert(output,
 
        '<tr>' ..
     -- Hilfsfunktion zur sicheren Stringausgabe
        '<th>Bild</th><th>Titel</th><th>Beschreibung</th><th>Typus</th>' ..
    local function safeString(value)
        '<th>Art</th><th>Schwierigkeit</th><th>Option</th>' ..
        if type(value) == "table" then
        '<th>Weitere Magieschulen</th><th>Quelle</th>' ..
            local parts = {}
        '</tr>'
            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


    -- Für jeden Zaubergrad: Untertitel + Einträge
     for grad = 0, 5 do
     for grad = 0, 5 do
         local spells = spellsByGrad[grad]
         local spells = spellsByGrad[grad]
Zeile 86: Zeile 91:
             table.insert(output, string.format('<tr><th colspan="9">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
                -- Basisdaten
                 local title = spell["Seitentitel"] or "Unbenannt"
                 local title = spell["Seitentitel"] or "Unbenannt"
                 local description = spell["Kurzbeschreibung"] or ""
                 local description = spell["Kurzbeschreibung"] or ""
Zeile 93: Zeile 99:
                 end
                 end
                 local imageTag = string.format('[[Datei:%s|50px]]', image)
                 local imageTag = string.format('[[Datei:%s|50px]]', image)
                -- Hilfsfunktion zum normierten Anzeigen von SMW-Werten
                local function safeString(value)
                    if type(value) == "table" then
                        return table.concat(value, ", ")
                    elseif value and value ~= "" then
                        return value
                    else
                        return "–"
                    end
                end


                 local typus = safeString(spell["Zaubertypus"])
                 local typus = safeString(spell["Zaubertypus"])
Zeile 99: Zeile 116:
                 local option = safeString(spell["Zauberoption"])
                 local option = safeString(spell["Zauberoption"])


                 -- Weitere Magieschulen
                 -- Weitere Magieschulen anzeigen (die nicht der aktuellen entsprechen)
                 local magieschulen = spell["Magieschule"]
                 local magieschule = spell["Magieschule"]
                 local weitere = {}
                 local schuleAnzeigen = "–"
                 if magieschulen then
                 if magieschule then
                     if type(magieschulen) ~= "table" then
                     if type(magieschule) == "table" then
                         magieschulen = { magieschulen }
                         local andere = {}
                    end
                        for _, s in ipairs(magieschule) do
                    for _, s in ipairs(magieschulen) do
                            local clean = function(str)
                        local label = (type(s) == "table" and s.text) or tostring(s)
                                return mw.ustring.lower( mw.text.trim( mw.ustring.gsub(str, '[%c%s]+', '') ) )
                        if clean(label) ~= clean(schuleArg) then
                            end
                             table.insert(weitere, label)
                            if clean(s) ~= clean(schuleFilter) then
                                table.insert(andere, s)
                             end
                        end
                        if #andere > 0 then
                            schuleAnzeigen = table.concat(andere, ", ")
                         end
                         end
                    elseif mw.ustring.lower(mw.text.trim(magieschule)) ~= mw.ustring.lower(mw.text.trim(schuleFilter)) then
                        schuleAnzeigen = magieschule
                     end
                     end
                 end
                 end
                local schuleAnzeigen = (#weitere > 0) and table.concat(weitere, ", ") or "–"


                 -- Quellen ermitteln aus Unterobjekten
                 -- Quellen mit externer Modulhilfe holen
                 local quellenQuery = string.format(
                 local quellenAnzeigen = QuellenModul.getQuellen({ args = { Pagename = title } }) or "–"
                    '[[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 "–"


                -- Zeile zur Tabelle hinzufügen
                 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><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, quellenText
                     imageTag, title, description, typus, art, schwierigkeit, option, schuleAnzeigen, quellenAnzeigen
                 ))
                 ))
             end
             end
Zeile 141: Zeile 150:
     end
     end


    -- Tabelle abschließen
     table.insert(output, '</table>')
     table.insert(output, '</table>')
     return table.concat(output, '\n')
     return table.concat(output, '\n')

Aktuelle Version vom 16. Mai 2025, 09:37 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 und weiteren Eigenschaften.

Dieses Modul ist in zwei Hauptfunktionen unterteilt:

1. getSpellList – Fragt die Daten mit Semantic MediaWiki (SMW) ab und strukturiert sie nach Zaubergrad.
2. renderSpellList – Wandelt diese Daten in eine HTML-Tabelle um und gibt sie aus.

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

Erforderlich ist ein gültiger Wert für den Parameter „Schule“, z. B. Kampfmagie oder Feuermagie.
--]]

-- Wir binden ein separates Modul ein, das sich um die Anzeige der Quellen kümmert
local QuellenModul = require('Modul:Quelleninformationen')

local p = {}

---------------------------------------------------------
-- Funktion: getSpellList(frame)
-- Diese Funktion holt alle Zauber einer bestimmten Magieschule.
-- Die Abfrage erfolgt getrennt für jeden Zaubergrad (0–5).
-- Rückgabe ist ein Lua-Array mit SMW-Ergebnissen je Grad.
---------------------------------------------------------
function p.getSpellList(frame)
    local schule = frame.args['Schule']
    if not schule then return nil end -- Wenn keine Schule angegeben ist, abbrechen

    local spellData = {}

    -- Für jeden Grad separat abfragen
    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

---------------------------------------------------------
-- Funktion: renderSpellList(frame)
-- Diese Funktion nimmt die gruppierten Zauberlisten (von getSpellList),
-- erzeugt eine HTML-Tabelle und gibt sie als String zurück.
---------------------------------------------------------
function p.renderSpellList(frame)
    local schuleFilter = frame.args['Schule']
    if not schuleFilter then return "Fehlender Parameter: Schule" end

    local spellsByGrad = p.getSpellList(frame)
    if not spellsByGrad then return "Keine Zauber gefunden." end

    local output = {}
    local totalCount = 0

    -- Zählen, wie viele Zauber insgesamt gefunden wurden
    for grad = 0, 5 do
        local spells = spellsByGrad[grad]
        if spells then
            totalCount = totalCount + #spells
        end
    end

    -- Einleitung: Überschrift mit Gesamtanzahl
    table.insert(output, string.format('<h2>%d Zauber der Magieschule</h2>', totalCount))

    -- Beginn der Tabelle mit Spaltenüberschriften
    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>Quelle</th>' ..
        '</tr>'
    )

    -- Für jeden Zaubergrad: Untertitel + Einträge
    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
                -- Basisdaten
                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)

                -- Hilfsfunktion zum normierten Anzeigen von SMW-Werten
                local function safeString(value)
                    if type(value) == "table" then
                        return table.concat(value, ", ")
                    elseif value and value ~= "" then
                        return value
                    else
                        return "–"
                    end
                end

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

                -- Weitere Magieschulen anzeigen (die nicht der aktuellen entsprechen)
                local magieschule = spell["Magieschule"]
                local schuleAnzeigen = "–"
                if magieschule then
                    if type(magieschule) == "table" then
                        local andere = {}
                        for _, s in ipairs(magieschule) do
                            local clean = function(str)
                                return mw.ustring.lower( mw.text.trim( mw.ustring.gsub(str, '[%c%s]+', '') ) )
                            end
                            if clean(s) ~= clean(schuleFilter) then
                                table.insert(andere, s)
                            end
                        end
                        if #andere > 0 then
                            schuleAnzeigen = table.concat(andere, ", ")
                        end
                    elseif mw.ustring.lower(mw.text.trim(magieschule)) ~= mw.ustring.lower(mw.text.trim(schuleFilter)) then
                        schuleAnzeigen = magieschule
                    end
                end

                -- Quellen mit externer Modulhilfe holen
                local quellenAnzeigen = QuellenModul.getQuellen({ args = { Pagename = title } }) or "–"

                -- Zeile zur Tabelle hinzufügen
                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, quellenAnzeigen
                ))
            end
        end
    end

    -- Tabelle abschließen
    table.insert(output, '</table>')
    return table.concat(output, '\n')
end

return p