Zum Inhalt springen

Modul:Steckbrief

Aus OBS Wiki
Version vom 28. September 2026, 11:35 Uhr von MINERVA-Ecks (Diskussion | Beiträge) (Neu: Lua-Modul fuer Vorlage:Steckbrief (Wertepaare oder Spalten mit spalten=/ecke=))
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

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

-- Modul:Steckbrief
-- Erzeugt den Steckbrief fuer Vorlage:Steckbrief.
--
-- Ohne spalten=:  Paare aus Merkmal und Wert        {{Steckbrief|Format|openTRANS 2.1|Weg|FTP-Job}}
-- Mit spalten=:   Merkmal + ein Wert je Spalte     {{Steckbrief|spalten=A;B|Format|Text|XML|Weg|FTP-Job|FTP-Job}}
--                 ecke= beschriftet die Ecke der Kopfzeile, z.B. ecke=Datenuebertragungsart
--
-- Gleiche Nachbarwerte einer Zeile werden zu einer Zelle zusammengefasst (colspan),
-- damit die Unterschiede zwischen den Varianten sofort sichtbar sind.
-- Passt die Anzahl der Werte nicht zur Spaltenzahl, erscheint eine Fehlermeldung,
-- statt dass sich alle folgenden Zeilen still verschieben.

local p = {}

local function trim(s)
    return mw.text.trim(s or '')
end

function p.main(frame)
    local args = frame:getParent().args

    local titel = trim(args.titel)
    if titel == '' then
        titel = 'Steckbrief'
    end

    local spalten = {}
    if trim(args.spalten) ~= '' then
        for s in mw.text.gsplit(args.spalten, ';', true) do
            s = trim(s)
            if s ~= '' then
                table.insert(spalten, s)
            end
        end
    end
    local breite = math.max(#spalten, 1)

    -- Unbenannte Parameter in Reihenfolge einsammeln
    local werte = {}
    local i = 1
    while args[i] ~= nil do
        table.insert(werte, trim(args[i]))
        i = i + 1
    end

    local tabelle = mw.html.create('table'):addClass('obs-steckbrief')
    if #spalten > 0 then
        tabelle:addClass('obs-steckbrief-spalten')
    end
    tabelle:tag('caption'):wikitext(titel)

    if #spalten > 0 then
        local kopf = tabelle:tag('tr'):addClass('obs-steckbrief-kopf')
        local ecke = trim(args.ecke)
        local eckzelle = kopf:tag('th'):addClass('obs-steckbrief-ecke')
        if ecke == '' then
            eckzelle:addClass('obs-steckbrief-ecke-leer')
        else
            eckzelle:attr('scope', 'col'):wikitext(ecke)
        end
        for _, s in ipairs(spalten) do
            kopf:tag('th'):attr('scope', 'col'):wikitext(s)
        end
    end

    local schritt = breite + 1
    local zeilen = math.floor(#werte / schritt)
    for z = 0, zeilen - 1 do
        local basis = z * schritt
        local merkmal = werte[basis + 1]
        if merkmal ~= '' then
            local tr = tabelle:tag('tr')
            tr:tag('th'):attr('scope', 'row'):wikitext(merkmal)
            local k = 1
            while k <= breite do
                local wert = werte[basis + 1 + k]
                local span = 1
                while k + span <= breite and werte[basis + 1 + k + span] == wert do
                    span = span + 1
                end
                local td = tr:tag('td'):wikitext(wert)
                if span > 1 then
                    td:attr('colspan', span):addClass('obs-steckbrief-gemeinsam')
                end
                k = k + span
            end
        end
    end

    local ausgabe = tostring(tabelle)
    if #werte % schritt ~= 0 then
        ausgabe = ausgabe .. '<strong class="error">Steckbrief: Die Zahl der Werte passt nicht zu '
            .. breite .. ' Spalte(n) – je Merkmal ' .. breite .. ' Wert(e) angeben.</strong>'
    end
    return ausgabe
end

return p