Module:R avoided double redirect/sandbox explained

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

-- 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 : " .. err .. "" .. (demo and "" or "") 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 , 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 end

if not noError then if not thisTarget then return formatError("This page is not a redirect.", 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, " does not exist.") elseif otherTarget and mw.title.equals(otherPage, otherTarget) then return formatOutput(true, " is a broken redirect (it redirects to itself).") elseif otherTarget and not otherTarget.exists then return formatOutput(true, " 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, " 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 . Please change this redirect's target to or otherwise resolve the situation.") elseif not otherTarget then return formatOutput(true, " is not a redirect. Most likely this redirect should be updated to point to 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 " (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 .") 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 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 (but with different anchors).\n" .. "**If " .. noredir(otherPage) .. " is expanded into a separate article or it is retargeted, " .. " this redirect will be recategorized to be updated." ) end end

return formatOutput(false, "Because double redirects are disallowed," .. " both pages currently point to .\n" .. "**If " .. noredir(otherPage) .. " is expanded into a separate article or it is retargeted, " .. " this redirect will be recategorized to be updated." )end

return p