Permanently protected module
From Wikipedia, the free encyclopedia


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 redirect errors]]")

	end



	local thisPage = mw.title.getCurrentTitle()

	local otherPage = mw.title.new(args1 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, "<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 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 [[Wikipedia:Double redirects|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