Module:Utilitaire Wikidata

De Lagny-sur-Marne Wiki
Révision datée du 31 janvier 2016 à 21:11 par Zolo (discussion) (borne inféiruer, supérieur, voir Discussion_Projet:Wikidata#Demande_de_modif_d.27un_infobox)
Aller à : navigation, rechercher

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

-- Module de requêtes Wikidata de plus haut niveau que Module:Wikidata
local p = {}
local wikidata = require "Module:Wikidata"
local linguistic = require "Module:Linguistique"
local function keydate (event)
	if type(event) ~= 'string' then
		return error('event should be a string starting with a P or S, datatype is ' .. type(event))
	end
	if string.sub(event, 1, 1) == 'Q' then -- on demande un élément utilisé dans P:P793 (événement clé)
		return  wikidata.getTheDate{property = 'P793', targetvalue = event, addcat = true, entity = item}
	elseif string.sub(event, 1, 1) == 'P'  then -- on demande une propriété
		return wikidata.formatAndCat{property = event, entity = item}
	else
		return error('event string should start with P or S, is "' .. event .. '"')
	end
end

function p.wikidatadate(prop, item, options) 	-- formate un statmement de type date en prenant en compte certains qualificatifs
	options = options or {}
	local vals = wikidata.getClaims{entity = item, property = prop}
	if not vals then
		return nil
	end
	local newvals = {}
	for i, val in pairs(vals) do
		
		--cherche la date avec les qualifs P580/P582
		local v = wikidata.getFormattedDate(val, options) 
		
		-- puis limite intérieur / supérieur
		if not v then
			local start = wikidata.getFormattedQualifiers(val, {'P1319'}) 
			local ending = wikidata.getFormattedQualifiers(val, {'P1326'})
			if start then
				start = start .. ', au plus tôt'
			end
			if ending then
				ending = ending .. ', au plus tard'
			end
			v = linguistic.conj({start, ending}, 'comma')
		end
		
		 -- sinon, le mainsnak
		if not v then
			if val.mainsnak.snaktype ~= 'value' then
				v = wikidata.formatStatement(val, options)
			elseif val.mainsnak.datavalue.value.precision > 7 then
				v = wikidata.formatStatement(val, options)
			end
		end
		
		-- ajouter le qualificatifs "environ"
		if v and val.qualifiers and val.qualifiers.P1480 then
			local q = wikidata.getid( val.qualifiers.P1480[1]) 
			if q == 'Q5727902' then
				v = 'vers ' .. v
			end
		end
		if v then
			table.insert(newvals, v)
		end
	end
	local str = linguistic.conj(newvals, 'or')
	if str then
		return wikidata.formatStatements{entity = item, property = prop, value = str, conjtype = 'or', linkback = options.linkback or true, addcat = options.addcat or true}
	end
end

function p.maindate(entity) -- à améliorer en utilisant module:Date complexe comme pour wikidata.getDate
	
	-- essaye P580/P582
	local startpoint = p.wikidatadate('P580', entity, {linkback = "-"})
	local endpoint = p.wikidatadate('P582', entity, {linkback = "-"})
	local str
	if startpoint or endpoint then
		str = (startpoint or '') .. ' - ' .. (endpoint or '')
		str = wikidata.addLinkback(str, entity, 'P582')
	end

	if str then
		return str
	end
	-- défaut : P585
	return p.wikidatadate('P585', entity)
end

function p.addLinkback(str, entity, property)
	return wikidata.addLinkback(str, entity, property)
end

function p.addtrackingcat(prop, cat)
	return wikidata.addtrackingcat(prop, cat)
end

function p.keydate(events)
	if type(events) == 'nil' then
		return nil
	end
	if type(events) == 'string' then
		return keydate(events)
	elseif type(events) == 'table' then
		for i, j in pairs(events) do
			local val = keydate(j)
			if val then
				return val
			end
		end
	end
end
function p.getClaims(args) 
	return wikidata.getClaims(args)
end
function p._formatStatements(args)
	return wikidata._formatStatements(args)
end
function p.formatAndCat(args)
	return wikidata.formatAndCat(args)
end

return p