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