Vés al contingut

Mòdul:ItemClass

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 ItemClass (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]


Classificador d'ítems de Wikidata.

El propòsit és classificar un ítem de Wikidata segons una taula de definició a Mòdul:ItemClass/tables. Per a una propietat determinada cerca si existeix en la taula el seu valor en l'element o en els elements superiors. En cas afirmatiu retorna el text de la taula, en cas negatiu retorna el text de la definició "default" o bé no res.

Primer, cal definir una taula per al nostre propòsit. La taula "test" serveix per a proves o demostracions i com a model per a copiar i enganxar en una nova taula. Definiu-la amb un nom entenedor, ja que s'usarà com a paràmetre. Per exemple en lloc de test podria ser infobox per a classificar tipus d'infotaules. El títol "infobox" en aquest cas servirà per a indicar el tipus de consulta a fer.

Sintaxi:

  • Des d'una pàgina wiki, per exemple una plantilla: {{#invoke:ItemClass|main|paràmetres}}
  • Des d'un altre mòdul amb Lua: require("Mòdul:ItemClass").main{paràmetres}

Paràmetres:

  • 1: tipus de consulta. En l'exemple de més amunt seria "infobox".
  • item: identificador Qid de l'ítem, si és diferent de l'associat a la pàgina.
  • pid: identificador Pid de la propietat a consultar. Per defecte és Subclasse de (P279). En cas de no trobar la propietat, segueix amb Instància de (P31).

Exemples (en general no caldrà item):

-- Wikidata item classifier
local p = {}

local query = require("Module:ItemClass/tables") -- localize title if necessary

-- 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

-- 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 getValues(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

function p.main(frame)
	local args = frame.args or frame -- via invoke or require
	local item = args.item or mw.wikibase.getEntityIdForCurrentPage()
	local pid = args.pid or 'P279' -- default subclass of
	local my_query = tableQidKey(query[args[1] or 'test'])
	
	local items = {item}
	for iter = 1, 5 do -- arbitrary max iter set heuristically
		local next_items = {}
		for _, item in ipairs(items) do
			local ids = getValues(item, pid)
			for _, id in ipairs(ids) do
				if my_query[id] then
					return my_query[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 my_query['default']
end

return p