Módulo:Argumentos

De Biquipedia

La documentación para este módulo puede ser creada en Módulo:Argumentos/doc

local z = {}

function z.obtenerArgumentos(frame)
	if frame.args[1] then 
		return frame.args
	end

	return frame:getParent().args
end

function z.obtenerArgumentosConValor(frame)
	if frame == mw.getCurrentFrame() then
		argumentos = frame:getParent().args
	else
		argumentos = frame.args or frame
	end

	return require('Módulo:Tablas').copiarElementosConValor(argumentos)
end

-- Obtiene os argumentos con valors d\'a plantilla en minúsclas y con as
-- tildes sacadas, en caso de que'n tienga de forma que siga más sencillo
-- treballar con as distintas variants en os módulos.
-- 
-- Nota: En caso de que i haiga parametros duplicaus dimpués d\'a normalización nomás
-- se mantendrá a zaguera valor procesada por a función.
--
-- Parametros de dentrada:
--    frame: O marco emplegau por o módulo
--
-- Parametros de salida:
--    argumentosNormalizaus: os argumentos con valor y nombre normalizau
--    argumentosDuplicaus: si a plantilla tien quantas vegadas o mesmo 
--        argumento dimpués d\'a normalización u no
function z.obtenerArgumentosConValorNormalizaus(frame)
	local argumentos = z.obtenerArgumentosConValor(frame)
	local argumentosNormalizaus = {}
	local nombreNormalizau
	local argumentosDuplicaus = false
	
	for nombre, valor in pairs(argumentos) do
		
		nombreNormalizau = nombre
		
		nombreNormalizau = mw.ustring.lower( nombreNormalizau )
		nombreNormalizau = string.gsub(nombreNormalizau, "[á]", "a")
		nombreNormalizau = string.gsub(nombreNormalizau, "[é]", "e")
		nombreNormalizau = string.gsub(nombreNormalizau, "[í]", "i")
		nombreNormalizau = string.gsub(nombreNormalizau, "[ó]", "o")
		nombreNormalizau = string.gsub(nombreNormalizau, "[úü]", "u")
		
		if argumentosNormalizaus[nombreNormalizau] then
			argumentosDuplicaus = true
		end
		argumentosNormalizaus[nombreNormalizau] = valor
	end
	
	return argumentosNormalizaus, argumentosDuplicaus
end

--[[
	@name	obtenerTablaDArgumentos
	@global	args
	@param	frame
	@return	table
	@descr	Obtiene una tabla d'argumentos prenendo os parametros recibius
			tanto dende a plantilla como dende a invocación d'un módulo.
			En caso de duplicau tien preferencia a valor d\'a invocación.
			Por eixemplo:
				con a plantilla:	{{Plantilla |campo=valor |key=clave }}
				y a invocación:	{{#invoke:Módulo |key=value }}
				s'obtiene:			{ ['campo'] = 'valor', ['key'] = 'value' }
--]]
function z.obtenerTablaDArgumentos(frame)
	-- global args
	args = {}
	local function paramMerge(orig, copy)
		local data = {}
		for key, val in pairs(orig) do
			data[key] = val
		end
		for key, val in pairs(copy) do
			data[key] = val
		end
		return data
	end
	if frame then
		-- parentArgs = frame:getParent().args or {}
		if type(frame.getParent) == 'function' then
			local parent = frame:getParent()
			if parent then
				args = paramMerge(args, parent.args)
			end
		end
		-- invokeArgs = frame.args or frame or {}
		if type(frame.args) == 'table' then
			args = paramMerge(args, frame.args)
		elseif type(frame) == 'table' then
			args = paramMerge(args, frame)
		end
	end
	return args
end

--[[
	@name	obtenerValorDArgumentos
	@global	args
	@param	list
	@return	string or nil
	@descr	Obtiene o primer argumento valido dende una tabla de parametros.
			Ista tabla de parametros ye una lista que contiene os nombres
			d'os argumentos u atras tablas con as funcions pa obtener-los.
	Parametros:
		con os argumentos:		{ ['campo'] = 'valor', ['key'] = 'value' }
		y usando a clamada:	obtenerValorDArgumentos{'dato', 'campo', 'key'}
		s'obtiene a valor:	'valor'
		pues 'dato' no ye un argumento y 'campo' en ye o primero trobau
	Funcions:
		tamién se puet gritar con una función d\'a forma
			obtenerValorDArgumentos{'dato', { obtenerDato, '1', '2' }}
		de forma que si l'argumento 'dato' no existe se grita a la función
			obtenerDato('1', '2')
--]]
function z.obtenerValorDArgumentos(list)
	-- global args
	local lang = mw.language.getContentLanguage()
	local err, key
	if type(list) == 'number' then
		key = args[list]
	elseif type(list) == 'string' then
		key = args[list] or args[lang:ucfirst(list)]
	elseif type(list) == 'table' then
		for num, val in ipairs(list) do
			if type(val) == 'string' then
				key = z.obtenerValorDArgumentos(val)
			elseif type(val) == 'function' then
				err, key = pcall(val)
				if err ~= true then
					key = nil
				end
			elseif type(val) == 'table' then
				if val[1] and type(val[1]) == 'function' then
					err, key = pcall(val[1], unpack(val, 2))
					if err ~= true then
						key = nil
					end
				end
			end
			if key ~= nil and key ~= '' then
				return key -- break
			end
		end
	end
	return key
end

return z