„Modul:WikibaseQ“ – Versionsunterschied
Erscheinungsbild
KKeine Bearbeitungszusammenfassung |
KKeine Bearbeitungszusammenfassung |
||
| (8 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 24: | Zeile 24: | ||
end | end | ||
local function | -- 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 | end | ||
local function buildVisibleSmwTable( | -- 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 | local c = cfg and cfg.smw and cfg.smw.Q | ||
if not c then | if not c then | ||
| Zeile 44: | Zeile 100: | ||
end | end | ||
-- HTML statt Wikitext-Tabelle (vermeidet Pipe/Parser-Kanten) | -- HTML statt Wikitext-Tabelle (vermeidet Pipe/Parser-Kanten) | ||
| Zeile 57: | Zeile 112: | ||
end | end | ||
if lexemeData then | |||
t:tag('tr'):tag('th'):attr('colspan', 2):wikitext('Q-Objekt') | |||
row( | end | ||
for _, entry in ipairs(baseRows) do | |||
row(util.smwLiteral(entry.property), entry.display) | |||
end | |||
for _, entry in ipairs(extraRows or {}) do | for _, entry in ipairs(extraRows or {}) do | ||
row(util.smwLiteral(entry.property), | row(util.smwLiteral(entry.property), buildOverviewLink(entry.value)) | ||
end | end | ||
if lexemeData then | |||
lexemeModule.appendRows(t, lexemeData, 'Lexem') | |||
end | |||
return tostring(t) | return tostring(t) | ||
end | end | ||
| Zeile 70: | Zeile 131: | ||
local args = util.getArgs(frame) | local args = util.getArgs(frame) | ||
local entityId = util.detectEntityId(args) | local entityId = util.detectEntityId(args) | ||
if not entityId then return '' end | if not entityId or not entityId:match('^Q%d+$') then return '' end | ||
local label = args.label or util.getEntityLabelOrLemma(entityId) or entityId | local label = args.label or util.getEntityLabelOrLemma(entityId) or entityId | ||
| Zeile 78: | Zeile 139: | ||
function p.render(frame) | 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 label = args.label or util.getEntityLabelOrLemma(entityId) or entityId | ||
| Zeile 89: | Zeile 171: | ||
-- Bisherige Annotationen plus konfigurierte Q-Aussagen. | -- Bisherige Annotationen plus konfigurierte Q-Aussagen. | ||
local extraRows, notices = | local extraRows, notices = getPrefixedStatements(entityId) | ||
local baseRows = getBaseRows(entityId, label, desc) | |||
local | 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 108: | Zeile 193: | ||
end | end | ||
-- | -- Die äußere Vorlage liefert die Überschrift „Wikibase“. | ||
local tableHtml = buildVisibleSmwTable( | local tableHtml = buildVisibleSmwTable(baseRows, extraRows, lexemeModule, lexemeData) | ||
if tableHtml ~= '' then | if tableHtml ~= '' then | ||
return smw | return smw .. tableHtml | ||
end | end | ||
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