Zum Inhalt springen

Modul:NeoWiki/API

aus AufEinWort, der freien Forschung
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 1. November 2026 um 19:36 Uhr durch Nikolaos (Diskussion | Beiträge) (Nikolaos änderte das Inhaltsmodell der Seite Modul:NeoWiki/API von „Wikitext“ nach „Scribunto-Modul“). Sie kann sich erheblich von der aktuellen Version unterscheiden.

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

-- Testfassung: nutzt die live bestätigte NeoWikiBaseBridge 0.9.0-test.
local p = {}

local function backend()
    return require('mw.neowiki')
end

local function scalar(value)
    if type(value) == 'boolean' then return value and 'ja' or 'nein' end
    if type(value) == 'number' then return tostring(value) end
    if type(value) == 'string' then return value end
    error('NeoWiki/API: Nicht unterstützter Werttyp.', 0)
end

function p.collect(options)
    options = options or {}
    if options.page and options.subject then
        error('NeoWiki/API: Seite oder Subjekt angeben, nicht beides.', 0)
    end
    local nw = backend()
    local subject = options.subject and nw.getSubject(options.subject)
        or (not options.subject and nw.getMainSubject(options.page))
    if not subject then return { fields = {}, missing = true } end
    local schema = nw.getSchema(subject.schema)
    if not schema then error('NeoWiki/API: Schema ist nicht verfügbar.', 0) end
    local selected, needsExternal = {}, false
    local found = false
    for _, definition in ipairs(schema.properties or {}) do
        if (not options.field or options.field == definition.name)
            and (options.includeImages or definition.type ~= 'image') then
            found = true
            selected[#selected + 1] = definition
            if definition.externalProperty then needsExternal = true end
        end
    end
    if options.field and not found then
        error('NeoWiki/API: Feld nicht im Schema gefunden: ' .. options.field, 0)
    end
    local external = {}
    if needsExternal and options.origin ~= 'own' then
        local bridge = require('mw.neowikibase')
        if type(bridge.getFields) ~= 'function' then
            error('NeoWiki/API: Die Lua-Anbindung für abgerufene P-Werte fehlt noch. '
                .. 'Es wurden keine SMW-Werte gesetzt.', 0)
        end
        -- Strukturierte Werte der installierten Bridge, keine HTML-Ausgabe.
        -- PHP prüft Leserechte, Seiten-/Subjektbezug und Quellenzuordnung.
        local result = bridge.getFields({ page = options.page,
            subject = subject.id, language = options.language })
        if type(result) ~= 'table' or result.version ~= 1
            or result.scope ~= 'current' or result.mainSubjectId ~= subject.id then
            error('NeoWiki/API: Ungültige Antwort der P-Wert-Schnittstelle.', 0)
        end
        for _, field in ipairs(result.fields or {}) do external[field.name] = field end
    end
    local fields = {}
    for _, definition in ipairs(selected) do
        local field = { name = definition.name, type = definition.type,
            externalProperty = definition.externalProperty, values = {} }
        local seen = {}
        local function add(text, origin, metadata)
            text = scalar(text)
            if text ~= '' then
                field.values[#field.values + 1] = {
                    value = text, origin = origin, metadata = metadata,
                    duplicate = seen[text] or false }
                seen[text] = true
            end
        end
        if options.origin ~= 'external' then
            for _, value in ipairs(nw.getAll(definition.name, { subject = subject.id }) or {}) do
                add(value, 'own')
            end
        end
        if definition.externalProperty and options.origin ~= 'own' then
            local remote = external[definition.name]
            if not remote or (remote.status ~= 'resolved' and remote.status ~= 'missing') then
                error('NeoWiki/API: Abgerufene Werte für „' .. definition.name
                    .. '“ sind nicht zuverlässig verfügbar.', 0)
            end
            if remote.source ~= definition.externalProperty.source
                or remote.propertyId ~= definition.externalProperty.id then
                error('NeoWiki/API: Quellenzuordnung stimmt nicht überein.', 0)
            end
            for _, value in ipairs(remote.values or {}) do
                -- Bilder bleiben im ersten Durchlauf ausgeschlossen.
                -- Unbekannte/fehlende Werte werden nicht als Text annotiert.
                if value.kind == 'entity' then
                    if not value.label or value.label == '' or value.label == value.id then
                        error('NeoWiki/API: Aufgelöste Wertbezeichnung fehlt.', 0)
                    end
                    add(value.label, remote.source, value)
                elseif value.kind ~= 'somevalue' and value.kind ~= 'novalue' then
                    error('NeoWiki/API: Nicht unterstützter abgerufener Wert.', 0)
                end
            end
        end
        fields[#fields + 1] = field
    end
    return { subject = subject, schema = schema, fields = fields }
end

return p