Mòdul:Itemgroup

De la Viquipèdia, l'enciclopèdia lliure
Icona de documentació de mòdul Documentació del mòdul [ mostra ] [ modifica el codi ] [ mostra l'historial ] [ refresca ]

Mòdul Itemgroup (codi · ús · discussió · proves · tests · casos prova | subpàgines · enllaços)

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