Zum Inhalt springen

„Modul:WikibaseQ“ – Versionsunterschied

aus AufEinWort, der freien Forschung
KKeine Bearbeitungszusammenfassung
KKeine Bearbeitungszusammenfassung
 
Zeile 94: Zeile 94:
end
end


local function buildVisibleSmwTable(baseRows, extraRows)
local function buildVisibleSmwTable(baseRows, extraRows, lexemeModule, lexemeData)
local c = cfg and cfg.smw and cfg.smw.Q
local c = cfg and cfg.smw and cfg.smw.Q
if not c then
if not c then
Zeile 112: Zeile 112:
end
end


if lexemeData then
        t:tag('tr'):tag('th'):attr('colspan', 2):wikitext('Q-Objekt')
    end
for _, entry in ipairs(baseRows) do
for _, entry in ipairs(baseRows) do
row(util.smwLiteral(entry.property), entry.display)
row(util.smwLiteral(entry.property), entry.display)
Zeile 119: Zeile 122:
end
end


    if lexemeData then
        lexemeModule.appendRows(t, lexemeData, 'Lexem')
    end
return tostring(t)
return tostring(t)
end
end
Zeile 133: Zeile 139:


function p.render(frame)
function p.render(frame)
local args = util.getArgs(frame)
    local args = util.getArgs(frame)
local entityId = util.detectEntityId(args)
    local qArgs = {}
if not entityId or not entityId:match('^Q%d+$') then return '' end
    for key, value in pairs(args) do
        if key ~= 'L' and key ~= 'l' and key ~= 'lexeme' then qArgs[key] = value end
    end
    local entityId = util.detectEntityId(qArgs)
    local lexemeModule, lexemeData, lexemeArgs
    if args.L and args.L ~= '' then
        lexemeModule = require('Module:WikibaseL')
        lexemeArgs = {
            L = args.L, label = args.Llabel,
            subtitle = args.Lsubtitle or 'auto', set = args.Lset or 'ja',
        }
        lexemeData = lexemeModule.collect(lexemeArgs)
        if not lexemeData then error('WikibaseQ: L enthält kein verfügbares Lexem') end
    end
    if not entityId or not entityId:match('^Q%d+$') then
        if not lexemeData then return '' end
        local result = lexemeModule.annotate(frame, lexemeArgs, lexemeData)
        if isNo(args.show) then return result end
        local t = mw.html.create('table'):addClass('aew-wb-smwtable')
        lexemeModule.appendRows(t, lexemeData)
        return result .. tostring(t)
    end


local label = args.label or util.getEntityLabelOrLemma(entityId) or entityId
local label = args.label or util.getEntityLabelOrLemma(entityId) or entityId
Zeile 147: Zeile 174:
local baseRows = getBaseRows(entityId, label, desc)
local baseRows = getBaseRows(entityId, label, desc)
local smw = util.setSmwRows(frame, baseRows) .. util.setSmwRows(frame, extraRows)
local smw = util.setSmwRows(frame, baseRows) .. util.setSmwRows(frame, extraRows)
    if lexemeData then
        smw = smw .. lexemeModule.annotate(frame, lexemeArgs, lexemeData)
    end
for _, notice in ipairs(notices) do
for _, notice in ipairs(notices) do
smw = smw .. '<span class="error">' .. util.smwLiteral(notice) .. '</span>'
smw = smw .. '<span class="error">' .. util.smwLiteral(notice) .. '</span>'
Zeile 164: Zeile 194:


-- Die äußere Vorlage liefert die Überschrift „Wikibase“.
-- Die äußere Vorlage liefert die Überschrift „Wikibase“.
local tableHtml = buildVisibleSmwTable(baseRows, extraRows)
local tableHtml = buildVisibleSmwTable(baseRows, extraRows, lexemeModule, lexemeData)
if tableHtml ~= '' then
if tableHtml ~= '' then
return smw .. tableHtml
return smw .. tableHtml

Aktuelle Version vom 20. Oktober 2026, 12:17 Uhr

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

local util = require('Module:Wikibase')
local cfg  = require('Module:Wikibase/config')

local p = {}

local function isNo(v)
	if v == nil then return false end
	local s = tostring(v):lower()
	return (s == 'nein' or s == '0' or s == 'no' or s == 'false')
end

local function buildSubtitle(args, entityId)
	-- Q: sichtbarer Untertitel = Beschreibung
	local s = args.subtitle
	if s and s ~= '' then
		s = tostring(s)
		local low = s:lower()
		if low == 'nein' or low == '0' then return nil end
		if low ~= 'ja' and low ~= 'auto' then
			return util.trim(s) -- eigener Text
		end
	end
	return util.getDescription(entityId)
end

-- Präfixe gehören zum gespeicherten Wert, nicht zum P-Label/Attributnamen.
-- Slotweise lesen, damit die Zuordnung auch bei gleichen P-Labels eindeutig ist.
local function getPrefixedStatements(entityId)
    local c = (cfg and cfg.smw and cfg.smw.Q) or {}
    local rows, notices, seen = {}, {}, {}
    for slot = 1, 6 do
        local property = util.trim(tostring(c['prop' .. slot] or ''))
        if property ~= '' and not seen[property] then
            seen[property] = true
            if not property:match('^P[1-9]%d*$') then
                notices[#notices + 1] = 'Wikibase/config: prop' .. slot ..
                    ' enthält keine gültige P-ID: ' .. property
            else
                local values, warnings = util.getConfiguredQStatements(
                    entityId, { prop1 = property })
                local prefix = tostring(c['prefix' .. slot] or '')
                for _, entry in ipairs(values) do
                    entry.value = prefix .. entry.value
                    rows[#rows + 1] = entry
                end
                for _, warning in ipairs(warnings) do
                    notices[#notices + 1] = warning
                end
            end
        end
    end
    return rows, notices
end

-- Einmal pro render auflösen; Anzeige und Annotationen verwenden dieselben Namen.
local function getBaseRows(entityId, label, desc)
    local c = cfg and cfg.smw and cfg.smw.Q
    local rows = {}
    if not c then return rows end
    local function add(setting, value, display)
        local property = util.resolveSmwPropertyName(setting)
        value = util.trim(tostring(value or '')):gsub('[\r\n]+', ' ')
        if property ~= '' and value ~= '' then
            rows[#rows + 1] = {
                property = property,
                value = value,
                display = display or util.smwLiteral(value),
            }
        end
    end
    -- SMW speichert das lokale Seitenziel, die Tabelle zeigt nur die Kennung.
    local target = util.getEntityPageTarget(entityId, cfg.entityNamespaces)
    local display = '[[:' .. target .. '|' .. entityId .. ']]'
    -- Für "Namensraum::ID"  anstelle "add(c.propArt, target, display)"
    -- dann folgend "add(c.propArt, entityId, display)" für "External identifier:ID" verwenden.
    add(c.propArt, entityId, display)
    add(c.propLabel, label)
    add(c.propDesc, desc)
    return rows
end


-- Link zum gespeicherten SMW-Seitenwert (einschließlich Präfix).
-- Führender Doppelpunkt verhindert Kategoriezuordnung/Dateieinbettung.
local function buildOverviewLink(value)
    local text = util.smwLiteral(value)
    local title = mw.title.new(value)
    if not title then return text end
    local target = title.prefixedText
    if title.fragment and title.fragment ~= '' then
        target = target .. '#' .. title.fragment
    end
    return '[[:' .. util.smwLiteral(target) .. '|' .. text .. ']]'
end

local function buildVisibleSmwTable(baseRows, extraRows, lexemeModule, lexemeData)
	local c = cfg and cfg.smw and cfg.smw.Q
	if not c then
		return ''
	end


	-- HTML statt Wikitext-Tabelle (vermeidet Pipe/Parser-Kanten)
	local t = mw.html.create('table')
	t:addClass('aew-wb-smwtable')

	local function row(k, v)
		if not v or v == '' then return end
		local tr = t:tag('tr')
		tr:tag('th'):wikitext(k)
		tr:tag('td'):wikitext(v)
	end

	if lexemeData then
        t:tag('tr'):tag('th'):attr('colspan', 2):wikitext('Q-Objekt')
    end
	for _, entry in ipairs(baseRows) do
		row(util.smwLiteral(entry.property), entry.display)
	end
	for _, entry in ipairs(extraRows or {}) do
		row(util.smwLiteral(entry.property), buildOverviewLink(entry.value))
	end

    if lexemeData then
        lexemeModule.appendRows(t, lexemeData, 'Lexem')
    end
	return tostring(t)
end

function p.link(frame)
	local args = util.getArgs(frame)
	local entityId = util.detectEntityId(args)
	if not entityId or not entityId:match('^Q%d+$') then return '' end

	local label = args.label or util.getEntityLabelOrLemma(entityId) or entityId
	local line1 = string.format('%s %s', entityId, label)
	return util.buildEntityLink(entityId, line1, args.target)
end

function p.render(frame)
    local args = util.getArgs(frame)
    local qArgs = {}
    for key, value in pairs(args) do
        if key ~= 'L' and key ~= 'l' and key ~= 'lexeme' then qArgs[key] = value end
    end
    local entityId = util.detectEntityId(qArgs)
    local lexemeModule, lexemeData, lexemeArgs
    if args.L and args.L ~= '' then
        lexemeModule = require('Module:WikibaseL')
        lexemeArgs = {
            L = args.L, label = args.Llabel,
            subtitle = args.Lsubtitle or 'auto', set = args.Lset or 'ja',
        }
        lexemeData = lexemeModule.collect(lexemeArgs)
        if not lexemeData then error('WikibaseQ: L enthält kein verfügbares Lexem') end
    end
    if not entityId or not entityId:match('^Q%d+$') then
        if not lexemeData then return '' end
        local result = lexemeModule.annotate(frame, lexemeArgs, lexemeData)
        if isNo(args.show) then return result end
        local t = mw.html.create('table'):addClass('aew-wb-smwtable')
        lexemeModule.appendRows(t, lexemeData)
        return result .. tostring(t)
    end

	local label = args.label or util.getEntityLabelOrLemma(entityId) or entityId
	local line1text = string.format('%s %s', entityId, label)
	local link = util.buildEntityLink(entityId, line1text, args.target)

	local desc = buildSubtitle(args, entityId)

	-- Bisherige Annotationen plus konfigurierte Q-Aussagen.
	local extraRows, notices = getPrefixedStatements(entityId)
	local baseRows = getBaseRows(entityId, label, desc)
	local smw = util.setSmwRows(frame, baseRows) .. util.setSmwRows(frame, extraRows)
    if lexemeData then
        smw = smw .. lexemeModule.annotate(frame, lexemeArgs, lexemeData)
    end
	for _, notice in ipairs(notices) do
		smw = smw .. '<span class="error">' .. util.smwLiteral(notice) .. '</span>'
	end

	-- Sichtbarkeit der SMW-Werte:
	-- Default = ja, abschaltbar mit |show=nein
	local show = not isNo(args.show)

	-- Fallback-Anzeige (wie bisher): Link + <br/> + Beschreibung
	if not show then
		if desc and desc ~= '' then
			return smw .. link .. '<br />' .. util.trim(desc)
		end
		return smw .. link
	end

	-- Die äußere Vorlage liefert die Überschrift „Wikibase“.
	local tableHtml = buildVisibleSmwTable(baseRows, extraRows, lexemeModule, lexemeData)
	if tableHtml ~= '' then
		return smw .. tableHtml
	end

	-- Wenn config fehlt, fällt es auf die alte Anzeige zurück
	if desc and desc ~= '' then
		return smw .. link .. '<br />' .. util.trim(desc)
	end
	return smw .. link
end

function p.shortdesc(frame)
	-- Q: kein SHORTDESC-Setzen hier (Q hat Sitelink-System), daher leer
	return ''
end

return p