local concat = table.concat
local insert = table.insert
local makeTitle = mw.title.makeTitle
local messageBox = require("Module:Message box").main
local nowiki = mw.text.nowiki
local pagesInCategory = mw.site.stats.pagesInCategory
local remove = table.remove
local sort = table.sort
local trim = mw.text.trim
local yesno = require("Module:Yesno")
local title = mw.title.getCurrentTitle()
local namespace = title.namespace
local title_text = title.text
local p = {}
function p.main(frame)
local args
local len, needs_fixing = 0, {}
-- Documentation example.
if namespace == 10 and title_text:match("Category disambiguation") then
args = {
"the bird genus",
"Eremophila (bird)",
"the plant genus",
"Eremophila (plant)"
}
len = 4
-- Otherwise, process input arguments.
else
-- Produce a new args table, to get the actual length.
-- Trim input arguments, and add various maintenance warnings as needed.
args = {}
local raw_args = (frame:getParent() or frame).args
for k, v in pairs(raw_args) do
v = trim(v)
if v == "" then
v = nil
end
if type(k) == "number" and k > len then
len = k
end
args[k] = v
end
-- Number of parameters should be even.
local orig_len = len
if len % 2 == 1 then
-- If odd and the final parameter has content, we need a blank final parameter for the missing category.
if args[len] ~= nil then
len = len + 1
-- If it doesn't have content and is not preceded by another blank parameter, just ignore it.
elseif args[len - 1] ~= nil then
len = len - 1
end
end
if len < 4 then
insert(needs_fixing, "Should specify at least 2 categories.")
end
-- Fill out any missing parameters, but stop inputs like {{Category disambiguation|10000=foo}} causing a cascade of warnings.
local missing, contig_i = 0, 1
for i = 1, len do
if not args[i] then
insert(needs_fixing, "Parameter " .. i .. " " .. (raw_args[i] and "is blank" or "not given") .. ".")
args[i] = "{{{" .. i .. "}}}"
missing = missing + 1
if missing >= 10 then
error("Large number of missing parameters between " .. contig_i .. " and " .. orig_len .. " (the highest specified parameter)")
end
-- If the large number of missing parameters error needs to be displayed, use the parameter before the first gap as the start of the range containing gaps, or 1 if 1 itself is missing.
elseif missing == 0 then
contig_i = i
end
end
end
local list = {}
for i = 2, len, 2 do
local topic, cat = args[i - 1], args[i]
local cat_title = makeTitle(14, cat)
-- Warn if the category isn't valid (e.g. "{" isn't a valid category name).
if not cat_title then
insert(needs_fixing, nowiki(cat) .. " is not a valid category title.")
end
insert(list, "* For " .. topic .. ", see '''[[:" .. (cat_title and cat_title.prefixedText or "Category:" .. cat) .. "]].'''")
-- Warn if the category is a redlink.
if cat_title and not (yesno(args.allowredlink, true) or cat_title.exists) then
insert(needs_fixing, cat_title.prefixedText .. " is a redlink.")
end
end
local output = messageBox("cmbox", {
type = "content",
image = "[[File:Disambig gray.svg|50px|alt=icon]]",
text = "'''This category is not in use because it has an ambiguous title.'''" ..
frame:expandTemplate{
title = "Plainlist",
args = {
concat(list, "\n"),
style = "margin-left:1.6em;"
}
} ..
"'''Note:''' This category page should be empty. All entries should be recategorized under one of the above categories or an appropriate subcategory."
})
-- Add maintenance warnings if necessary.
if #needs_fixing > 0 then
sort(needs_fixing)
output = output .. messageBox("cmbox", {
type = "style",
text = frame:expandTemplate{
title = "Template link",
args = {
"Category disambiguation"
}
} .. " has the following issues:" ..
frame:expandTemplate{
title = "Plainlist",
args = {
"*" .. concat(needs_fixing, "\n*"),
style = "margin-left:1.6em;"
}
}
})
end
-- Only add behaviour switches and categories if in the category namespace.
if namespace == 14 then
output = output ..
"__DISAMBIG__" ..
"__EXPECTUNUSEDCATEGORY__" ..
"[[Category:Disambiguation categories]]" ..
"[[Category:All disambiguation pages]]" ..
(#needs_fixing > 0 and "[[Category:Wikipedia category-disambiguation box parameter needs fixing|∃" ..
title_text .. "]]" or "") ..
(pagesInCategory(title_text) > 0 and "[[Category:Non-empty disambiguation categories]]" or "")
elseif not yesno(args.nocat, true) then
output = output .. frame:expandTemplate{
title = "Incorrect namespace",
args = {
"category"
}
}
end
return output
end
return p