Vés al contingut

Mòdul:Itemgroup

De Viki.cat

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