Module:R avoided double redirect

local p = {}

local function noredir(page)

local link = page:fullUrl("redirect=no")

return "[" .. link .. " " .. page.fullText .. "]"

end

function p.main(frame)

local args = require("Module:Arguments").getArgs(frame, {removeBlanks=false})

-- Demo parameters, for demonstrating behavior with certain redirect

-- targets and avoiding categorization (do not use in articles)

local noError = args.noerror

local demo = args.demo or noError or args.thistarget or args.othertarget

local function formatError(err)

return "Error in Module:R avoided double redirect: " .. err .. ""

.. (demo and "" or "Category:Avoided double redirect errors")

end

local thisPage = mw.title.getCurrentTitle()

local otherPage = mw.title.new(args[1] or "")

if not otherPage then

return formatError("No other page was specified.");

end

if mw.title.equals(thisPage, otherPage) then

return formatError("The current page was passed as the parameter.");

end

-- Get mw.title objects for redirect targets.

-- Note that using mw.title's redirectTarget will correctly handle preview mode, unlike Module:Redirect.

local thisTarget, otherTarget

if demo and args.thistarget then

thisTarget = mw.title.new(args.thistarget)

else

thisTarget = thisPage.redirectTarget

end

if demo and args.othertarget then

otherTarget = mw.title.new(args.othertarget)

else

otherTarget = otherPage.redirectTarget

end

-- For double redirects

local thisDoubleTarget = thisTarget and thisTarget.redirectTarget

local otherDoubleTarget = otherTarget and otherTarget.redirectTarget

local function formatOutput(update, info)

local from, cat

if otherTarget then

from = "an alternative title or related topic of " .. noredir(otherPage) .. ", another redirect to the same title"

else

from = "an alternative title or related topic of :" .. otherPage.fullText .. ", a former redirect to the same title"

end

cat = demo and "" or update and "Avoided double redirects to be updated" or "Avoided double redirects"

return frame:expandTemplate({

title = "Redirect template",

args = {

id = 'R avoided double redirect',

from = from,

info = update and "\n**" .. info or info,

["all category"] = cat,

name = "From an avoided double redirect"

}

})

end

if not noError then

if not thisTarget then

return formatError("This page is not a functioning redirect – possibly disabled by RfD.", demo)

elseif mw.title.equals(thisPage, thisTarget) then

return formatOutput(true, "This is a broken redirect (it redirects to itself).")

elseif not thisTarget.exists then

return formatOutput(true, "This is a broken redirect (its target does not exist).")

elseif not otherPage.exists then

return formatOutput(true, ":" .. otherPage.fullText .. " does not exist.")

elseif otherTarget and mw.title.equals(otherPage, otherTarget) then

return formatOutput(true, ":" .. otherPage.fullText .. " is a broken redirect (it redirects to itself).")

elseif otherTarget and not otherTarget.exists then

return formatOutput(true, ":" .. otherPage.fullText .. " is a broken redirect (it redirects to a page that does not exist).")

elseif mw.title.equals(thisTarget, otherPage) then

if not otherTarget then

return formatOutput(true, ":" .. otherPage.fullText .. " is not a redirect, and this already points to it. Most likely this template should be removed.")

elseif mw.title.equals(otherTarget, thisPage) then

return formatOutput(true, "This is a circular redirect. Please change the target of both this redirect and " .. noredir(otherPage) .. " to the correct article.")

end

return formatOutput(true, "This page redirects to " .. noredir(otherPage) .. ", which redirects to :" .. otherTarget.fullText .. ". Please change this redirect's target to :" .. otherTarget.fullText .. " or otherwise resolve the situation.")

elseif not otherTarget then

return formatOutput(true, ":" .. otherPage.fullText .. " is not a redirect. Most likely this redirect should be updated to point to :" .. otherPage.fullText .. " now that it is no longer a redirect, and this template removed.\n** If that is not the correct target for this redirect, update or remove this template and/or the redirect itself and/or the other page as appropriate.")

elseif thisDoubleTarget then

if otherDoubleTarget then

if mw.title.equals(thisDoubleTarget, otherDoubleTarget) then

return formatOutput(true, "Both this page and " .. noredir(otherPage) .. " are double redirects. Please change the redirect target of both to "

.. (thisDoubleTarget.isRedirect and "the correct article." or ":" .. thisDoubleTarget.fullText .. " (or some other correct article)."))

end

return formatOutput(true, "Both this page and " .. noredir(otherPage) .. " are double redirects. Please fix them.")

end

return formatOutput(true, "This is a double redirect. Please fix it, possibly by changing it to :" .. otherTarget.fullText .. ".")

elseif not mw.title.equals(thisTarget, otherTarget) then

return formatOutput(true, "This page and " .. noredir(otherPage) .. " redirect to different articles. Most likely you should change this redirect's target to :" .. otherTarget.fullText .. " to match.\n** If that is not the correct target for this redirect, update or remove this template and/or the redirect itself and/or the other page as appropriate.")

elseif thisTarget.fragment ~= otherTarget.fragment then

-- Should this case report for update?

return formatOutput(false, "Because double redirects are disallowed,"

.. " both pages currently point to :" .. otherTarget.prefixedText .. " (but with different anchors).\n"

.. "**If " .. noredir(otherPage) .. " is retargeted or is expanded into a separate article, template, or other project page, "

.. " this redirect will be recategorized to be updated."

)

end

end

return formatOutput(false, "Because double redirects are disallowed,"

.. " both pages currently point to :" .. otherTarget.fullText .. ".\n"

.. "**If " .. noredir(otherPage) .. " is retargeted or is expanded into a separate article, template, or other project page, "

.. " this redirect will be recategorized to be updated."

)

end

return p