Modul:Personendaten

Aus NordhausenWiki

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

local p = {}

-- Hilfsfunktion: Prüft ob Parameter leer ist
local function isEmpty(s)
    return s == nil or s == '' or s == false
end

-- Hilfsfunktion: Holt Parameter mit Fallback auf GROSSBUCHSTABEN
local function getParam(args, name, nameAlt)
    local value = args[name]
    if isEmpty(value) and nameAlt then
        value = args[nameAlt]
    end
    return value
end

-- Hauptfunktion für Infobox
function p.infobox(frame)
    local args = frame:getParent().args
    
    -- Parameter auslesen
    local vornamen = getParam(args, 'vornamen', 'VORNAMEN') or ''
    local nachname = getParam(args, 'nachname', 'NACHNAME') or ''
    local bild = getParam(args, 'bild', 'BILD')
    local bildalt = getParam(args, 'bildalt', 'BILDALT') or (vornamen .. ' ' .. nachname)
    local bildbeschreibung = getParam(args, 'bildbeschreibung', 'BILDBESCHREIBUNG')
    local alternativnamen = getParam(args, 'alternativnamen', 'ALTERNATIVNAMEN')
    local geburtsdatum = getParam(args, 'geburtsdatum', 'GEBURTSDATUM')
    local geburtsort = getParam(args, 'geburtsort', 'GEBURTSORT')
    local sterbedatum = getParam(args, 'sterbedatum', 'STERBEDATUM')
    local sterbeort = getParam(args, 'sterbeort', 'STERBEORT')
    local kurzbeschreibung = getParam(args, 'kurzbeschreibung', 'KURZBESCHREIBUNG')
    local sonstiges = getParam(args, 'sonstiges', 'SONSTIGES')
    local commons = getParam(args, 'commons', 'COMMONS')
    local dbndh = getParam(args, 'dbndh', 'DbNDH')
    local wikidata = getParam(args, 'wikidata', 'WIKIDATA')
    local pnd = getParam(args, 'pnd', 'PND')
    local sortierung = getParam(args, 'sortierung', 'SORTIERUNG')
    local person = getParam(args, 'person', 'PERSON')
    
    -- HTML-Builder erstellen
    local html = mw.html.create('div'):addClass('person-infobox')
    
    -- Header (Name)
    html:tag('div')
        :addClass('person-header')
        :wikitext(vornamen .. ' ' .. nachname)
    
    -- Bild
    local kategorien = {}
    if not isEmpty(bild) then
        local bildContainer = html:tag('div'):addClass('person-bild-container')
        local bildLower = string.lower(bild)
        local isExtern = string.match(bildLower, '^https?://')
        
        if isExtern then
            bildContainer:wikitext('[' .. bild .. ' <img src="' .. bild .. '" width="220" alt="' .. bildalt .. '" class="person-bild-extern" />]')
            table.insert(kategorien, '[[Kategorie:Personen mit externem Bild]]')
        else
            bildContainer:wikitext('[[Datei:' .. bild .. '|220px|' .. bildalt .. '|class=person-bild]]')
        end
        
        if not isEmpty(bildbeschreibung) then
            bildContainer:tag('div')
                :addClass('person-bildtext')
                :wikitext(bildbeschreibung)
        end
    else
        table.insert(kategorien, '[[Kategorie:Ohne Bild|' .. nachname .. ']]')
    end
    
    -- Alternativnamen
    if not isEmpty(alternativnamen) then
        html:tag('div')
            :addClass('person-alternativnamen')
            :wikitext(alternativnamen)
    end
    
    -- Daten-Tabelle
    local hasSterbedaten = not isEmpty(sterbedatum) or not isEmpty(sterbeort)
    if not isEmpty(geburtsdatum) or not isEmpty(geburtsort) or hasSterbedaten then
        local tabelle = html:tag('table'):addClass('person-daten')
        
        -- Geburt
        local geburtszeile = tabelle:tag('tr')
        geburtszeile:tag('th'):wikitext('Geb.')
        local geburtText = isEmpty(geburtsdatum) and 'unbekannt' or geburtsdatum
        if not isEmpty(geburtsort) then
            geburtText = geburtText .. ' in ' .. geburtsort
        end
        geburtszeile:tag('td'):wikitext(geburtText)
        
        -- Tod
        if hasSterbedaten then
            local todzeile = tabelle:tag('tr')
            todzeile:tag('th'):wikitext('Gest.')
            local todText = sterbedatum or ''
            if not isEmpty(sterbeort) then
                if not isEmpty(sterbedatum) then
                    todText = todText .. ' in '
                end
                todText = todText .. sterbeort
            end
            todzeile:tag('td'):wikitext(todText)
        end
    end
    
    -- Kurzbeschreibung
    if not isEmpty(kurzbeschreibung) then
        html:tag('div')
            :addClass('person-kurzbeschreibung')
            :wikitext(kurzbeschreibung)
    end
    
    -- Sonstiges
    if not isEmpty(sonstiges) then
        html:tag('div')
            :addClass('person-sonstiges')
            :wikitext(sonstiges)
    end
    
    -- Externe Links
    local links = {}
    if not isEmpty(commons) then
        table.insert(links, '[[Datei:Commons-logo.svg|12px|link=]] [https://commons.wikimedia.org/wiki/Category:' .. commons .. ' Commons]')
    end
    if not isEmpty(dbndh) then
        table.insert(links, 'DbNDH: [https://datenbank.nordhausen.org/wiki/Item:' .. dbndh .. ' ' .. dbndh .. ']')
    end
    if not isEmpty(wikidata) then
        table.insert(links, '[https://www.wikidata.org/wiki/' .. wikidata .. ' Wikidata]')
    end
    if not isEmpty(pnd) then
        table.insert(links, 'GND: [http://d-nb.info/gnd/' .. pnd .. ' ' .. pnd .. ']')
    end
    
    if #links > 0 then
        html:tag('div')
            :addClass('person-links')
            :wikitext(table.concat(links, ' • '))
    end
    
    -- Sortierung
    local sortKey = sortierung
    if isEmpty(sortKey) then
        sortKey = nachname
        if not isEmpty(vornamen) then
            sortKey = sortKey .. ', ' .. vornamen
        end
    end
    
    -- Kategorisierung
    table.insert(kategorien, '[[Kategorie:Person]]')
    
    -- Person vs. Autor Kategorie
    if isEmpty(person) or person == '1' or person == 'ja' or person == 'true' then
        table.insert(kategorien, '[[Kategorie:Person|' .. sortKey .. ']]')
    else
        table.insert(kategorien, '[[Kategorie:Autor|' .. sortKey .. ']]')
    end
    
    -- Ausgabe: HTML + unsichtbare Kategorien/Sortierung
    local output = tostring(html)
    
    -- Füge unsichtbare Metadaten hinzu (werden vom Parser verarbeitet, aber nicht angezeigt)
    local metadata = mw.html.create('div')
        :css('display', 'none')
        :wikitext('__DEFAULTSORT__:' .. sortKey)
    
    -- Alternativ: Verwende frame:extensionTag für unsichtbare Ausgabe
    local sortMagic = frame:preprocess('{{DEFAULTSORT:' .. sortKey .. '}}')
    
    return output .. sortMagic .. table.concat(kategorien, '')
end

return p