Modul:ZauberNachGrad: Unterschied zwischen den Versionen

Aus Splitterwiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(30 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
--[[
--[[
Zauberliste-Modul für Splitterwiki
Erstellt eine tabellarische Übersicht aller Zauber einer Magieschule,
==================================
gruppiert nach Zaubergrad mit Vorschaubild, Titel, Kurzbeschreibung und weiteren Eigenschaften.
Dieses Modul stellt zwei Funktionen bereit:


1. getSpellList(frame)
Dieses Modul ist in zwei Hauptfunktionen unterteilt:
  - Sammelt alle Zauber einer Magieschule (über Property: Schule = Grad)
  - Gibt strukturierte Lua-Tabelle zurück: spells[Grad] = {{title="", desc=""}, ...}


2. renderSpellList(frame)
1. getSpellList – Fragt die Daten mit Semantic MediaWiki (SMW) ab und strukturiert sie nach Zaubergrad.
  - Verwendet getSpellList()
2. renderSpellList – Wandelt diese Daten in eine HTML-Tabelle um und gibt sie aus.
  - Erzeugt HTML-Ausgabe mit Gradabschnitten und Link + Kurzbeschreibung


Nutzen:
Verwendung:
Diese Trennung erlaubt es, die Darstellung unabhängig von der Datenlogik anzupassen.
{{#invoke:ZauberNachGrad|renderSpellList|Schule=Kampfmagie}}


Verwendung:
Erforderlich ist ein gültiger Wert für den Parameter „Schule“, z. B. Kampfmagie oder Feuermagie.
{{#invoke:Zauberliste|renderSpellList|Schule=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 = {}


-- Gibt strukturierte Liste der Zauber zurück: { [Grad] = { {title=, desc=}, ... } }
---------------------------------------------------------
-- 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 result = {}
     local spellData = {}


    -- Für jeden Grad separat abfragen
     for grad = 0, 5 do
     for grad = 0, 5 do
        -- SMW-Abfrage: Zauber in dieser Schule mit passendem Grad
         local query = string.format(
         local query = mw.smw.ask(
             '[[Category::Zauber]][[%s::%d]]' ..
             '[[Category::Zauber]][[' .. Schule .. '::' .. grad .. ']]|?Seitentitel|?Kurzbeschreibung|mainlabel=-'
            '|?Seitentitel|?Kurzbeschreibung|?Profilbild|?Zaubertypus|?Zauberart|?Zauberschwierigkeit|?Zauberoption|?Magieschule' ..
            '|mainlabel=-|limit=199',
            schule, grad
         )
         )
        local result = mw.smw.ask(query)


         if query then
         if result then
             result[grad] = {}
             spellData[grad] = result
            for _, entry in ipairs(query) do
                table.insert(result[grad], {
                    title = entry["Seitentitel"] or "",
                    desc = entry["Kurzbeschreibung"] or ""
                })
            end
         end
         end
     end
     end


     return result
     return spellData
end
end


-- Gibt HTML-Ausgabe einer Zauberliste zurück
---------------------------------------------------------
-- 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 Schule = frame.args['Schule']
     local schuleFilter = frame.args['Schule']
     local data = p.getSpellList{ args = { Schule = Schule } }
    if not schuleFilter then return "Fehlender Parameter: Schule" end
     if not data then return "Keine Daten vorhanden oder Schule nicht definiert." 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))


     local out = '<div class="zauberliste">'
     -- Beginn der Tabelle mit Spaltenüberschriften
     out = out .. '<h2>Zauber der ' .. mw.text.nowiki(Schule) .. '</h2>'
    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
         out = out .. '<h3>Zaubergrad ' .. grad .. '</h3>'
         local spells = spellsByGrad[grad]
         if data[grad] and #data[grad] > 0 then
         if spells and #spells > 0 then
             out = out .. '<ul>'
             table.insert(output, string.format('<tr><th colspan="9">Zaubergrad %d</th></tr>', grad))
             for _, spell in ipairs(data[grad]) do
             for _, spell in ipairs(spells) do
                 out = out .. '<li>[[' .. spell.title .. ']] <small>(' .. spell.desc .. ')</small></li>'
                -- 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
            out = out .. '</ul>'
        else
            out = out .. '<i>Keine Zauber für diesen Grad.</i>'
         end
         end
     end
     end


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


return p
return p

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