Módulo:Itemgroup
Módulo auxiliar para agrupar items de Wikidata. Serve de axuda para definir grupos de items de forma flexible para usalos en caixas de información (táboas) xeradas dende Wikidata, especialmente co Module:Wikidades.
Uso
[editar a fonte]Existen tres funcións:
{{#invoke:itemgroup|parent|<taula>|p=<Pid>|item=<Qid>}}
- Busca se algún dos valores da propiedade (property <Pid>,) ou superiores obtidos de forma iterativa, coincide con algún dos <valors> dunha <taula>, e devolve o <grup> ao que pertence o valor achado. Os datos están en Module:Itemgroup/parent.
{{#invoke:itemgroup|group|<taula>|item=<Qid>}}
- Dándolle un <Qid>, obtén o grupo onde está definido dentro dunha <taula>. Os datos están en Module:Itemgroup/groups.
{{#invoke:itemgroup|list|<taula>|<grup>}}
- Lista os valores definidos nun <grup> dunha <taula> separados por unha coma. Os datos están en Module:Itemgroup/list.
parent
[editar a fonte]Obtén o grupo dentro dunha <taula> a que pertencen os valores superiores de <Pid> obtidos de forma iterativa.
Parámetros:
<taula>
(requirido). Primeiro parámetro posicional, indica que táboa usar das definidas en Module:Itemgroup/parent.p=<Pid>
(requirido). Identificador da propiedade onde se buscan os valores superiores. Na primeira iteración, se non existe a propiedade, toma como alternativa Instancia de (P31).item=<Qid>
(opcional). Identificador do item, se é que é diferente do asociado á páxina.
Para cada valor non obsoleto da propiedade busca os valores superiores facendo iteración en árbore. O número de iteracións está limitado a cinco como unha protección. En caso de non atopar ningún valor definido na táboa, volve á definición por defecto ("default"), se esta existe.
Pode ser útil para facer diferentes tratamentos nas caixas de información, por exemplo, segundo a Subclase de (P279) ou clasificacións xeográficas consonte a Situado na unidade administrativa (P131).
O formato dos datos en Module:Itemgroup/parent, é:
- esquema:
- ["
<taula>
"] = { - ["
<grup>
"] = {'<valor1>
', '<valor2>
', ..... '<valorn>
'}, - ["
<grup>
"] = {'default
'} - }
- ["
- O valor 'default' é opcional.
- dades reals:
- ["infobox name"] = {
- ["arte"] = {'Q17537576', 'Q8205328', 'Q4989906', 'Q15709879'},
- ["geopol"] = {'Q618123', 'Q7275'},
- ["Q349"] = {'Q847017','Q4438121'}
- }
group
[editar a fonte]Dándolle un <Qid>, obtén o grupo onde está definido dentro dunha <taula>.
Parámetros:
<taula>
(requirido). Primeiro parámetro posicional, indica que táboa usar das definidas en Module:Itemgroup/groups.item=<Qid>
(opcional). Identificador do item para buscar a que grupo pertence, se é diferente ao asociado á páxina.
list
[editar a fonte]Lista os valores definidos nun <grup> de unha <taula> separados por unha coma.
Parámetros:
<taula>
(requirido). Primeiro parámetro posicional, indica que táboa usar das definidas en Module:Itemgroup/groups.<grup>
(requirido). Segundo parámetro posicional, indica que grupo listar da táboa indicada.
Pode ser útil para configurar listas de ítems sen modificar unha caixa de información, por exemplo para os parámetros blacklist o whitelist.
Véxase tamén
[editar a fonte]Por favor, engade as categorías na subpáxina de documentación e os interwikis no Wikidata. Ver as subpáxinas deste módulo.
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