Modul:ZauberNachGrad: Unterschied zwischen den Versionen

Aus Splitterwiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(27 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 und Kurzbeschreibung.
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:Modulname|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|mainlabel=-|limit=199',
             '[[Category::Zauber]][[%s::%d]]' ..
            '|?Seitentitel|?Kurzbeschreibung|?Profilbild|?Zaubertypus|?Zauberart|?Zauberschwierigkeit|?Zauberoption|?Magieschule' ..
            '|mainlabel=-|limit=199',
             schule, grad
             schule, grad
         )
         )
Zeile 34: Zeile 49:
end
end


-- Gibt die Tabellenansicht mit Vorschaubild, Titel, Beschreibung 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."
 
    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
     end


     local output = {}
     -- 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, '<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
     for grad = 0, 5 do
         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="3">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 ""
                 local image = spell["Profilbild"]
                 local image = spell["Profilbild"]
if not image or image == "" then
                if not image or image == "" then
    image = "Icon_Vorlage_Platzhalter_dunkel_64.png"
                    image = "Icon_Vorlage_Platzhalter_dunkel_64.png"
end
                end
                 local imageTag = image ~= "" and string.format('[[Datei:%s|50px]]', image) or ""
                 local imageTag = string.format('[[Datei:%s|50px]]', image)
                 table.insert(output, string.format('<tr><td>%s</td><td>[[%s]]</td><td>%s</td></tr>', imageTag, title, description))
 
                -- 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
         end
     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