Mòdul:Itemgroup
Mòdul auxiliar per agrupar ítems de Wikidata. Serveix d'ajuda per definir grups d'ítems de forma flexible a usar en infotaules generades de Wikidata, especialment amb el Mòdul:Wikidades.
Funcions
Existeixen tres funcions:
{{#invoke:itemgroup|parent|<taula>|p=<Pid>|item=<Qid>}}- Cerca si alguns dels valors de la property <Pid>, o superiors obtinguts de forma iterativa, coincideix amb algun del <valors> d'una <taula>, i retorna el <grup> al qual pertany el valor trobat. Les dades són a Mòdul:Itemgroup/parent.
{{#invoke:itemgroup|group|<taula>|item=<Qid>}}- Donat un <Qid>, obté el grup on està definit dins d'una <taula>. Les dades són a Mòdul:Itemgroup/groups.
{{#invoke:itemgroup|list|<taula>|<grup>}}- Llista els valors definits en un <grup> d'una <taula> separats per una coma. Les dades són a Mòdul:Itemgroup/list.
parent
Obté el grup dins d'una <taula> a que pertany els valors superiors de <Pid> obtinguts de forma iterativa.
Paràmetres:
<taula>(requerit). Primer paràmetre posicional, indica quina taula usar de les definides a Mòdul:Itemgroup/parent.p=<Pid>(requerit). Identificador de la propietat on cercar els valors superiors. En la primera iteració, si no existeix la propietat pren com alternativa P31 (P31).item=<Qid>(opcional). Identificador de l'ítem, si és diferent de l'associat a la pàgina.
Per a cada valor no obsolet de la propietat cerca els valors superiors fent iteracions en arbre. El nombre d'iteracions està limitat a 5 com a protecció. En cas de no trobar cap valor definit en la taula, retorna la definició "default", si existeix.
Pot ser útil per fer tractaments diferents en infotaules, per exemple segons P279 (P279) o classificacions geogràfiques segons P131 (P131).
El format de les dades a Mòdul:Itemgroup/parent, és:
- esquema:
- ["
<taula>"] = { - ["
<grup>"] = {'<valor1>', '<valor2>', ..... '<valorn>'}, - ["
<grup>"] = {'default'} - }
- ["
- El valor 'default' és opcional.
- dades reals:
- ["infobox name"] = {
- ["arte"] = {'Q17537576', 'Q8205328', 'Q4989906', 'Q15709879'},
- ["geopol"] = {'Q618123', 'Q7275'},
- ["Q349"] = {'Q847017','Q4438121'}
- }
group
Donat un <Qid>, obté el grup on està definit dins d'una <taula>.
Paràmetres:
<taula>(requerit). Primer paràmetre posicional, indica quina taula usar de les definides a Mòdul:Itemgroup/groups.item=<Qid>(opcional). Identificador de l'ítem a cercar a quin grup pertany, si és diferent a l'associat a la pàgina.
list
Llista els valors definits en un <grup> d'una <taula> separats per una coma.
Paràmetres:
<taula>(requerit). Primer paràmetre posicional, indica quina taula usar de les definides a Mòdul:Itemgroup/list.<grup>(requerit). Segon paràmetre posicional, indica quin grup llistar de la taula indicada.
Pot ser útil per configurar llistes d'ítems sense modificar una infotaula, per exemple pels paràmetres blacklist o whitelist.
Veure també
local p = {}
-- Argument is 'set' when it exists (not nil) or when it is not an empty string.
local function isSet(var)
return not (var == nil or (type(var) == 'string' and mw.text.trim(var) == ''))
end
local function getEntityId(frame)
local id = frame.args.item
if not isSet(id) then
id = frame:getParent().args.item
end
if not isSet(id) then
id = mw.wikibase.getEntityIdForCurrentPage()
end
return id
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 getPropIds(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
-- 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
function p.parent(frame)
local qid = getEntityId(frame)
local prop = frame.args.p
local data_def = require("Module:Itemgroup/parent")[frame.args[1]]
if not (qid and prop and data_def) then return end
local data = tableQidKey(data_def)
local items = {qid}
for iter = 1, 5 do -- arbitrary max iter set heuristically
local next_items = {}
for _, item in ipairs(items) do
local ids = getPropIds(item, prop)
for _, id in ipairs(ids) do
if data[id] then
return data[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 data['default']
end
function p.group(frame)
local qid = getEntityId(frame)
local data_def = require("Module:Itemgroup/groups")[frame.args[1]]
if not (qid and data_def) then return end
local data = tableQidKey(data_def)
return data[qid]
end
function p.list(frame)
local data_def = require("Module:Itemgroup/list")[frame.args[1]]
if data_def and data_def[frame.args[2]] then
return table.concat(data_def[frame.args[2]], ',')
end
return
end
return p