« Module:Wikidata/Récup » : différence entre les versions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
| Ligne 1 : | Ligne 1 : | ||
local p = {} | local p = {} | ||
local datequalifiers = {'P585', 'P571', 'P580', 'P582'} | |||
local function severalProperties(args) | local function severalProperties(args) | ||
| Ligne 5 : | Ligne 6 : | ||
for i, j in pairs(args.property) do | for i, j in pairs(args.property) do | ||
newargs.property = j | newargs.property = j | ||
local | local newstatements = p.getstatements(newargs) | ||
if | if statements then | ||
return | return statements | ||
end | end | ||
end | end | ||
end | end | ||
local function hastargetvalue( | local function hastargetvalue(statement, target) | ||
if target == nil then | if target == nil then | ||
return true | return true | ||
end | end | ||
return samevalue( | return samevalue(statement.mainsnak, target) | ||
end | end | ||
local function hasrank( | local function hasrank(statement, target) | ||
if target == 'valid' then | if target == 'valid' then | ||
return hasrank( | return hasrank(statement, 'preferred') or hasrank(statement, 'normal') | ||
end | end | ||
if | if statement.rank == target then | ||
return true | return true | ||
end | end | ||
| Ligne 29 : | Ligne 30 : | ||
end | end | ||
local function bestranked( | local function bestranked(statements) | ||
if not | if not statements then | ||
return nil | return nil | ||
end | end | ||
local preferred, normal = {}, {} | local preferred, normal = {}, {} | ||
for i, j in pairs( | for i, j in pairs(statements) do | ||
if j.rank == 'preferred' then | if j.rank == 'preferred' then | ||
table.insert(preferred, j) | table.insert(preferred, j) | ||
| Ligne 48 : | Ligne 49 : | ||
end | end | ||
local function hasqualifier( | local function hasqualifier(statement, qualifier, qualifiervalues) | ||
local statementqualifs = statements.qualifiers | |||
if (not statementqualifs) or not(statementqualifs[qualifier]) then | |||
if not | |||
return false | return false | ||
end | end | ||
if (not qualifiervalues) or (qualifiervalues == {}) then | if (not qualifiervalues) or (qualifiervalues == {}) then | ||
return true -- si aucune valeur spécifique n'est exigée | return true -- si aucune valeur spécifique n'est exigée, c'est bon | ||
end | end | ||
| Ligne 66 : | Ligne 63 : | ||
end | end | ||
for i, j in pairs( | for i, j in pairs(statement.qualifiers[qualifier]) do | ||
local val = p.getRawvalue(j) | local val = p.getRawvalue(j) | ||
for k, l in pairs(qualifiervalues) do | for k, l in pairs(qualifiervalues) do | ||
| Ligne 77 : | Ligne 74 : | ||
end | end | ||
local function hassource(statement, | local function hassource(statement, targetsource, sourceproperty) | ||
sourceproperty = | sourceproperty = sourceproperty or 'P248' | ||
if not statement.references or not statement.references[sourceproperty] then | if not statement.references or not statement.references[sourceproperty] then | ||
return false | return false | ||
end | end | ||
if not | if not targetsource then -- si toutes les sources sont valides, du moment qu'elles utilisent sourceproperty | ||
return true | return true | ||
end | end | ||
for | for _, source in pairs(statement.references[sourceproperty]) do | ||
if | if (source.snaktype == 'value') and (source.datavalue.value['numeric-id'] == targetsource) then | ||
return true | return true | ||
end | end | ||
| Ligne 95 : | Ligne 91 : | ||
local function hasdate(statement) | 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 | return false | ||
end | end | ||
| Ligne 115 : | Ligne 117 : | ||
end | end | ||
local function numval( | 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 ? | local numval = tonumber(numval) or 0 -- raise a error if numval is not a positive integer ? | ||
if # | if #statements <= numval then | ||
return | return statements | ||
end | end | ||
local | local newstatements = {} | ||
while # | while #newstatements < numval do | ||
table.insert( | table.insert(newstatements, statements[#newstatements + 1]) | ||
end | end | ||
return | return newstatements | ||
end | end | ||
| Ligne 135 : | Ligne 137 : | ||
end | end | ||
local function chronosort( | local function chronosort(statements, inverted) | ||
table.sort( | 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 timeA = p.getDate(a) | ||
local timeB = p.getDate(b) | local timeB = p.getDate(b) | ||
| Ligne 146 : | Ligne 159 : | ||
end | end | ||
) | ) | ||
return | return statements | ||
end | end | ||
function p. | function p.sortstatements(statements, sorttype) | ||
if sorttype == 'chronological' then | if sorttype == 'chronological' then | ||
return chronosort( | return chronosort(statements) | ||
elseif sorttype == 'inverted' then | elseif sorttype == 'inverted' then | ||
return chronosort( | return chronosort(statements, true) | ||
elseif type(sorttype) == 'function' then | elseif type(sorttype) == 'function' then | ||
table.sort( | table.sort(statements, sorttype) | ||
return | return statements | ||
end | end | ||
return | return statements | ||
end | end | ||
function p. | function p.getstatements( args ) -- returns a table of the statements matching some conditions given in args | ||
if args. | if args.statements then -- if statements have already been set, return them | ||
return args. | return args.statements | ||
end | end | ||
if not args.property then | if not args.property then | ||
| Ligne 176 : | Ligne 189 : | ||
entity = mw.wikibase.getEntityObject( args.entity ) | entity = mw.wikibase.getEntityObject( args.entity ) | ||
end | end | ||
if (not entity) or (not entity. | if (not entity) or (not entity.statements) then | ||
return nil | return nil | ||
end | end | ||
local property = string.upper(args.property) | local property = string.upper(args.property) | ||
if not entity. | if not entity.statements[property] then | ||
return nil | return nil | ||
end | end | ||
| Ligne 186 : | Ligne 199 : | ||
args.rank = 'best' | args.rank = 'best' | ||
end | end | ||
local | local statements = {} | ||
-- ~= '' 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 | ||
for i, statement in pairs(entity. | for i, statement in pairs(entity.statements[property]) do | ||
if | if | ||
( | ( | ||
| Ligne 222 : | Ligne 235 : | ||
hasrank(statement, rank) | hasrank(statement, rank) | ||
then | then | ||
table.insert( | table.insert(statements, statement) | ||
end | end | ||
end | end | ||
if # | if #statements == 0 then | ||
return nil | return nil | ||
end | end | ||
if args.rank == 'best' then | if args.rank == 'best' then | ||
statements = bestranked(statements) | |||
end | end | ||
if args.sorttype then | if args.sorttype then | ||
statements = p.sortstatements(statements, args.sorttype) | |||
end | end | ||
if args.numval then | if args.numval then | ||
return numval( | return numval(statements, args.numval) | ||
end | end | ||
return | return statements | ||
end | end | ||
return p | return p | ||
Version du 17 août 2015 à 20:06
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