Mòdul:Itemgroup
A continuació es mostra la documentació transclosa de la subpàgina /ús. [salta a la caixa de codi]
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
[modifica]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
[modifica]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 Instància de (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 Subclasse de (P279) o classificacions geogràfiques segons Localitzat a l'entitat territorial administrativa (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
[modifica]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
[modifica]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é
[modifica]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