Module:R avoided double redirect
From TechInfoDepot
Jump to navigationJump to searchThis template is used on many pages, and changes to it will be widely noticed. Please test any changes in the template's /sandbox or /testcases subpages, or in a user subpage, and consider discussing changes at the talk page before implementing them. |
This module implements {{R avoided double redirect}}. Please see the template page for documentation.
The above documentation is transcluded from Module:R avoided double redirect/doc. (edit | history) Editors can experiment in this module's sandbox (create | mirror) and testcases (create) pages. Subpages of this module. |
local p = {}
local function noredir(page)
local link = page:fullUrl("redirect=no")
return "<span class=\"plainlinks\">[" .. link .. " " .. page.fullText .. "]</span>"
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 "<span class=\"error\">Error in [[Module:R avoided double redirect]]: " .. err .. "</span>"
.. (demo and "" or "[[Category:Avoided double redirects/error]]")
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 for '''" .. noredir(otherPage) .. "''', another redirect to the same title"
else
from = "an alternative title for '''[[:" .. 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, "<span class=\"error\">This is a broken redirect (it redirects to itself).</span>")
elseif not thisTarget.exists then
return formatOutput(true, "<span class=\"error\">This is a broken redirect (its target does not exist).</span>")
elseif not otherPage.exists then
return formatOutput(true, "<span class=\"error\">[[:" .. otherPage.fullText .. "]] does not exist.</span>")
elseif otherTarget and mw.title.equals(otherPage, otherTarget) then
return formatOutput(true, "<span class=\"error\">[[:" .. otherPage.fullText .. "]] is a broken redirect (it redirects to itself).</span>")
elseif otherTarget and not otherTarget.exists then
return formatOutput(true, "<span class=\"error\">[[:" .. otherPage.fullText .. "]] is a broken redirect (it redirects to a page that does not exist).</span>")
elseif mw.title.equals(thisTarget, otherPage) then
if not otherTarget then
return formatOutput(true, "<span class=\"error\">[[:" .. otherPage.fullText .. "]] is not a redirect, and this already points to it.</span> Most likely this template should be removed.")
elseif mw.title.equals(otherTarget, thisPage) then
return formatOutput(true, "<span class=\"error\">This is a circular redirect.</span> Please change the target of both this redirect and " .. noredir(otherPage) .. " to the correct article.")
end
return formatOutput(true, "<span class=\"error\">This page redirects to " .. noredir(otherPage) .. ", which redirects to [[:" .. otherTarget.fullText .. "]].</span> Please change this redirect's target to [[:" .. otherTarget.fullText .. "]] or otherwise resolve the situation.")
elseif not otherTarget then
return formatOutput(true, "<span class=\"error\">[[:" .. otherPage.fullText .. "]] is not a redirect.</span> 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, "<span class=\"error\">Both this page and " .. noredir(otherPage) .. " are double redirects.</span> 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, "<span class=\"error\">Both this page and " .. noredir(otherPage) .. " are double redirects.</span> Please fix them.")
end
return formatOutput(true, "<span class=\"error\">This is a double redirect.</span> Please fix it, possibly by changing it to [[:" .. otherTarget.fullText .. "]].")
elseif not mw.title.equals(thisTarget, otherTarget) then
return formatOutput(true, "<span class=\"error\">This page and " .. noredir(otherPage) .. " redirect to different articles.</span> 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 [[Wikipedia:Double redirects|double redirects]] are disallowed,"
.. " both pages currently point to [[:" .. otherTarget.prefixedText .. "]] (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 [[Wikipedia:Double redirects|double redirects]] are disallowed,"
.. " both pages currently point to [[:" .. otherTarget.fullText .. "]].\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