Módulo:Itemgroup

Na Galipedia, a Wikipedia en galego.
Indicacións de uso do módulo

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]

Esta documentación está transcluída desde Módulo:Itemgroup/uso. Os editores poden probar cambios no mesmo en Módulo:Itemgroup/probas.
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