<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wicri-demo.istex.fr/Wicri/Sic/VSST/fr/index.php?action=history&amp;feed=atom&amp;title=Module%3AWikidata%2FR%C3%A9cup</id>
	<title>Module:Wikidata/Récup - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://wicri-demo.istex.fr/Wicri/Sic/VSST/fr/index.php?action=history&amp;feed=atom&amp;title=Module%3AWikidata%2FR%C3%A9cup"/>
	<link rel="alternate" type="text/html" href="https://wicri-demo.istex.fr/Wicri/Sic/VSST/fr/index.php?title=Module:Wikidata/R%C3%A9cup&amp;action=history"/>
	<updated>2026-04-19T11:27:39Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.31.10</generator>
	<entry>
		<id>https://wicri-demo.istex.fr/Wicri/Sic/VSST/fr/index.php?title=Module:Wikidata/R%C3%A9cup&amp;diff=599&amp;oldid=prev</id>
		<title>imported&gt;Jacques Ducloy : 1 révision importée</title>
		<link rel="alternate" type="text/html" href="https://wicri-demo.istex.fr/Wicri/Sic/VSST/fr/index.php?title=Module:Wikidata/R%C3%A9cup&amp;diff=599&amp;oldid=prev"/>
		<updated>2020-12-28T09:45:31Z</updated>

		<summary type="html">&lt;p&gt;1 révision importée&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;fr&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Version précédente&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Version du 28 décembre 2020 à 09:45&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;fr&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(Aucune différence)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>imported&gt;Jacques Ducloy</name></author>
		
	</entry>
	<entry>
		<id>https://wicri-demo.istex.fr/Wicri/Sic/VSST/fr/index.php?title=Module:Wikidata/R%C3%A9cup&amp;diff=2108&amp;oldid=prev</id>
		<title>imported&gt;Jacques Ducloy : 1 révision importée</title>
		<link rel="alternate" type="text/html" href="https://wicri-demo.istex.fr/Wicri/Sic/VSST/fr/index.php?title=Module:Wikidata/R%C3%A9cup&amp;diff=2108&amp;oldid=prev"/>
		<updated>2017-07-04T07:35:19Z</updated>

		<summary type="html">&lt;p&gt;1 révision importée&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
local datequalifiers = {'P585', 'P571', 'P580', 'P582'}&lt;br /&gt;
local tools = require &amp;quot;Module:Wikidata/Outils&amp;quot;&lt;br /&gt;
local datemod -- = require &amp;quot;Module:Date complexe&amp;quot; -- chargé uniquement si nécessaire&lt;br /&gt;
&lt;br /&gt;
local function notSpecial(claim)&lt;br /&gt;
	return tools.isValue(claim.mainsnak)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hastargetvalue(claim, targets) -- retourne true si la valeur est dans la liste des target, ou si c'est une valeur spéciale filtrée séparément par excludespecial&lt;br /&gt;
	local id = tools.getMainId(claim)&lt;br /&gt;
	local targets = tools.splitStr(targets)&lt;br /&gt;
	return tools.isHere(targets, id) or tools.isSpecial(claim.mainsnak)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function excludevalues(claim, values) -- true si la valeur n'est pas dans la liste, ou si c'est une valeur spéciale (filtrée à part par excludespecial)&lt;br /&gt;
	return tools.isSpecial(claim.mainsnak) or not ( hastargetvalue(claim, values) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function bestranked(claims)&lt;br /&gt;
	if not claims then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local preferred, normal = {}, {}&lt;br /&gt;
	for i, j in pairs(claims) do&lt;br /&gt;
		if j.rank == 'preferred' then&lt;br /&gt;
			table.insert(preferred, j)&lt;br /&gt;
		elseif j.rank == 'normal' then&lt;br /&gt;
			table.insert(normal, j)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if #preferred &amp;gt; 0 then&lt;br /&gt;
		return preferred&lt;br /&gt;
	else&lt;br /&gt;
		return normal&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function withrank(claims, target)&lt;br /&gt;
	if target == 'best' then&lt;br /&gt;
		return bestranked(claims)&lt;br /&gt;
	end&lt;br /&gt;
	local newclaims = {}&lt;br /&gt;
	for pos, claim in pairs(claims)  do&lt;br /&gt;
		if target == 'valid' then&lt;br /&gt;
			if claim.rank ~= 'deprecated' then&lt;br /&gt;
				table.insert(newclaims, claim)&lt;br /&gt;
			end&lt;br /&gt;
		elseif claim.rank == target then&lt;br /&gt;
			table.insert(newclaims, claim)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return newclaims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.hasqualifier(claim, acceptedqualifs, acceptedvals, excludequalifiervalues)&lt;br /&gt;
	local claimqualifs = claim.qualifiers&lt;br /&gt;
	&lt;br /&gt;
	if (not claimqualifs) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	acceptedqualifs = tools.splitStr(acceptedqualifs)&lt;br /&gt;
	acceptedvals = tools.splitStr( acceptedvals)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	local function ok(qualif) -- vérification pour un qualificatif individuel&lt;br /&gt;
		if not claimqualifs[qualif] then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
		if not (acceptedvals) then  -- si aucune valeur spécifique n'est demandée, OK&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
		for i, wanted in pairs(acceptedvals) do&lt;br /&gt;
			for j, actual in pairs(claimqualifs[qualif]) do&lt;br /&gt;
				if tools.getId(actual) == wanted then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for i, qualif in pairs(acceptedqualifs) do&lt;br /&gt;
		if ok(qualif) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
local function hassource(claim, targetsource, sourceproperty)&lt;br /&gt;
	sourceproperty = sourceproperty or 'P248'&lt;br /&gt;
	if targetsource == &amp;quot;-&amp;quot; then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	if (not claim.references) then return&lt;br /&gt;
		false&lt;br /&gt;
	end&lt;br /&gt;
	local candidates = claim.references[1].snaks[sourceproperty] -- les snaks utilisant la propriété demandée&lt;br /&gt;
	if (not candidates) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	if (targetsource == &amp;quot;any&amp;quot;) then -- si n'importe quelle valeur est acceptée tant qu'elle utilise en ref la propriété demandée&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	targetsource = tools.splitStr(targetsource)&lt;br /&gt;
	for _, source in pairs(candidates) do&lt;br /&gt;
		local s = tools.getId(source)&lt;br /&gt;
		for i, target in pairs(targetsource) do&lt;br /&gt;
			if s == target then return true end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function excludequalifier(claim, qualifier, qualifiervalues)&lt;br /&gt;
	return not p.hasqualifier(claim, qualifier, qualifiervalues)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function hasdate(claim)&lt;br /&gt;
	local claimqualifs = claims.qualifiers&lt;br /&gt;
	if not claimqualifs then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	for _, qualif in pairs(claimqualifs) do&lt;br /&gt;
		if claimsqualifs[qualif] and claimsqualifs[qualif][1].snaktype == 'value' then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function haslink(claim, site, lang)&lt;br /&gt;
	if not(tools.isValue(claim.mainsnak)) then -- ne pas supprimer les valeurs spéciales, il y a une fonction dédiée pour ça&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	local id = tools.getMainId(claim)&lt;br /&gt;
	local link = tools.siteLink(id, site, lang)&lt;br /&gt;
	if link then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isinlanguage(claim, lang) -- ne fonctionne que pour les monolingualtext / étendre aux autres types en utilisant les qualifiers ?&lt;br /&gt;
	local snak = claim.mainsnak&lt;br /&gt;
	if tools.isSpecial(snak) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	if snak.datavalue.type == 'monolingualtext' and snak.datavalue.value.language == lang then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function firstvals(claims, numval) -- retourn les numval premières valeurs de la table claims&lt;br /&gt;
    local numval = tonumber(numval) or 0 -- raise a error if numval is not a positive integer ?&lt;br /&gt;
    if not claims then&lt;br /&gt;
    	return nil&lt;br /&gt;
    end&lt;br /&gt;
    while (#claims &amp;gt; numval) do&lt;br /&gt;
    	table.remove(claims)&lt;br /&gt;
    end&lt;br /&gt;
    return claims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function valinQualif(claim, qualifs)&lt;br /&gt;
	local claimqualifs = claim.qualifiers&lt;br /&gt;
	if not claimqualifs then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	for i, qualif in pairs(qualifs) do&lt;br /&gt;
		local vals = claimqualifs[qualif]&lt;br /&gt;
		if vals and tools.isValue(vals[1]) then&lt;br /&gt;
			return tools.getValue(vals[1]).time&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function chronosort(claims, inverted)&lt;br /&gt;
	table.sort(&lt;br /&gt;
		claims,&lt;br /&gt;
		function(a,b)&lt;br /&gt;
			local timeA = valinQualif(a, datequalifiers) or ''&lt;br /&gt;
			local timeB = valinQualif(b, datequalifiers) or ''&lt;br /&gt;
			if inverted then&lt;br /&gt;
				return timeA &amp;gt; timeB -- marche sauf pour les dates &amp;lt; 10 000 av-JC utiliser datemod.before produit un bug&lt;br /&gt;
			else&lt;br /&gt;
				return timeB &amp;gt; timeA&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
	return claims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function atDate(claim, mydate)&lt;br /&gt;
	if mydate == &amp;quot;today&amp;quot; then&lt;br /&gt;
		mydate = os.date(&amp;quot;!%Y-%m-%dT%TZ&amp;quot;)&lt;br /&gt;
	end	&lt;br /&gt;
	local newclaims = {}&lt;br /&gt;
	local mindate = valinQualif(claim, {'P580'}) &lt;br /&gt;
	local maxdate = valinQualif(claim, {'P582'})&lt;br /&gt;
	datemod = require &amp;quot;Module:Date complexe&amp;quot;&lt;br /&gt;
	if datemod.before(mydate, mindate) and datemod.before(maxdate, mydate) then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function check(claim, condition)&lt;br /&gt;
	if type(condition) == 'function' then -- cas standard&lt;br /&gt;
		return condition(claim)&lt;br /&gt;
	end&lt;br /&gt;
	local msg = &amp;quot;args.condition should be a function&amp;quot;&lt;br /&gt;
	return error(msg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.sortclaims(claims, sorttype)&lt;br /&gt;
	if not claims then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if sorttype == 'chronological' then&lt;br /&gt;
		return chronosort(claims)&lt;br /&gt;
	elseif sorttype == 'inverted' then&lt;br /&gt;
		return chronosort(claims, true)&lt;br /&gt;
	elseif type(sorttype) == 'function' then&lt;br /&gt;
		table.sort(claims, sorttype)&lt;br /&gt;
		return claims&lt;br /&gt;
	end&lt;br /&gt;
	return claims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.filterClaims(claims, args) --retire de la tables de claims celles qui sont éliminés par un des filters de la table des filters&lt;br /&gt;
&lt;br /&gt;
	local function filter(condition, filterfunction, funargs)&lt;br /&gt;
		if not args[condition] then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		for i = #claims, 1, -1 do&lt;br /&gt;
			if not( filterfunction(claims[i], args[funargs[1]], args[funargs[2]], args[funargs[3]]) ) then&lt;br /&gt;
				table.remove(claims, i)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	filter('targetvalue', hastargetvalue, {'targetvalue'} )&lt;br /&gt;
	filter('isinlang', isinlanguage, {'isinlang'} )&lt;br /&gt;
	filter('atdate', atDate, {'atdate'} )&lt;br /&gt;
	filter('qualifier', p.hasqualifier, {'qualifier', 'qualifiervalue'} )&lt;br /&gt;
	filter('excludequalifier', excludequalifier, {'excludequalifier', 'excludequalifiervalue'} )&lt;br /&gt;
	filter('withsource', hassource, {'withsource', 'sourceproperty'} )&lt;br /&gt;
	filter('withdate', hasdate, {} )&lt;br /&gt;
	filter('excludespecial', notSpecial, {} )&lt;br /&gt;
	filter('excludevalues', excludevalues, {'excludevalues'})&lt;br /&gt;
	filter('withlink', haslink, {'withlink', 'linklang'} )&lt;br /&gt;
	filter('condition', check, {'condition'})&lt;br /&gt;
&lt;br /&gt;
	claims = withrank(claims, args.rank or 'best')&lt;br /&gt;
	if args.sorttype then&lt;br /&gt;
		claims = p.sortclaims(claims, args.sorttype)&lt;br /&gt;
	end&lt;br /&gt;
	if #claims == 0 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if args.numval then&lt;br /&gt;
		claims = firstvals(claims, args.numval)&lt;br /&gt;
	end&lt;br /&gt;
	return claims&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.loadEntity(entity, cache)&lt;br /&gt;
	if type(entity) ~= 'table' then&lt;br /&gt;
		if cache then&lt;br /&gt;
			if not cache[entity] then &lt;br /&gt;
				cache[entity] = mw.wikibase.getEntity(entity)&lt;br /&gt;
				mw.log(&amp;quot;cached&amp;quot;)&lt;br /&gt;
     		end&lt;br /&gt;
			return cache[entity]&lt;br /&gt;
        else&lt;br /&gt;
			if entity == '' then&lt;br /&gt;
				entity = nil&lt;br /&gt;
			end&lt;br /&gt;
        	return mw.wikibase.getEntity(entity)&lt;br /&gt;
        end&lt;br /&gt;
    else &lt;br /&gt;
    	return entity&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.getClaims( args ) -- returns a table of the claims matching some conditions given in args&lt;br /&gt;
	if args.claims then -- if claims have already been set, return them&lt;br /&gt;
		return args.claims&lt;br /&gt;
	end&lt;br /&gt;
	local properties = tools.splitStr(args.property)&lt;br /&gt;
&lt;br /&gt;
	if not properties then&lt;br /&gt;
		return error( 'property-param-not-provided' )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--Get entity&lt;br /&gt;
	local entity = args.entity&lt;br /&gt;
 	entity = p.loadEntity(args.entity, args.cache)&lt;br /&gt;
    &lt;br /&gt;
	if (not entity) or (not entity.claims) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local claims = {}&lt;br /&gt;
	for i, prop in pairs(properties) do&lt;br /&gt;
		prop = string.upper(prop)&lt;br /&gt;
		for j, claim in pairs(entity.claims[prop] or {}) do&lt;br /&gt;
			table.insert(claims, claim)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (#claims == 0) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return p.filterClaims(claims, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Jacques Ducloy</name></author>
		
	</entry>
</feed>