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 getPropId(id, prop)
	return getSnak(mw.wikibase.getBestStatements(id, prop), {1, "mainsnak", "datavalue", "value", "id"})
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.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 id_class, id_parent_class
	id_class = getPropId(qid, prop)
	if id_class == nil then
		id_class = getPropId(qid, 'P31')
	end
	if id_class == nil then
		return
	elseif data[id_class] then
		return data[id_class]
	end
	
	for iter = 1, 10 do
		id_parent_class = getPropId(id_class, prop)
		if id_parent_class == nil then
			return
		elseif data[id_parent_class] then
			return data[id_parent_class]
		else
			id_class = id_parent_class
		end
	end
	
	return
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
Traesto fora da Wikipèdia - L'ençiclopedia łìbara e cołaboradiva in łéngua Vèneta "https://vec.wikipedia.org/w/index.php?title=Modulo:Itemgroup&oldid=1054791"