« Module:Wikidata/Récup » : différence entre les versions
Aucun résumé des modifications |
esssai |
||
| Ligne 48 : | Ligne 48 : | ||
local function hasqualifier(claim, qualifier, qualifiervalues) | local function hasqualifier(claim, qualifier, qualifiervalues) | ||
local claimqualifs = claim.qualifiers | local claimqualifs = string.upper(claim.qualifiers) | ||
if (not claimqualifs) or not(claimqualifs[qualifier]) then | if (not claimqualifs) or not(claimqualifs[qualifier]) then | ||
return false | return false | ||
| Ligne 183 : | Ligne 183 : | ||
return nil | return nil | ||
end | end | ||
if | if args.rank == 'best' then --rang par défaut, filré à la fin pour ne pas exlure les données de rang inférieur mais répondant à la requête | ||
args.rank = | args.rank = nil | ||
end | |||
local claims = entity.claims[property] | |||
if not claims then | |||
return nil | |||
end | end | ||
-- ~= '' lorsque le paramètre est écrit mais laissé blanc dans une fonction frame | -- ~= '' 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 | |||
targetvalue = {hastargetvalue, args.targetvalue}, | |||
rank = {hasrank, args.rank}, | |||
qualifier = {hasqualifier, args.qualifier, args.qualifiervalue}, | |||
source = {hassource, args.source, args.sourceproperty}, | |||
withdate = {hasdate}, | |||
isinlanguage = {'isinlanguagee', args.isinlanguage}, | |||
rank = {hasrank, args.rank}, | |||
} | |||
for arg, argval in pairs(args) do | |||
local filter = filters[arg] | |||
if filter then | |||
local valid = false | |||
for k, claim in pairs(claims) do | |||
local valid = filter[1](claim, filter[2], filter[3], filter[4]) | |||
if (not valid) then | |||
table.remove(claims, claim) | |||
end | |||
end | |||
end | |||
end | end | ||
if | if args.sorttype then | ||
claims = p.sortclaims(claims, args.sorttype) | |||
end | end | ||
if args.rank | if (not args.rank) then | ||
claims = bestranked(claims) | claims = bestranked(claims) | ||
end | end | ||
return claims | return claims | ||
end | end | ||
return p | return p | ||
Version du 18 août 2015 à 11:58
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 = string.upper(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 args.rank == 'best' then --rang par défaut, filré à la fin pour ne pas exlure les données de rang inférieur mais répondant à la requête args.rank = 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
targetvalue = {hastargetvalue, args.targetvalue}, rank = {hasrank, args.rank}, qualifier = {hasqualifier, args.qualifier, args.qualifiervalue}, source = {hassource, args.source, args.sourceproperty}, withdate = {hasdate}, isinlanguage = {'isinlanguagee', args.isinlanguage}, rank = {hasrank, args.rank}, }
for arg, argval in pairs(args) do local filter = filters[arg] if filter then local valid = false for k, claim in pairs(claims) do local valid = filter[1](claim, filter[2], filter[3], filter[4]) if (not valid) then table.remove(claims, claim) end end end
end if args.sorttype then claims = p.sortclaims(claims, args.sorttype) end
if (not args.rank) then claims = bestranked(claims) end
return claims end
return p