Mô đun:CurrentCandidateList

local p = {}

local titles = {
FA = "Wikipedia:Ứng cử viên bài viết chọn lọc",
FL = "Wikipedia:Ứng cử viên danh sách chọn lọc",
FT = "Wikipedia:Ứng cử viên chủ điểm chọn lọc",
GA = "Wikipedia:Ứng cử viên bài viết tốt",
GT = "Wikipedia:Ứng cử viên chủ điểm tốt",
FAR = "Wikipedia:Đề nghị rút sao bài viết chọn lọc",
FLR = "Wikipedia:Đề nghị rút sao danh sách chọn lọc",
FAR2 = "Wikipedia:Đề nghị giáng sao bài viết chọn lọc",
GAR = "Wikipedia:Đề nghị rút sao bài viết tốt",
AfD = "Wikipedia:Biểu quyết xoá bài",
MfD = "Wikipedia:Biểu quyết xóa trang (khác)",
AfUD = "Wikipedia:Biểu quyết phục hồi trang",
RfE = "Wikipedia:Biểu quyết chọn điều phối viên",
RfA = "Wikipedia:Biểu quyết chọn bảo quản viên",
RfB = "Wikipedia:Biểu quyết chọn hành chính viên",
RfCU = "Wikipedia:Biểu quyết chọn kiểm định viên",
RfDE = "Wikipedia:Biểu quyết bất tín nhiệm điều phối viên",
RfDA = "Wikipedia:Biểu quyết bất tín nhiệm bảo quản viên",
RfDB = "Wikipedia:Biểu quyết bất tín nhiệm hành chính viên",
RfDCU = "Wikipedia:Biểu quyết bất tín nhiệm kiểm định viên",
BTN = "Wikipedia:Biểu quyết bất tín nhiệm nhiều vị trí",
}

local alts = {
FA = "Bài viết chọn lọc",
FL = "Danh sách chọn lọc",
FT = "Chủ điểm chọn lọc",
GA = "Bài viết tốt",
GT = "Chủ điểm tốt",
FAR = "Rút sao",
FLR = "Rút sao danh sách chọn lọc",
FAR2 = "Giáng sao",
GAR = "Rút sao",
AfD = "Xóa bài",
MfD = "Xóa trang thuộc không gian tên khác",
AfUD = "Phục hồi bài",
RfE = "Chọn điều phối viên",
RfA = "Chọn bảo quản viên",
RfB = "Chọn hành chính viên",
RfCU = "Chọn kiểm định viên",
RfDE = "Bất tín nhiệm điều phối viên",
RfDA = "Bất tín nhiệm bảo quản viên",
RfDB = "Bất tín nhiệm hành chính viên",
RfDCU = "Bất tín nhiệm kiểm định viên",
BTN = "Bất tín nhiệm nhiều vị trí",
}

-- @type table
function p.list(title)
local content = mw.title.new(title):getContent()
local list = {}

for token in string.gmatch(content, "") do
if token ~= "Quy trình" and token ~= "Gợi ý" then
table.insert(list, token)
end
end

if list > 10 then
local tempList = {}
local listShuffled = FYShuffle(list)
for i = 1, 10, 1 do
table.insert(tempList, listShuffled[i])
end
list = tempList
end

return list
end

-- @type string
function p.num(frame)
local title = titles[frame.args[1]]
return p._num(title)
end

-- @type string
function p._num(title)
return p.list(title)
end

-- @type string
function p.str(frame)
local title = titles[frame.args[1]]
local sep = " • "
return p._str(title, sep)
end

-- @type string
function p._str(title, sep)
local str = {}

for _, candidate in ipairs(p.list(title)) do
table.insert(str, anchor(title, candidate))
end

return table.concat(str, sep)
end

-- @type string
function p.group(frame)
local pages = frame.args
local sep = " • "
return p._group(pages, sep)
end

-- @type string
function p._group(pages, sep)
local group = {}

for _, page in ipairs(pages) do
local title = titles[page]
local alt = alts[page]
local list = p.list(title)
if (list ~= 0) then
table.insert(group, prefix(title, alt) .. p._str(title, sep))
end
end

return table.concat(group, sep)
end

-- @type string
function anchor(title, candidate)
return "" .. candidate .. ""
end

-- @type string
function prefix(title, alt)
return "" .. alt .. ": "
end

-- Source: https://stackoverflow.com/questions/35572435/how-do-you-do-the-fisher-yates-shuffle-in-lua
function FYShuffle(tInput)
math.randomseed(os.time())
local tReturn = {}
for i = tInput, 1, -1 do
local j = math.random(i)
tInput[i], tInput[j] = tInput[j], tInput[i]
table.insert(tReturn, tInput[i])
end
return tReturn
end

return p