Для документации этого модуля может быть создана страница Модуль:WikidataProxy/doc

local p = {}

local function substparam(frame)
	local param = {};
	local parentargs = frame:getParent().args
	if parentargs ~= nil then
		for name, value in pairs(parentargs) do
			param[name] = value -- copy template parameters
		end
		for property, parameter in pairs(frame.args) do  
			local propertyid = mw.ustring.lower(property)
			if mw.ustring.find(propertyid, '^p%d+$', 1, false) ~= nil then
				-- parse wikidata property proxies
				local names = mw.text.split(parameter, ',');
				local existname = nil;
				local notexistname = nil;
				for i, name in ipairs(names) do
					local pname = mw.text.trim(name)
					local num = tonumber(pname) 
					if num ~= nil and param[num] ~= nil and param[num] ~= '' then
						existname = num; -- passed unnamed parameter 
					elseif param[pname] ~= nil and param[pname] ~= '' then 
						existname = pname; -- passed named parameter
					elseif num ~= nil then
						notexistname = num -- absent unnamed parameter
					else
						notexistname = pname -- absent named parameter
					end
				end
				if existname == nil and notexistname ~= nil  then
					-- get absent parameter from wikidata
					param[notexistname] = frame:callParserFunction( '#property', propertyid );
				end
			else
				-- parse alternative parameter names
				local names = mw.text.split(parameter, ',');
				for i, name in ipairs(names) do
					local pname = mw.text.trim(name)
					if param[name] ~= nil then
						-- found alternative name
						if param[property] == nil then
							param[property] = param[name]; -- set value to default name parameter
						end
						param[name] = nil;	-- remove alternative name
					end
				end
			end 
		end
	end
	param['marshaled'] = '1'
	return param;
end

function p.infoboxproxy( frame )
	local result ='';
	local template = frame.args['template'] or ''
	if template ~= '' then
		result = frame:expandTemplate{ title = template, args = substparam(frame) }	
	end
	return result;
end
return p