Aller au contenu

Module:Wikidata/Nommage

Depi Wikipedya, ansiklopedi lib

La documentation pour ce module peut être créée à Module:Wikidata/Nommage/doc

-- Module Wikidata d’aide à la gestion du nommage des entités, en particulier le nommage des entités à une date donnée
-- Work In Progress version « marche pas »

local wikidata = require "Module:Wikidata"
local modules = {}
modules.formatDate = require "Module:Date complexe"
local fun = require "Module:Luafun"

local PofficialName = "P1448"
local PDateNaissance = "P569"

local p = {}
p.wd = wikidata

-------------------------------------------------------------
-- copied from Module:Wikidata as these are not local functions for now
local function timeFromSnak(snak)
	if snak and snak.snaktype == "value" then
		return snak.datavalue.value.time
	end
end

local function timeFromQualifs(claim, qualifs)
	local claimqualifs = claim.qualifiers
	if not claimqualifs then
		return nil
	end
	for i, qualif in pairs(qualifs or timequalifiers) do
		local vals = claimqualifs[qualif] or {}
		local cand = timeFromSnak(vals[1])
		if cand then return cand end
	end
end

local function atDate(claim, mydate)
	if mydate == "today" then
		mydate = os.date("!%Y-%m-%dT%TZ")
	end	
	mw.log("testdate")
	local newclaims = {}
	local mindate = timeFromQualifs(claim, {'P580'}) 
	local maxdate = timeFromQualifs(claim, {'P582'})
	mw.logObject(mydate)
	if modules.formatDate.before(mydate, mindate) and  modules.formatDate.before(maxdate, mydate) then
		return true
	end
end
-------------------------------------------------------------------------------------------

local function stmtMeetsOneTrueIn(condition, values)
	return function(stmt)
		return values:any(
			function(date) return condition(stmt, date) end
		)
	end
end

local function mainSnak(stmt)
	return stmt.mainsnak
end

p.nameAtDate = function (place_qid, date_claims)
	local names = mw.wikibase.getAllStatements(place_qid, "P1448")
	mw.log(#date_claims)
	local date_vals = fun.iter(date_claims):map(mainSnak):map(timeFromSnak)
	date_vals:each(mw.log)
	
	local atOneOfTheDates = stmtMeetsOneTrueIn(atDate, date_vals)
	
	names = wikidata.filterClaims(
		names, 
		{
			['condition'] = atOneOfTheDates, 
			['isinlang'] = 'ht', 
			['rank'] = 'valid'
		}
	)
	
	return names
end

-- =p.nameAtPropValue("Q192393", "P569" ,"Q2977199")
p.nameAtPropValue = function(toNameEntity, atDateProperty, forItem)
	local dates
	if type(forItem) == "table" then
		dates = forItem:getBestStatements(atDateProperty)
	else
	    dates = mw.wikibase.getBestStatements(forItem, atDateProperty)
	end
	local names = p.nameAtDate(toNameEntity, dates)
	return names
end

--[[test 
=p.wd.formatAndCat(
					{
						entity = "Q2977199", 
						property= 'P19', 
						rank = 'best', 
						conjtype= ' ou ', 
						unknownlabel = "lieu inconnu",
						statementformat = p.nameAtDatePropStatementFormatter("P569", "Q2977199")
					})
--]]

local const_format = function(label)
	return function()
		return label
	end
end

local function modify_parameters(orig, delta)
	local modified = orig
	for k, v in pairs(delta) do
		modified[k] = v
	end
	return modified
end

--[[ function generator (closures) for the « statementformat » parameter of 
     Module:Wikidata to format statements according to the date given by another property
     
     (conj is optional)
     
     When called, the return function will use the values for the property 
     « dateOfProperty » of the reference item to search for the names of an item at those time(s)
--]]
p.nameAtDatePropStatementFormatter = function(dateOfProperty, item, conj)
	conj = conj or " ou "
	return function(stmt, params)
		local snak = stmt.mainsnak
		if snak.snaktype ~= 'value' then
			return nil
		end
		local labels = p.nameAtPropValue(wikidata.getId(snak), "P569", item)
		if labels then
			local label = wikidata.formatStatements{
				claims=labels, conj = conj
			}
			return wikidata.formatEntity(wikidata.getId(snak), modify_parameters(params, {labelformat=const_format(label)}))
		else
			return wikidata.formatEntity(wikidata.getId(snak), params)
		end
	end
end

-- interface for a test template
p.nameForItem = function(frame)
	local item = frame.args["item"]
	local atDateProperty = frame.args["atDateProperty"]
	local toNameEntity = frame.args["toNameEntity"]
	local res = p.nameAtPropValue(toNameEntity, atDateProperty, item)
	if res then
		return wikidata.formatStatements{
			claims=res, conj=" ou "
		}
	else
		return mw.wikibase.label(toNameEntity)
	end
end

return p