Module:Wikidata/Récup

De Lagny-sur-Marne Wiki
Aller à la navigation Aller à la recherche

local p = {} local datequalifiers = {'P585', 'P571', 'P580', 'P582'}

local function severalProperties(args) local newargs = args for i, j in pairs(args.property) do newargs.property = j local newstatements = p.getstatements(newargs) if statements then return statements end end end

local function hastargetvalue(statement, target) if target == nil then return true end return samevalue(statement.mainsnak, target) end

local function hasrank(statement, target) if target == 'valid' then return hasrank(statement, 'preferred') or hasrank(statement, 'normal') end if statement.rank == target then return true end return false end

local function bestranked(statements) if not statements then return nil end local preferred, normal = {}, {} for i, j in pairs(statements) 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(statement, qualifier, qualifiervalues) local statementqualifs = statements.qualifiers

  	if (not statementqualifs) or not(statementqualifs[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(statement.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(statement, targetsource, sourceproperty)

   sourceproperty = sourceproperty or 'P248'

if not statement.references or not statement.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(statement.references[sourceproperty]) do if (source.snaktype == 'value') and (source.datavalue.value['numeric-id'] == targetsource) then return true end end return true end

local function hasdate(statement) local statementqualifs = statements.qualifiers if not statementqualifs then return false end for _, qualif in pairs(statementqualifs) do if statementsqualifs[qualif] and statementsqualifs[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 snak.snaktype == 'value' and snak.datavalue.type == 'monolingualtext' and snak.datavalue.value.language == lang then return true end return false end

local function isSpecial(snak) if snak.snaktype == 'value' then return false end return true end

local function numval(statements, numval) -- retourn les numval premières valeurs de la table statements

   local numval = tonumber(numval) or 0 -- raise a error if numval is not a positive integer ?
   if #statements <= numval then
   	return statements
   end
   local newstatements = {}
   while #newstatements < numval do
   	table.insert(newstatements, statements[#newstatements + 1])
   end
   return newstatements

end

local function comparedate(a, b) -- returns true if a is earlier than B or if a has a date but not b if a and b then return a.timestamp < b.timestamp elseif a then return true end end

local function chronosort(statements, inverted) local function getTimestamp(statement) local statementqualifs = statements.qualifiers if not statementqualif then return nil end for _, qualif in pairs(datequalifiers) do if statementqualif[qualif] and statementqualif[1].snaktype == 'value' then return statementqualif[1].datavalue.value end end end table.sort(statements, function(a,b) local timeA = p.getDate(a) local timeB = p.getDate(b) if inverted then return comparedate(timeB, timeA) else return comparedate(timeA, timeB) end end ) return statements end

function p.sortstatements(statements, sorttype) if sorttype == 'chronological' then return chronosort(statements) elseif sorttype == 'inverted' then return chronosort(statements, true) elseif type(sorttype) == 'function' then table.sort(statements, sorttype) return statements end return statements end

function p.getstatements( args ) -- returns a table of the statements matching some conditions given in args if args.statements then -- if statements have already been set, return them return args.statements end if not args.property then return formatError( '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.statements) then return nil end local property = string.upper(args.property) if not entity.statements[property] then return nil end if not args.rank then args.rank = 'best' end local statements = {}

   -- ~=  lorsque le paramètre est écrit mais laissé blanc dans une fonction frame
   for i, statement in pairs(entity.statements[property]) do
   	if
   		(
   		not args.excludespecial
   		or
   		not (isSpecial(statement.mainsnak))
   		)
   	and
   		(

not args.targetvalue or hastargetvalue(statement, args.targetvalue) )

   	and
   		(
   		not args.qualifier
   		or
   		hasqualifier(statement, args.qualifier, args.qualifiervalue or args.qualifiervalues)
   		)

and ( not args.source or hassource(statement, args.source, args.sourceproperty) ) and not args.isinlanguage or isinlanguage(statement.mainsnak, args.isinlanguage) and args.rank == 'best' -- rank == best est traité à a fin or hasrank(statement, rank) then table.insert(statements, statement) end end if #statements == 0 then return nil end

   if args.rank == 'best' then
   	statements = bestranked(statements)
   end
   if args.sorttype then
   	statements = p.sortstatements(statements, args.sorttype)
   end

if args.numval then return numval(statements, args.numval) end return statements end

return p