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

De Lagny-sur-Marne Wiki
Aller à la navigation Aller à la recherche
0x010D (discussion | contributions)
+ fonction atdate (date où l'affirmation doit être valable), restructuration mineure
0x010D (discussion | contributions)
Annulation des modifications 118504918 de Zolo (d)
Ligne 3 : Ligne 3 :
local basic = require "Module:Wikibase"
local basic = require "Module:Wikibase"
local entities = require "Module:Wikidata/Formatage entité"
local entities = require "Module:Wikidata/Formatage entité"
local datemod = require "Module:Date complexe"


local function severalProperties(args)
local function severalProperties(args)
Ligne 17 : Ligne 16 :


function notSpecial(claim)
function notSpecial(claim)
return basic.isValue(claim.mainsnak)
return basic.isValue(claim.mainsnak)
end
end


Ligne 150 : Ligne 149 :
end
end


local function valinQualif(claim, qualifs)
local function chronosort(claims, inverted)
local claimqualifs = claim.qualifiers
local function getTimestamp(claim)
if not claimqualifs then
local claimqualifs = claim.qualifiers
return nil
if not claimqualifs then
end
return nil
for i, qualif in pairs(qualifs) do
end
local vals = claimqualifs[qualif]
for _, qualif in pairs(datequalifiers) do
if vals and basic.isValue(vals[1]) then
local vals = claimqualifs[qualif]
return basic.getValue(vals[1]).time
if vals and basic.isValue(vals[1]) then
return basic.getValue(vals[1]).time
end
end
end
end
end
end
local function chronosort(claims, inverted)
table.sort(claims, function(a,b)
table.sort(claims, function(a,b)
local timeA = valinQualif(a, datequalifiers)
local timeA = getTimestamp(a) or ''
local timeB = valinQualif(b, datequalifiers)
local timeB = getTimestamp(b) or ''
if inverted then
if inverted then
return datemod.before(timeA, timeB)
return timeA > timeB
else
else
return datemod.before(timeB, timeA)
return timeB > timeA
end
end
end
end
)
)
return claims
return claims
end
local function atDate(claim, mydate)
local newclaims = {}
local mindate = valinQualif(claim, {'P580'})
local maxdate = valinQualif(claim, {'P582'})
if datemod.before(mydate, mindate) and datemod.before(maxdate, mydate) then
return true
end
end
end


Ligne 201 : Ligne 189 :
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
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


local newclaims = {}
    local filters = { -- liste des arguments déclenchat un filtre des données
for i, claim in pairs(claims) do
    --[numéro] = {
if filterfunction(claim, args[funargs[1]], args[funargs[2]], args[funargs[3]]) then
    --param déclencheue,
table.insert(newclaims, claim)
    -- 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,
{},
},
[7] = { --vers la fin, peut-être coûteux
'withlink',
haslink,
{'withlink', 'linklang'},
},
}
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
end
claims = newclaims
end
end
claims = newclaims
end
end
 
filter('targetvalue', hastargetvalue, {'targetvalue'} )
filter('atdate', atDate, {'atdate'} )
filter('qualifier', hasqualifier, {'qualifier', 'qualifiervalue'} )
filter('source', hassource, {'source', 'sourceproperty'} )
filter('withdate', hasdate, {} )
filter('targetvalue', hastargetvalue, {'targetvalue'} )
filter('excludespecial', notSpecial, {} )
filter('withlink', haslink, {'withlink', 'linklang'} )
 
claims = withrank(claims, args.rank or 'best')
claims = withrank(claims, args.rank or 'best')
if args.sorttype then
if args.sorttype then

Version du 9 septembre 2015 à 21:29

local p = {} local datequalifiers = {'P585', 'P571', 'P580', 'P582'} local basic = require "Module:Wikibase" local entities = require "Module:Wikidata/Formatage entité"

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 haslink(claim, site, lang) if not(basic.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 = basic.getMainId(claim) local link = entities.getLink(id, site, lang) if link then return true end 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.filterClaims(claims, args) --retire de la tables de claims celles qui sont éliminés par un des filters de la table des filters

   local filters = { -- liste des arguments déclenchat un filtre des données
   	--[numéro] = {
   		--param déclencheue,
   		-- 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, {}, }, [7] = { --vers la fin, peut-être coûteux 'withlink', haslink, {'withlink', 'linklang'}, }, } 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 #claims == 0 then return nil end if args.numval then claims = firstvals(claims, args.numval) 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 return p.filterClaims(claims, args) end

return p