Modul:Spouse
Ausgesinn
D'Dokumentatioun fir dëst Modul kann op Modul:Spouse/doc ugeluecht ginn
-- Module:Spouse
-- Displays spouse(s) (P26) from Wikidata, with start (P580) and end (P582) dates if available.
-- Dates are formatted as D.M.YYYY, or partials (M.YYYY / YYYY) if month/day are missing.
local p = {}
local mw = mw
local wb = mw.wikibase
-- Extract the datavalue.value from various shapes
local function getDatavalueValue(obj)
if not obj then return nil end
if obj.datavalue then return obj.datavalue.value end
if obj.snak and obj.snak.datavalue then return obj.snak.datavalue.value end
if obj.mainsnak and obj.mainsnak.datavalue then return obj.mainsnak.datavalue.value end
return nil
end
-- Format a Wikidata time into D.M.YYYY (European style)
local function formatWikidataTime(value)
if not value or not value.time then return nil end
local t = value.time:gsub("^%+", "")
local y, m, d = t:match("^(%d%d%d%d)%-(%d%d)%-(%d%d)")
if not y then return nil end
-- Handle missing month/day
if m == "00" then
return y
elseif d == "00" or d == "0" then
return tostring(tonumber(m)) .. "." .. y
else
return tostring(tonumber(d)) .. "." .. tostring(tonumber(m)) .. "." .. y
end
end
-- Helper: format date from qualifier/snaks object
local function formatDateFromQualifier(obj)
local v = getDatavalueValue(obj)
if not v then return nil end
return formatWikidataTime(v)
end
-- Format one spouse
local function formatSpouse(statement)
if not statement or not statement.mainsnak or not statement.mainsnak.datavalue then
return nil
end
local mainval = statement.mainsnak.datavalue.value
local spouseId = mainval.id
if not spouseId then return nil end
local label = wb.getLabel(spouseId) or spouseId
local quals = statement.qualifiers or {}
local startQual = quals.P580 and quals.P580[1]
local endQual = quals.P582 and quals.P582[1]
local startDate = formatDateFromQualifier(startQual)
local endDate = formatDateFromQualifier(endQual)
local dateText = ""
if startDate or endDate then
local dash = "–"
dateText = string.format(" (%s%s%s)", startDate or "", dash, endDate or "")
end
return string.format("[[%s]]%s", label, dateText)
end
-- Main entry point
function p.show(frame)
local entity = wb.getEntity()
if not entity or not entity.claims or not entity.claims.P26 then
return nil
end
local results = {}
for _, statement in ipairs(entity.claims.P26) do
local text = formatSpouse(statement)
if text then table.insert(results, text) end
end
if #results == 0 then return nil end
return table.concat(results, "<br>")
end
return p