Op den Inhalt sprangen

Modul:Spouse

Vu Wikipedia

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