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