Module:Wikidata/Récup : Différence entre versions

De Lagny-sur-Marne Wiki
Aller à : navigation, rechercher
Ligne 1 : Ligne 1 :
 
local p = {}
 
local p = {}
 
local datequalifiers = {'P585', 'P571', 'P580', 'P582'}
 
local datequalifiers = {'P585', 'P571', 'P580', 'P582'}
 +
local basic = require "Module:Wikibase"
  
 
local function severalProperties(args)
 
local function severalProperties(args)
Ligne 14 : Ligne 15 :
  
 
local function hastargetvalue(claim, target)
 
local function hastargetvalue(claim, target)
if target == nil then
+
return basic.getmainid(claim == target)
return true
 
end
 
return samevalue(claim.mainsnak, target)
 
 
end
 
end
  
Ligne 83 : Ligne 81 :
 
end
 
end
 
for _, source in pairs(claim.references[sourceproperty]) do
 
for _, source in pairs(claim.references[sourceproperty]) do
if (source.snaktype == 'value') and (source.datavalue.value['numeric-id'] == targetsource) then
+
if basic.getId(source) == targetsource then
 
return true
 
return true
 
end
 
end
Ligne 104 : Ligne 102 :
  
 
local function isinlanguage(snak, lang) -- ne fonctionne que pour les monolingualtext / étendre aux autres types en utilisant les qualifiers ?
 
local function isinlanguage(snak, lang) -- ne fonctionne que pour les monolingualtext / étendre aux autres types en utilisant les qualifiers ?
if snak.snaktype == 'value' and snak.datavalue.type == 'monolingualtext' and snak.datavalue.value.language == lang then
+
if basic.isSpecial(snak) then
 +
return false
 +
end
 +
if snak.datavalue.type == 'monolingualtext' and snak.datavalue.value.language == lang then
 
return true
 
return true
 
end
 
end
 
return false
 
return false
end
 
 
local function isSpecial(snak)
 
if snak.snaktype == 'value' then
 
return false
 
end
 
return true
 
 
end
 
end
  
Ligne 136 : Ligne 130 :
 
end
 
end
 
for _, qualif in pairs(datequalifiers) do
 
for _, qualif in pairs(datequalifiers) do
if claimqualifs[qualif] and claimqualifs[qualif][1].snaktype == 'value' then
+
local vals = claimqualifs[qualif]
return claimqualifs[qualif][1].datavalue.value.time
+
if vals and basic.isValue(vals[1]) then
 +
return basic.getValue(vals[1]).time
 
end
 
end
 
end
 
end
Ligne 171 : Ligne 166 :
 
end
 
end
 
if not args.property then
 
if not args.property then
return formatError( 'property-param-not-provided' )
+
return error( 'property-param-not-provided' )
 
end
 
end
 
if type(args.property) == 'table' then
 
if type(args.property) == 'table' then
Ligne 198 : Ligne 193 :
 
     not args.excludespecial
 
     not args.excludespecial
 
     or
 
     or
     not (isSpecial(claim.mainsnak))
+
     not (basic.isSpecial(claim.mainsnak))
 
     )
 
     )
 
     and
 
     and
Ligne 210 : Ligne 205 :
 
     not args.qualifier
 
     not args.qualifier
 
     or
 
     or
     hasqualifier(claim, args.qualifier, args.qualifiervalue or args.qualifiervalues)
+
     hasqualifier(args.qualifier, args.qualifiervalue or args.qualifiervalues)
 
     )
 
     )
 
and
 
and

Version du 18 août 2015 à 11:06

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

local p = {}
local datequalifiers = {'P585', 'P571', 'P580', 'P582'}
local basic = require "Module:Wikibase"

local function severalProperties(args)
	local newargs = args
	for i, j in pairs(args.property) do
		newargs.property = j
		local newclaims = p.getClaims(newargs)
		if claims then
			return claims
		end
	end
end

local function hastargetvalue(claim, target)
	return basic.getmainid(claim == target)
end

local function hasrank(claim, target)
	if target == 'valid' then
		return hasrank(claim, 'preferred') or hasrank(claim, 'normal')
	end
	if claim.rank == target then
		return true
	end
	return false
end

local function bestranked(claims)
	if not claims then
		return nil
	end
	local preferred, normal = {}, {}
	for i, j in pairs(claims) do
		if j.rank == 'preferred' then
			table.insert(preferred, j)
		elseif j.rank == 'normal' then
			table.insert(normal, j)
		end
	end
	if #preferred > 0 then
		return preferred
	else
		return normal
	end
end

local function hasqualifier(claim, qualifier, qualifiervalues)
	local claimqualifs = claim.qualifiers
   	if (not claimqualifs) or not(claimqualifs[qualifier]) then
   		return false
   	end

   	if (not qualifiervalues) or (qualifiervalues == {}) then
   		return true -- si aucune valeur spécifique n'est exigée, c'est bon
   	end

   if type(qualifiervalues) == 'string' then
   		qualifiervalues = {qualifiervalues}
   	end

   	for i, j in pairs(claim.qualifiers[qualifier]) do
   		local val = p.getRawvalue(j)
   		for k, l in pairs(qualifiervalues) do
   			if l == val then
   				return true
   			end
   		end
   end
   return false
 end

local function hassource(claim, targetsource, sourceproperty)
    sourceproperty = sourceproperty or 'P248'
	if not claim.references or not claim.references[sourceproperty] then
		return false
	end
	if not targetsource then -- si toutes les sources sont valides, du moment qu'elles utilisent sourceproperty
		return true
	end
	for _, source in pairs(claim.references[sourceproperty]) do
		if basic.getId(source) == targetsource then
			return true
		end
	end
	return true
end

local function hasdate(claim)
	local claimqualifs = claims.qualifiers
	if not claimqualifs then
		return false
	end
	for _, qualif in pairs(claimqualifs) do
		if claimsqualifs[qualif] and claimsqualifs[qualif][1].snaktype == 'value' then
			return true
		end
	end
	return false
end

local function isinlanguage(snak, lang) -- ne fonctionne que pour les monolingualtext / étendre aux autres types en utilisant les qualifiers ?
	if basic.isSpecial(snak) then
		return false
	end
	if snak.datavalue.type == 'monolingualtext' and snak.datavalue.value.language == lang then
		return true
	end
	return false
end

local function numval(claims, numval) -- retourn les numval premières valeurs de la table claims
    local numval = tonumber(numval) or 0 -- raise a error if numval is not a positive integer ?
    if #claims <= numval then
    	return claims
    end
    local newclaims = {}
    while #newclaims < numval do
    	table.insert(newclaims, claims[#newclaims + 1])
    end
    return newclaims
end

local function chronosort(claims, inverted)
	local function getTimestamp(claim)
		local claimqualifs = claim.qualifiers
		if not claimqualifs then
			return nil
		end
		for _, qualif in pairs(datequalifiers) do
			local vals = claimqualifs[qualif]
			if vals and basic.isValue(vals[1]) then
				return basic.getValue(vals[1]).time
			end
		end
	end
	table.sort(claims, function(a,b)
		local timeA = getTimestamp(a) or ''
		local timeB = getTimestamp(b) or ''
		if inverted then
			return timeA > timeB
		else
			return timeB > timeA
		end
		end
	)
	return claims
end

function p.sortclaims(claims, sorttype)
	if sorttype == 'chronological' then
		return chronosort(claims)
	elseif sorttype == 'inverted' then
		return chronosort(claims, true)
	elseif type(sorttype) == 'function' then
		table.sort(claims, sorttype)
		return claims
	end
	return claims
end

function p.getClaims( args ) -- returns a table of the claims matching some conditions given in args
	if args.claims then -- if claims have already been set, return them
		return args.claims
	end
	if not args.property then
	return error( 'property-param-not-provided' )
	end
	if type(args.property) == 'table' then
		return severalProperties(args)
	end
	--Get entity
	local entity = args.entity
 	if type(entity) ~= 'table' then
        entity = mw.wikibase.getEntityObject( args.entity )
    end
	if (not entity) or (not entity.claims) then
		return nil
	end
	local property = string.upper(args.property)
	if not entity.claims[property] then
		return nil
	end
	if not args.rank then
		args.rank = 'best'
	end
	local claims = {}
    -- ~= '' lorsque le paramètre est écrit mais laissé blanc dans une fonction frame
    for i, claim in pairs(entity.claims[property]) do
    	if
    		(
    		not args.excludespecial
    		or
    		not (basic.isSpecial(claim.mainsnak))
    		)
    	and
    		(
			not args.targetvalue
			or
			hastargetvalue(claim, args.targetvalue)
			)
    	and
    		(
    		not args.qualifier
    		or
    		hasqualifier(args.qualifier, args.qualifiervalue or args.qualifiervalues)
    		)
		and
			(
			not args.source
			or
			hassource(claim, args.source, args.sourceproperty)
			)
		and
			not args.isinlanguage
			or
			isinlanguage(claim.mainsnak, args.isinlanguage)
		and
			args.rank == 'best' -- rank == best est traité à a fin
			or
			hasrank(claim, rank)
		then
			table.insert(claims, claim)
		end
	end
	if #claims == 0 then
		return nil
	end
    if args.rank == 'best' then
    	claims = bestranked(claims)
    end
    if args.sorttype then
    	claims = p.sortclaims(claims, args.sorttype)
    end

	if args.numval then
		return numval(claims, args.numval)
	end
	return claims
end

return p