Uso


-- Funciones para determinar si una página es una redirección, y en su caso resolverla.

-- Adaptado de [[en:Module:Redirect]]
-- (https://en.wikipedia.org/w/index.php?title=Module:Redirect&oldid=773537701).

local p = {}

-- *** Funciones para uso desde código wiki ***

-- Determina si una página es una redirección. Si lo es, devuelve 'sí' (sin
-- las comillas). Si no lo es (o no existe, etc.), devuelve una cadena vacía.
function p.isRedirect(frame)
	if p.luaIsRedirect(frame.args[1]) then
		return 'sí'
	else
		return ''
	end
end

-- Determina si una página es una redirección a otra concreta (o a una sección de esta).
-- Si lo es, devuelve 'sí' (sin las comillas). Si no lo es (o no existe, etc.), devuelve
-- una cadena vacía.
function p.isRedirectTo(frame)
	local targetTitle = p.luaGetTitle(frame.args[2])
	if not targetTitle then
		return ''
	end
	if p.luaGetRedirectTarget(frame.args[1], targetTitle.fragment) == targetTitle.fullText then
		return 'sí'
	else
		return ''
	end
end

-- Determina si una página es una redirección a la página actual (o a alguna sección
-- de esta). Si lo es, devuelve 'sí' (sin las comillas). Si no lo es (o no existe,
-- etc.), devuelve una cadena vacía.
function p.isRedirectHere(frame)
	local here = mw.title.getCurrentTitle().prefixedText
	if p.luaGetRedirectTarget(frame.args[1], false) == here then
		return 'sí'
	else
		return ''
	end
end

-- Determina si una página es una redirección. Si lo es, devuelve su destino.
-- Si no lo es (o no existe, etc.), devuelve una cadena vacía.
function p.getRedirectTarget(frame)
	local target = p.luaGetRedirectTarget(frame.args[1], true)
	if target then
		return target
	else
		return ''
	end
end

-- Determina si una página es una redirección. Si lo es, devuelve su destino.
-- Si no lo es (o no existe, etc.), devuelve el propio título, en forma canónica.
-- Si no es un título válido, devuelve una cadena vacía.
function p.solveRedirects(frame)
	local pageTitle = p.luaGetTitle(frame.args[1])
	if not pageTitle then
		return ''
	end
	return p.luaGetRedirectTarget(pageTitle.fullText, true) or pageTitle.fullText
end

-- *** Funciones para uso desde Lua ***

-- Obtiene el destino de una redirección. Si la página especificada no es una
-- redirección, devuelve nil.
-- Obtiene el objeto del título. Ambos nombres de las páginas y objetos de título se permiten
-- como entrada.
function p.luaGetRedirectTarget(page, fulltext)
	local titleObj
	if type(page) == 'string' or type(page) == 'number' then
		titleObj = p.luaGetTitle(page)
	elseif type(page) == 'table' and type(page.getContent) == 'function' then
		titleObj = page
	else
		error(string.format(
			"Argumento no válido #1 para 'luaGetRedirectTarget'"
				.. " (Esperado string - texto , numbre - número o objeto de título y el tipo dado es %s)",
			type(page)
		), 2)
	end
	if not titleObj or not titleObj.isRedirect then
		return nil
	end
	local target = titleObj.redirectTarget
	if target then
		if fulltext then
			return target.fullText
		else
			return target.prefixedText
		end
	else
		return nil
	end
end

-- Determina si una página es una redirección.
function p.luaIsRedirect(page)
	local titleObj = p.luaGetTitle(page)
	if not titleObj then
		return false
	end
	if titleObj.isRedirect then
		return true
	else
		return false
	end
end

-- Obtiene un objeto mw.title, utilizando pcall para evitar generar errores de script si 
-- están por encima del límite de recuento porque la función es costosa (entre otras causas posibles).
function p.luaGetTitle(...)
	local success, titleObj = pcall(mw.title.new, ...)
	if success then
		return titleObj
	else
		return nil
	end
end

-- *** Funciones para compatibilidad con [[en:Module:Redirect]] ***

-- Equivalente a getTarget de https://en.wikipedia.org/w/index.php?title=Module:Redirect&oldid=773537701.
function p.getTarget(page, fulltext)
	return p.luaGetRedirectTarget(page, fulltext)	
end

-- Obtiene el nombre de la páginas a la que redirije la redirección directo del wikitexto
-- o nil si no es una redirección
function p.getTargetFromText(text)
	return mw.ustring.match(
		text,
		"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)%]%]"
	) or mw.ustring.match(
		text,
		"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)|[^%[%]]-%]%]"
	) or mw.ustring.match(
		text,
		"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Cc][Ii][OoÓó][Nn]%s*:?%s*%[%[([^%[%]|]-)%]%]"
	) or mw.ustring.match(
		text,
		"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Cc][Ii][OoÓó][Nn]%s*:?%s*%[%[([^%[%]|]-)|[^%[%]]-%]%]"
	)
end

--Teniendo en cuenta un solo nombre de la página determina que página se redirige a y devuelve el
-- nombre de la página de destino, o el nombre de la página pasa cuando no una redirección. El pasado
-- nombre de la página se puede dar como texto sin formato o como vínculo.
--
-- Devuelve nombre de la página como texto sin formato, o cuando se da el parámetro de soporte, como un
-- vínculo. Devuelve un mensaje de error cuando la página no existe o la redirección
-- de destino no se puede determinar por alguna razón.
--
-- Equivalente a luaMain de https://en.wikipedia.org/w/index.php?title=Module:Redirect&oldid=773537701.
function p.luaMain(rname, bracket, fulltext)
	if type(rname) ~= "string" or not rname:find("%S") then
		return nil
	end
	bracket = bracket and "[[%s]]" or "%s"
	rname = rname:match("%[%[(.+)%]%]") or rname
	local target = p.luaGetRedirectTarget(rname, fulltext)
	local ret = target or rname
	ret = p.luaGetTitle(ret)
	if ret then
		if fulltext then
			ret = ret.fullText
		else
			ret = ret.prefixedText
		end
		return bracket:format(ret)
	else
		return nil
	end
end

-- Proporciona acceso a luaMain desde el código wiki.
-- Equivalente a main de https://en.wikipedia.org/w/index.php?title=Module:Redirect&oldid=773537701.
function p.main(frame)
	return p.luaMain(frame.args[1], frame.args.bracket, frame.args.fulltext) or ''
end

return p