« Module:Wikidata/Récup » : différence entre les versions

De Lagny-sur-Marne Wiki
Aller à la navigation Aller à la recherche
0x010D (discussion | contributions)
Aucun résumé des modifications
0x010D (discussion | contributions)
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))
 
(54 versions intermédiaires par le même utilisateur non affichées)
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 tools = require "Module:Wikidata/Outils"
local datemod -- = require "Module:Date complexe" -- chargé uniquement si nécessaire


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


local function hastargetvalue(claim, target)
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 basic.getmainid(claim == target)
local id = tools.getMainId(claim)
local targets = tools.splitStr(targets)
return tools.isHere(targets, id) or tools.isSpecial(claim.mainsnak)
end
end


local function hasrank(claim, target)
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)
if target == 'valid' then
return tools.isSpecial(claim.mainsnak) or not ( hastargetvalue(claim, values) )
return hasrank(claim, 'preferred') or hasrank(claim, 'normal')
end
if claim.rank == target then
return true
end
return false
end
end


Ligne 47 : Ligne 37 :
end
end


local function hasqualifier(claim, qualifier, qualifiervalues)
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
local claimqualifs = claim.qualifiers
  if (not claimqualifs) or not(claimqualifs[qualifier]) then
  return false
if (not claimqualifs) then
  end
return false
end


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


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


  for i, j in pairs(claim.qualifiers[qualifier]) do
local function ok(qualif) -- vérification pour un qualificatif individuel
  local val = p.getRawvalue(j)
if not claimqualifs[qualif] then
  for k, l in pairs(qualifiervalues) do
return false
  if l == val then
end
  return true
if not (acceptedvals) then  -- si aucune valeur spécifique n'est demandée, OK
  end
return true
  end
end
  end
for i, wanted in pairs(acceptedvals) do
  return false
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'
sourceproperty = sourceproperty or 'P248'
if not claim.references or not claim.references[sourceproperty] then
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 not targetsource then -- si toutes les sources sont valides, du moment qu'elles utilisent sourceproperty
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(claim.references[sourceproperty]) do
targetsource = tools.splitStr(targetsource)
if basic.getId(source) == targetsource then
for _, source in pairs(candidates) do
return true
local s = tools.getId(source)
for i, target in pairs(targetsource) do
if s == target then return true end
end
end
end
end
return true
return false
end
end
local function excludequalifier(claim, qualifier, qualifiervalues)
return not p.hasqualifier(claim, qualifier, qualifiervalues)
end


local function hasdate(claim)
local function hasdate(claim)
Ligne 101 : Ligne 132 :
end
end


local function isinlanguage(snak, lang) -- ne fonctionne que pour les monolingualtext / étendre aux autres types en utilisant les qualifiers ?
local function haslink(claim, site, lang)
if basic.isSpecial(snak) then
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
return false
end
end
Ligne 111 : Ligne 154 :
end
end


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


local function chronosort(claims, inverted)
local function chronosort(claims, inverted)
local function getTimestamp(claim)
table.sort(
local claimqualifs = claim.qualifiers
claims,
if not claimqualifs then
function(a,b)
return nil
local timeA = valinQualif(a, datequalifiers) or ''
end
local timeB = valinQualif(b, datequalifiers) or ''
for _, qualif in pairs(datequalifiers) do
if inverted then
local vals = claimqualifs[qualif]
return timeA > timeB -- marche sauf pour les dates < 10 000 av-JC utiliser datemod.before produit un bug
if vals and basic.isValue(vals[1]) then
else
return basic.getValue(vals[1]).time
return timeB > timeA
end
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
end
)
)
return claims
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
end


function p.sortclaims(claims, sorttype)
function p.sortclaims(claims, sorttype)
if not claims then
return nil
end
if sorttype == 'chronological' then
if sorttype == 'chronological' then
return chronosort(claims)
return chronosort(claims)
Ligne 160 : Ligne 229 :
return claims
return claims
end
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
function p.getClaims( args ) -- returns a table of the claims matching some conditions given in args
Ligne 165 : Ligne 294 :
return args.claims
return args.claims
end
end
if not args.property then
local properties = tools.splitStr(args.property)
return error( 'property-param-not-provided' )
 
end
if not properties then
if type(args.property) == 'table' then
return error( 'property-param-not-provided' )
return severalProperties(args)
end
end
--Get entity
--Get entity
local entity = args.entity
local entity = args.entity
  if type(entity) ~= 'table' then
  entity = p.loadEntity(args.entity, args.cache)
        entity = mw.wikibase.getEntityObject( args.entity )
      
     end
if (not entity) or (not entity.claims) then
if (not entity) or (not entity.claims) then
return nil
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
end
local claims = {}
local claims = {}
    -- ~= '' lorsque le paramètre est écrit mais laissé blanc dans une fonction frame
for i, prop in pairs(properties) do
    for i, claim in pairs(entity.claims[property]) do
prop = string.upper(prop)
    if
for j, claim in pairs(entity.claims[prop] or {}) do
    (
    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)
table.insert(claims, claim)
end
end
end
end
if #claims == 0 then
 
if (#claims == 0) then
return nil
return nil
end
end
    if args.rank == 'best' then
return p.filterClaims(claims, args)
    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
end


return p
return p

Dernière version du 17 mai 2017 à 13:42

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