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 "")
end

local thisPage = mw.title.getCurrentTitle()
local otherPage = mw.title.new(args[1] 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