Module:Wikidata/Récup
Τεκμηρίωση module[δημιουργία]
Μπορείτε να συμβάλλετε στη δημιουργία σελίδας τεκμηρίωσης για αυτό το Scribunto module. Οι συντάκτες μπορούν να πειραματίζονται στο πρόχειρο (δημιουργία | αντίγραφο) και στις δοκιμαστικές σελίδες (δημιουργία) του module. Παρακαλούμε να προσθέτετε τις κατηγορίες στην υποσελίδα τεκμηρίωσης. Υποσελίδες αυτού του module. |
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 claims = p.getClaims(newargs)
if claims then
return claims
end
end
end
function notSpecial(claim)
return basic.isValue(claim.mainsnak)
end
local function hastargetvalue(claim, target)
return basic.getMainId(claim) == target
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 withrank(claims, target)
if target == 'best' then
return bestranked(claims)
end
local newclaims = {}
for pos, claim in pairs(claims) do
if target == 'valid' then
if claim.rank ~= 'deprecated' then
table.insert(newclaims, claim)
end
elseif claim.rank == target then
table.insert(newclaims, claim)
end
end
return newclaims
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 = basic.getId(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 firstvals(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 not claims then
return nil
end
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 not claims then
return nil
end
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
local claims = entity.claims[property]
if not claims then
return nil
end
-- ~= '' lorsque le paramètre est écrit mais laissé blanc dans une fonction frame
local filters = { -- liste des arguments déclenchat un filtre des données
--[numéro] = {param déclenche, fonction à utiliser, paramètres à utiliser}
[1] = {
'targetvalue',
hastargetvalue,
{'targetvalue'}
},
[3] = {
'qualifier',
hasqualifier,
{'qualifier', 'qualifiervalue'}
},
[4] = {
'source',
hassource,
{'source', 'sourceproperty'}
},
[5] = {
'withdate',
hasdate,
{},
},
[6] = {
'excludespecial',
notSpecial,
{},
},
}
for i, filter in pairs(filters) do
if args[filter[1]] then
local newclaims = {}
local filterfun = filter[2]
local filterarg1, filterarg2, filterarg3 = args[filter[3][1]], args[filter[3][2]], args[filter[3][3]]
for pos, claim in pairs(claims) do
if filterfun(claim, filterarg1, filterarg2, fiterarg3) == true then
table.insert(newclaims, claim)
end
end
claims = newclaims
end
end
claims = withrank(claims, args.rank or 'best')
if args.sorttype then
claims = p.sortclaims(claims, args.sorttype)
end
if args.numval then
claims = firstvals(claims, args.numval)
end
return claims
end
return p