Mô đun: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 "Lỗi trong Mô đun:R avoided double redirect: " .. err .. ""
			.. (demo and "" or "Thể loại:Lỗi tránh đổi hướng kép")
	end
	local thisPage = mw.title.getCurrentTitle()
	local otherPage = mw.title.new(args1 or "")
	if not otherPage then
		return formatError("Không có trang khác nào được chỉ định.");
	end
	if mw.title.equals(thisPage, otherPage) then
		return formatError("Trang hiện tại đã được truyền vào làm tham số.");
	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 = "một tiêu đề thay thế hoặc chủ đề có liên quan của " .. noredir(otherPage) .. ", một trang đổi hướng khác tới cùng tiêu đề"
		else
			from = "một tiêu đề thay thế hoặc chủ đề có liên quan của :" .. otherPage.fullText .. ", một trang đổi hướng cũ tới cùng tiêu đề"
		end
		cat = demo and "" or update and "Đổi hướng kép được tránh sắp được cập nhật" or "Đổi hướng kép được tránh"
		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 = "Từ một đổi hướng kép được tránh"
			}
		})
	end
	if not noError then
		if not thisTarget then
			return formatError("Trang này không phải là trang đổi hướng hoạt động được – có thể đã bị tắt đi bởi RfD.", demo)
		elseif mw.title.equals(thisPage, thisTarget) then
			return formatOutput(true, "Đây là trang đổi hướng hỏng (nó đổi hướng đến chính nó).")
		elseif not thisTarget.exists then
			return formatOutput(true, "Đây là trang đổi hướng hỏng (trang đích của nó không tồn tại).")
		elseif not otherPage.exists then
			return formatOutput(true, ":" .. otherPage.fullText .. " không tồn tại.")
		elseif otherTarget and mw.title.equals(otherPage, otherTarget) then
			return formatOutput(true, ":" .. otherPage.fullText .. " là trang đổi hướng hỏng (nó đổi hướng đến chính nó).")
		elseif otherTarget and not otherTarget.exists then
			return formatOutput(true, ":" .. otherPage.fullText .. " là trang đổi hướng hỏng (nó đổi hướng đến một trang không tồn tại).")
		elseif mw.title.equals(thisTarget, otherPage) then
			if not otherTarget then
				return formatOutput(true, ":" .. otherPage.fullText .. " không phải là trang đổi hướng, và bản mẫu đã trỏ vào chính nó rồi. Bản mẫu này khả năng cao nên bị gỡ bỏ.")
			elseif mw.title.equals(otherTarget, thisPage) then
				return formatOutput(true, "Đây là trang đổi hướng vòng tròn. Vui lòng thay đổi trang đích của cả trang đổi hướng này và " .. noredir(otherPage) .. " tới đúng bài viết.")
			end
			return formatOutput(true, "Trang này đổi hướng đến " .. noredir(otherPage) .. ", nó đổi hướng đến :" .. otherTarget.fullText .. ". Vui lòng thay thế trang đích của trang đổi hướng này đến :" .. otherTarget.fullText .. " hoặc nếu không hãy giải quyết vấn đề này.")
		elseif not otherTarget then
			return formatOutput(true, ":" .. otherPage.fullText .. " không phải là trang đổi hướng. Nhiều khả năng trang đổi hướng này nên được cập nhật để trỏ tới :" .. otherPage.fullText .. " nay nó không còn là trang đổi hướng, và bản mẫu này được gỡ bỏ.\n** Nếu nó không phải trang đích chính xác cho trang đổi hướng này, hãy cập nhật hoặc loại bỏ bản mẫu này và/hoặc bản thân trang đổi hướng và/hoặc các trang khác sao cho thích hợp.")
		elseif thisDoubleTarget then
			if otherDoubleTarget then
				if mw.title.equals(thisDoubleTarget, otherDoubleTarget) then
					return formatOutput(true, "Cả trang này lẫn " .. noredir(otherPage) .. " đều là trang đổi hướng kép. Vui lòng thay đổi trang đích của cả hai trang đổi hướng thành "
						.. (thisDoubleTarget.isRedirect and "bài viết chính xác." or ":" .. thisDoubleTarget.fullText .. " (hoặc một bài viết chính xác khác)."))
				end
				return formatOutput(true, "Cả trang này lẫn " .. noredir(otherPage) .. " đều là trang đổi hướng kép. Hãy sửa chúng.")
			end
			return formatOutput(true, "Đây là trang đổi hướng kép. Hãy sửa nó, có thể bằng cách đổi nó thành :" .. otherTarget.fullText .. ".")
		elseif not mw.title.equals(thisTarget, otherTarget) then
			return formatOutput(true, "Trang này và " .. noredir(otherPage) .. " đổi hướng đến các bài viết khác nhau. Nhiều khả năng bạn nên thay đổi trang đích của trang đổi hướng này thành :" .. otherTarget.fullText .. " sao cho khớp.\n** Nếu nó không phải trang đích chính xác cho trang đổi hướng này, hãy cập nhật hoặc loại bỏ bản mẫu này và/hoặc bản thân trang đổi hướng và/hoặc các trang khác sao cho thích hợp.")
		elseif thisTarget.fragment ~= otherTarget.fragment then
			-- Should this case report for update?
			return formatOutput(false, "Do không cho phép việc đổi hướng kép,"
				.. " cả hai trang hiện được trỏ tới :" .. otherTarget.prefixedText .. " (nhưng với các anchor khác nhau).\n"
				.. "**Nếu " .. noredir(otherPage) .. " được chỉ định lại trang đích hoặc được mở rộng thành một bài viết, bản mẫu, hoặc trang dự án khác riêng biệt, "
				.. " trang đổi hướng này sẽ được xếp lại thể loại để cập nhật."
			)
		end
	end
	return formatOutput(false, "Do không cho phép việc đổi hướng kép,"
		.. " cả hai trang hiện được trỏ tới :" .. otherTarget.fullText .. ".\n"
		.. "**Nếu " .. noredir(otherPage) .. " được chỉ định lại trang đích hoặc được mở rộng thành một bài viết, bản mẫu, hoặc trang dự án khác riêng biệt, "
		.. " trang đổi hướng này sẽ được xếp lại thể loại để cập nhật."
	)
end
return p