Module:Wikidata/Récup : Différence entre versions
(correction - test sur une vraie page cette fois) |
m (A changé le niveau de protection pour « Module:Wikidata/Récup » ([Modifier=Autoriser uniquement les utilisateurs autopatrolled] (infini) [Renommer=Autoriser uniquement les administrateurs] (infini))) |
||
(32 révisions intermédiaires par 4 utilisateurs non affichées) | |||
Ligne 2 : | Ligne 2 : | ||
local datequalifiers = {'P585', 'P571', 'P580', 'P582'} | local datequalifiers = {'P585', 'P571', 'P580', 'P582'} | ||
local tools = require "Module:Wikidata/Outils" | local tools = require "Module:Wikidata/Outils" | ||
− | local datemod = require "Module:Date complexe" | + | local datemod -- = require "Module:Date complexe" -- chargé uniquement si nécessaire |
− | local function | + | local function notSpecial(claim) |
− | + | return tools.isValue(claim.mainsnak) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end | end | ||
− | function | + | 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 |
− | return tools. | + | local id = tools.getMainId(claim) |
+ | local targets = tools.splitStr(targets) | ||
+ | return tools.isHere(targets, id) or tools.isSpecial(claim.mainsnak) | ||
end | end | ||
− | local function | + | 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) |
− | return tools. | + | return tools.isSpecial(claim.mainsnak) or not ( hastargetvalue(claim, values) ) |
end | end | ||
Ligne 59 : | Ligne 54 : | ||
end | end | ||
− | + | function p.hasqualifier(claim, acceptedqualifs, acceptedvals, excludequalifiervalues) | |
local claimqualifs = claim.qualifiers | local claimqualifs = claim.qualifiers | ||
− | + | ||
− | + | if (not claimqualifs) then | |
− | + | return false | |
+ | end | ||
− | + | acceptedqualifs = tools.splitStr(acceptedqualifs) | |
− | + | acceptedvals = tools.splitStr( acceptedvals) | |
− | |||
− | |||
− | |||
− | |||
− | + | local function ok(qualif) -- vérification pour un qualificatif individuel | |
− | + | if not claimqualifs[qualif] then | |
− | + | return false | |
− | + | end | |
− | + | if not (acceptedvals) then -- si aucune valeur spécifique n'est demandée, OK | |
− | + | return true | |
− | + | end | |
− | + | for i, wanted in pairs(acceptedvals) do | |
− | + | for j, actual in pairs(claimqualifs[qualif]) do | |
+ | if tools.getId(actual) == wanted then | ||
+ | return true | ||
+ | end | ||
+ | end | ||
+ | end | ||
+ | end | ||
+ | |||
+ | for i, qualif in pairs(acceptedqualifs) do | ||
+ | if ok(qualif) then | ||
+ | return true | ||
+ | end | ||
+ | end | ||
+ | return false | ||
end | end | ||
local function hassource(claim, targetsource, sourceproperty) | local function hassource(claim, targetsource, sourceproperty) | ||
− | + | sourceproperty = sourceproperty or 'P248' | |
− | if not claim.references | + | if targetsource == "-" then |
+ | return true | ||
+ | end | ||
+ | if (not claim.references) then return | ||
+ | false | ||
+ | end | ||
+ | local candidates = claim.references[1].snaks[sourceproperty] -- les snaks utilisant la propriété demandée | ||
+ | if (not candidates) then | ||
return false | return false | ||
end | end | ||
− | if | + | if (targetsource == "any") then -- si n'importe quelle valeur est acceptée tant qu'elle utilise en ref la propriété demandée |
return true | return true | ||
end | end | ||
− | for _, source in pairs( | + | targetsource = tools.splitStr(targetsource) |
− | + | for _, source in pairs(candidates) do | |
− | + | local s = tools.getId(source) | |
+ | for i, target in pairs(targetsource) do | ||
+ | if s == target then return true end | ||
end | end | ||
end | end | ||
− | return | + | return false |
+ | end | ||
+ | |||
+ | local function excludequalifier(claim, qualifier, qualifiervalues) | ||
+ | return not p.hasqualifier(claim, qualifier, qualifiervalues) | ||
end | end | ||
+ | |||
local function hasdate(claim) | local function hasdate(claim) | ||
Ligne 124 : | Ligne 143 : | ||
end | end | ||
− | local function isinlanguage( | + | local function isinlanguage(claim, lang) -- ne fonctionne que pour les monolingualtext / étendre aux autres types en utilisant les qualifiers ? |
+ | local snak = claim.mainsnak | ||
if tools.isSpecial(snak) then | if tools.isSpecial(snak) then | ||
return false | return false | ||
Ligne 139 : | Ligne 159 : | ||
return nil | return nil | ||
end | end | ||
− | + | while (#claims > numval) do | |
− | + | table.remove(claims) | |
end | end | ||
− | + | return claims | |
− | |||
− | |||
− | |||
− | |||
end | end | ||
Ligne 169 : | Ligne 185 : | ||
local timeB = valinQualif(b, datequalifiers) or '' | local timeB = valinQualif(b, datequalifiers) or '' | ||
if inverted then | if inverted then | ||
− | return timeA | + | return timeA > timeB -- marche sauf pour les dates < 10 000 av-JC utiliser datemod.before produit un bug |
else | else | ||
return timeB > timeA | return timeB > timeA | ||
Ligne 179 : | Ligne 195 : | ||
local function atDate(claim, mydate) | local function atDate(claim, mydate) | ||
+ | if mydate == "today" then | ||
+ | mydate = os.date("!%Y-%m-%dT%TZ") | ||
+ | end | ||
local newclaims = {} | local newclaims = {} | ||
local mindate = valinQualif(claim, {'P580'}) | local mindate = valinQualif(claim, {'P580'}) | ||
local maxdate = valinQualif(claim, {'P582'}) | local maxdate = valinQualif(claim, {'P582'}) | ||
+ | datemod = require "Module:Date complexe" | ||
if datemod.before(mydate, mindate) and datemod.before(maxdate, mydate) then | if datemod.before(mydate, mindate) and datemod.before(maxdate, mydate) then | ||
return true | return true | ||
Ligne 187 : | Ligne 207 : | ||
end | end | ||
− | local function | + | local function check(claim, condition) |
− | + | if type(condition) == 'function' then -- cas standard | |
− | + | return condition(claim) | |
− | |||
− | |||
− | |||
end | end | ||
− | return | + | local msg = "args.condition should be a function" |
+ | return error(msg) | ||
end | end | ||
Ligne 214 : | Ligne 232 : | ||
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 | 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 | ||
− | + | ||
local function filter(condition, filterfunction, funargs) | local function filter(condition, filterfunction, funargs) | ||
if not args[condition] then | if not args[condition] then | ||
return | return | ||
end | end | ||
− | + | for i = #claims, 1, -1 do | |
− | + | if not( filterfunction(claims[i], args[funargs[1]], args[funargs[2]], args[funargs[3]]) ) then | |
− | for i, | + | table.remove(claims, i) |
− | if filterfunction( | ||
− | table. | ||
end | end | ||
end | end | ||
− | |||
− | |||
end | end | ||
filter('targetvalue', hastargetvalue, {'targetvalue'} ) | filter('targetvalue', hastargetvalue, {'targetvalue'} ) | ||
+ | filter('isinlang', isinlanguage, {'isinlang'} ) | ||
filter('atdate', atDate, {'atdate'} ) | filter('atdate', atDate, {'atdate'} ) | ||
− | filter('qualifier', hasqualifier, {'qualifier', 'qualifiervalue'} ) | + | filter('qualifier', p.hasqualifier, {'qualifier', 'qualifiervalue'} ) |
− | filter(' | + | filter('excludequalifier', excludequalifier, {'excludequalifier', 'excludequalifiervalue'} ) |
+ | filter('withsource', hassource, {'withsource', 'sourceproperty'} ) | ||
filter('withdate', hasdate, {} ) | filter('withdate', hasdate, {} ) | ||
− | |||
filter('excludespecial', notSpecial, {} ) | filter('excludespecial', notSpecial, {} ) | ||
filter('excludevalues', excludevalues, {'excludevalues'}) | filter('excludevalues', excludevalues, {'excludevalues'}) | ||
filter('withlink', haslink, {'withlink', 'linklang'} ) | filter('withlink', haslink, {'withlink', 'linklang'} ) | ||
+ | filter('condition', check, {'condition'}) | ||
claims = withrank(claims, args.rank or 'best') | claims = withrank(claims, args.rank or 'best') | ||
Ligne 263 : | Ligne 279 : | ||
return cache[entity] | return cache[entity] | ||
else | else | ||
+ | if entity == '' then | ||
+ | entity = nil | ||
+ | end | ||
return mw.wikibase.getEntity(entity) | return mw.wikibase.getEntity(entity) | ||
end | end | ||
Ligne 275 : | Ligne 294 : | ||
return args.claims | return args.claims | ||
end | end | ||
− | + | local properties = tools.splitStr(args.property) | |
− | + | ||
− | + | if not properties then | |
− | + | return error( 'property-param-not-provided' ) | |
− | |||
end | end | ||
+ | |||
--Get entity | --Get entity | ||
local entity = args.entity | local entity = args.entity | ||
Ligne 288 : | Ligne 307 : | ||
return nil | return nil | ||
end | end | ||
− | local | + | local claims = {} |
− | + | for i, prop in pairs(properties) do | |
− | + | prop = string.upper(prop) | |
+ | for j, claim in pairs(entity.claims[prop] or {}) do | ||
+ | table.insert(claims, claim) | ||
+ | end | ||
end | end | ||
− | + | ||
− | if | + | if (#claims == 0) then |
return nil | return nil | ||
end | end |
Version actuelle datée du 17 mai 2017 à 13:42
La documentation pour ce module peut être créée à Module:Wikidata/Récup/doc
local p = {} local datequalifiers = {'P585', 'P571', 'P580', 'P582'} local tools = require "Module:Wikidata/Outils" local datemod -- = require "Module:Date complexe" -- chargé uniquement si nécessaire local function notSpecial(claim) return tools.isValue(claim.mainsnak) end 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 local id = tools.getMainId(claim) local targets = tools.splitStr(targets) return tools.isHere(targets, id) or tools.isSpecial(claim.mainsnak) end 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) return tools.isSpecial(claim.mainsnak) or not ( hastargetvalue(claim, values) ) 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 function p.hasqualifier(claim, acceptedqualifs, acceptedvals, excludequalifiervalues) local claimqualifs = claim.qualifiers if (not claimqualifs) then return false end acceptedqualifs = tools.splitStr(acceptedqualifs) acceptedvals = tools.splitStr( acceptedvals) local function ok(qualif) -- vérification pour un qualificatif individuel if not claimqualifs[qualif] then return false end if not (acceptedvals) then -- si aucune valeur spécifique n'est demandée, OK return true end for i, wanted in pairs(acceptedvals) do for j, actual in pairs(claimqualifs[qualif]) do if tools.getId(actual) == wanted then return true end end end end for i, qualif in pairs(acceptedqualifs) do if ok(qualif) then return true end end return false end local function hassource(claim, targetsource, sourceproperty) sourceproperty = sourceproperty or 'P248' if targetsource == "-" then return true end if (not claim.references) then return false end local candidates = claim.references[1].snaks[sourceproperty] -- les snaks utilisant la propriété demandée if (not candidates) then return false end if (targetsource == "any") then -- si n'importe quelle valeur est acceptée tant qu'elle utilise en ref la propriété demandée return true end targetsource = tools.splitStr(targetsource) for _, source in pairs(candidates) do local s = tools.getId(source) for i, target in pairs(targetsource) do if s == target then return true end end end return false end local function excludequalifier(claim, qualifier, qualifiervalues) return not p.hasqualifier(claim, qualifier, qualifiervalues) 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 haslink(claim, site, lang) if not(tools.isValue(claim.mainsnak)) then -- ne pas supprimer les valeurs spéciales, il y a une fonction dédiée pour ça return true end local id = tools.getMainId(claim) local link = tools.siteLink(id, site, lang) if link then return true end end local function isinlanguage(claim, lang) -- ne fonctionne que pour les monolingualtext / étendre aux autres types en utilisant les qualifiers ? local snak = claim.mainsnak if tools.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 while (#claims > numval) do table.remove(claims) end return claims end local function valinQualif(claim, qualifs) local claimqualifs = claim.qualifiers if not claimqualifs then return nil end for i, qualif in pairs(qualifs) do local vals = claimqualifs[qualif] if vals and tools.isValue(vals[1]) then return tools.getValue(vals[1]).time end end end local function chronosort(claims, inverted) table.sort( claims, function(a,b) local timeA = valinQualif(a, datequalifiers) or '' local timeB = valinQualif(b, datequalifiers) or '' if inverted then return timeA > timeB -- marche sauf pour les dates < 10 000 av-JC utiliser datemod.before produit un bug else return timeB > timeA end end ) return claims end local function atDate(claim, mydate) if mydate == "today" then mydate = os.date("!%Y-%m-%dT%TZ") end local newclaims = {} local mindate = valinQualif(claim, {'P580'}) local maxdate = valinQualif(claim, {'P582'}) datemod = require "Module:Date complexe" if datemod.before(mydate, mindate) and datemod.before(maxdate, mydate) then return true end end local function check(claim, condition) if type(condition) == 'function' then -- cas standard return condition(claim) end local msg = "args.condition should be a function" return error(msg) 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.filterClaims(claims, args) --retire de la tables de claims celles qui sont éliminés par un des filters de la table des filters local function filter(condition, filterfunction, funargs) if not args[condition] then return end for i = #claims, 1, -1 do if not( filterfunction(claims[i], args[funargs[1]], args[funargs[2]], args[funargs[3]]) ) then table.remove(claims, i) end end end filter('targetvalue', hastargetvalue, {'targetvalue'} ) filter('isinlang', isinlanguage, {'isinlang'} ) filter('atdate', atDate, {'atdate'} ) filter('qualifier', p.hasqualifier, {'qualifier', 'qualifiervalue'} ) filter('excludequalifier', excludequalifier, {'excludequalifier', 'excludequalifiervalue'} ) filter('withsource', hassource, {'withsource', 'sourceproperty'} ) filter('withdate', hasdate, {} ) filter('excludespecial', notSpecial, {} ) filter('excludevalues', excludevalues, {'excludevalues'}) filter('withlink', haslink, {'withlink', 'linklang'} ) filter('condition', check, {'condition'}) claims = withrank(claims, args.rank or 'best') if args.sorttype then claims = p.sortclaims(claims, args.sorttype) end if #claims == 0 then return nil end if args.numval then claims = firstvals(claims, args.numval) end return claims end function p.loadEntity(entity, cache) if type(entity) ~= 'table' then if cache then if not cache[entity] then cache[entity] = mw.wikibase.getEntity(entity) mw.log("cached") end return cache[entity] else if entity == '' then entity = nil end return mw.wikibase.getEntity(entity) end else return entity end 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 local properties = tools.splitStr(args.property) if not properties then return error( 'property-param-not-provided' ) end --Get entity local entity = args.entity entity = p.loadEntity(args.entity, args.cache) if (not entity) or (not entity.claims) then return nil end local claims = {} for i, prop in pairs(properties) do prop = string.upper(prop) for j, claim in pairs(entity.claims[prop] or {}) do table.insert(claims, claim) end end if (#claims == 0) then return nil end return p.filterClaims(claims, args) end return p