Mòdul:ItemClass
A continuació es mostra la documentació transclosa de la subpàgina /ús. [salta a la caixa de codi]
Classificador d'ítems de Wikidata.
El propòsit és classificar un ítem de Wikidata segons una taula de definició a Mòdul:ItemClass/tables. Per a una propietat determinada cerca si existeix en la taula el seu valor en l'element o en els elements superiors. En cas afirmatiu retorna el text de la taula, en cas negatiu retorna el text de la definició "default" o bé no res.
Primer, cal definir una taula per al nostre propòsit. La taula "test" serveix per a proves o demostracions i com a model per a copiar i enganxar en una nova taula. Definiu-la amb un nom entenedor, ja que s'usarà com a paràmetre. Per exemple en lloc de test
podria ser infobox
per a classificar tipus d'infotaules. El títol "infobox" en aquest cas servirà per a indicar el tipus de consulta a fer.
Sintaxi:
- Des d'una pàgina wiki, per exemple una plantilla:
{{#invoke:ItemClass|main|paràmetres}}
- Des d'un altre mòdul amb Lua:
require("Mòdul:ItemClass").main{paràmetres}
Paràmetres:
1
: tipus de consulta. En l'exemple de més amunt seria "infobox".item
: identificador Qid de l'ítem, si és diferent de l'associat a la pàgina.pid
: identificador Pid de la propietat a consultar. Per defecte és Subclasse de (P279). En cas de no trobar la propietat, segueix amb Instància de (P31).
Exemples (en general no caldrà item):
- Per Emmanuel Macron (Q3052772) amb Instància de (P31) = Ésser humà (Q5) i ["person"] = {"Q5"}
{{#invoke:ItemClass|main|test|item=Q3052772|pid=P279}}
: person
- Per The New York Times (Q9684) amb Instància de (P31) = Diari (Q1110794) + Diari en línia (Q1153191) + Base de dades en línia (Q7094076) + Empresa de comunicació (Q1331793) + Servei en línia (Q19967801). No troba cap resultat, el desitjat és ["periodical"] = {"Q1002697"}. Segueix amb els valors superiors de cadascun dels obtinguts, amb diferents iteracions, fins que arriba a Diari (Q1110794) > Periòdic (Q11032) > Publicació periòdica (Q1002697)
{{#invoke:ItemClass|main|test|item=Q9684|pid=P279}}
: periodical
- Per Capellades (Q15942) no troba cap dels valors definits, retorna la definició ["generic"] = {"default"}
{{#invoke:ItemClass|main|test|item=Q15942|pid=P279}}
: generic
-- Wikidata item classifier
local p = {}
local query = require("Module:ItemClass/tables") -- localize title if necessary
-- removes duplicate values from an array
local function removeDuplicates(t)
local ret, exists = {}, {}
for _, v in ipairs(t) do
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
return ret
end
-- get safely a serialized snak
local function getSnak(statement, snaks)
local ret = statement
for i, v in ipairs(snaks) do
if not ret then return end
ret = ret[v]
end
return ret
end
local function getValues(qid, pid)
local statements = mw.wikibase.getAllStatements(qid, pid)
if #statements == 0 then
statements = mw.wikibase.getAllStatements(qid, "P31")
end
local ret = {}
for _, statement in ipairs(statements) do
if statement.rank ~= "deprecated" then
local value_id = getSnak(statement, {"mainsnak", "datavalue", "value", "id"})
if value_id then
table.insert(ret, value_id)
end
end
end
return ret
end
local function tableQidKey(data_in) -- fill a table qid = key
local data_out = {}
for k, t in pairs(data_in) do
for i, v in ipairs(t) do
data_out[v] = k
end
end
return data_out
end
function p.main(frame)
local args = frame.args or frame -- via invoke or require
local item = args.item or mw.wikibase.getEntityIdForCurrentPage()
local pid = args.pid or 'P279' -- default subclass of
local my_query = tableQidKey(query[args[1] or 'test'])
local items = {item}
for iter = 1, 5 do -- arbitrary max iter set heuristically
local next_items = {}
for _, item in ipairs(items) do
local ids = getValues(item, pid)
for _, id in ipairs(ids) do
if my_query[id] then
return my_query[id] -- first value id found, that's all
else
table.insert(next_items, id) -- save for next iteration
end
end
end
items = removeDuplicates(next_items)
end
return my_query['default']
end
return p