Mòdul:Proves/Vriullop

Aquesta és una versió anterior d'aquesta pàgina, de data 13:09, 18 maig 2023 amb l'última edició de Vriullop (discussió | contribucions). Pot tenir inexactituds o contingut no apropiat no present en la versió actual.
Icona de documentació de mòdul Documentació del mòdul [ mostra ] [ modifica el codi ] [ mostra l'historial ] [ refresca ]

Mòdul Proves (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]


local p = {}

local query = {}
query.infobox = {
	["Q5"] = "person",
	["Q11424"] = "film",
	["Q1002697"] = "periodical",
	["Q41176"] = "building",
	["default"] = "generic"
}

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

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

return p