Module:Utilitaire Wikidata

De Lagny-sur-Marne Wiki
Révision datée du 4 février 2016 à 03:40 par Zebulon84 (discussion) (wikidatadate : formatStatements ne fait rien si value est fourni. Modification en fonction de ce que je comprend du but de cette dernière ligne. (permet le retour de l'age dans les 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
		if options.addcat or true then
			wikidata.addtrackingcat(prop)
		end
		if options.linkback or true then
			str = wikidata.addLinkback(str, item, prop)
		end
		return str
	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