« Module:Utilitaire Wikidata » : différence entre les versions
m A protégé « Module:Utilitaire Wikidata » : Modèle très utilisé ([Modifier=Autoriser uniquement les utilisateurs autoconfirmés] (infini) [Renommer=Autoriser uniquement les utilisateurs autoconfirmés] (infini)) |
Aucun résumé des modifications |
||
| Ligne 2 : | Ligne 2 : | ||
local p = {} | local p = {} | ||
local wikidata = require "Module:Wikidata" | local wikidata = require "Module:Wikidata" | ||
local linguistic = require "Module:Linguistique" | |||
local function keydate (event) | local function keydate (event) | ||
if type(event) ~= 'string' then | if type(event) ~= 'string' then | ||
| Ligne 13 : | Ligne 13 : | ||
else | else | ||
return error('event string should start with P or S, is "' .. event .. '"') | return error('event string should start with P or S, is "' .. event .. '"') | ||
end | |||
end | |||
function p.wikidatadate(prop, item, options) -- formate un statmement de type date en prenant en compte certains qualificatifs | |||
options = options or {} | |||
local vals = wikidata.getClaims{entity = item, property = prop} | |||
if not vals then | |||
return nil | |||
end | |||
local newvals = {} | |||
for i, val in pairs(vals) do | |||
local v = wikidata.getFormattedDate(val, options) --cherche d'abord une date dans les qualificatifs date de début / date de fin | |||
if not v then -- sinon, dans le mainsnak | |||
if val.mainsnak.snaktype ~= 'value' then | |||
v = wikidata.formatStatement(val, options) | |||
elseif val.mainsnak.datavalue.value.precision > 7 then | |||
v = wikidata.formatStatement(val, options) | |||
end | |||
end | |||
if v and val.qualifiers and val.qualifiers.P1480 then | |||
local q = wikidata.getid( val.qualifiers.P1480[1]) | |||
if q == 'Q5727902' then | |||
v = 'vers ' .. v | |||
end | |||
end | |||
if v then | |||
table.insert(newvals, v) | |||
end | |||
end | |||
local str = linguistic.conj(newvals, 'or') | |||
if str then | |||
return wikidata.formatStatements{entity = item, property = prop, value = str, conjtype = 'or', linkback = options.linkback or true, addcat = options.addcat or true} | |||
end | end | ||
end | end | ||
function p.maindate(entity) -- à améliorer en utilisant module:Date complexe comme pour wikidata.getDate | function p.maindate(entity) -- à améliorer en utilisant module:Date complexe comme pour wikidata.getDate | ||
local startpoint = | |||
local endpoint = | -- essaye P580/P582 | ||
local startpoint = p.wikidatadate('P580', entity, {linkback = "-"}) | |||
local endpoint = p.wikidatadate('P582', entity, {linkback = "-"}) | |||
local str | local str | ||
if startpoint or endpoint then | if startpoint or endpoint then | ||
| Ligne 24 : | Ligne 60 : | ||
str = wikidata.addLinkback(str, entity, 'P582') | str = wikidata.addLinkback(str, entity, 'P582') | ||
end | end | ||
if | |||
str | if str then | ||
return str | |||
end | end | ||
-- défaut : P585 | |||
return p.wikidatadate('P585', entity) | |||
return | |||
end | end | ||
Version du 31 janvier 2016 à 17:36
-- Module de requêtes Wikidata de plus haut niveau que Module:Wikidata local p = {} local wikidata = require "Module:Wikidata" local linguistic = require "Module:Linguistique" local function keydate (event) if type(event) ~= 'string' then return error('event should be a string starting with a P or S, datatype is ' .. type(event)) end if string.sub(event, 1, 1) == 'Q' then -- on demande un élément utilisé dans P:P793 (événement clé) return wikidata.getTheDate{property = 'P793', targetvalue = event, addcat = true, entity = item} elseif string.sub(event, 1, 1) == 'P' then -- on demande une propriété return wikidata.formatAndCat{property = event, entity = item} else return error('event string should start with P or S, is "' .. event .. '"') end end
function p.wikidatadate(prop, item, options) -- formate un statmement de type date en prenant en compte certains qualificatifs options = options or {} local vals = wikidata.getClaims{entity = item, property = prop} if not vals then return nil end local newvals = {} for i, val in pairs(vals) do local v = wikidata.getFormattedDate(val, options) --cherche d'abord une date dans les qualificatifs date de début / date de fin
if not v then -- sinon, dans le mainsnak if val.mainsnak.snaktype ~= 'value' then v = wikidata.formatStatement(val, options) elseif val.mainsnak.datavalue.value.precision > 7 then v = wikidata.formatStatement(val, options) end end
if v and val.qualifiers and val.qualifiers.P1480 then local q = wikidata.getid( val.qualifiers.P1480[1]) if q == 'Q5727902' then v = 'vers ' .. v end end if v then table.insert(newvals, v) end end local str = linguistic.conj(newvals, 'or') if str then return wikidata.formatStatements{entity = item, property = prop, value = str, conjtype = 'or', linkback = options.linkback or true, addcat = options.addcat or true} end end
function p.maindate(entity) -- à améliorer en utilisant module:Date complexe comme pour wikidata.getDate
-- essaye P580/P582 local startpoint = p.wikidatadate('P580', entity, {linkback = "-"}) local endpoint = p.wikidatadate('P582', entity, {linkback = "-"}) local str if startpoint or endpoint then str = (startpoint or ) .. ' - ' .. (endpoint or ) str = wikidata.addLinkback(str, entity, 'P582') end
if str then return str end -- défaut : P585 return p.wikidatadate('P585', entity) end
function p.addLinkback(str, entity, property) return wikidata.addLinkback(str, entity, property) end
function p.addtrackingcat(prop, cat) return wikidata.addtrackingcat(prop, cat) end
function p.keydate(events) if type(events) == 'nil' then return nil end if type(events) == 'string' then return keydate(events) elseif type(events) == 'table' then for i, j in pairs(events) do local val = keydate(j) if val then return val end end end end function p.getClaims(args) return wikidata.getClaims(args) end function p._formatStatements(args) return wikidata._formatStatements(args) end function p.formatAndCat(args) return wikidata.formatAndCat(args) end
return p