Module:Category disambiguation
Appearance
| This module is rated as ready for general use. It has reached a mature state, is considered relatively stable and bug-free, and may be used wherever appropriate. It can be mentioned on help pages and other Wikipedia resources as an option for new users. To minimise server load and avoid disruptive output, improvements should be developed through sandbox testing rather than repeated trial-and-error editing. |
| This module is currently under extended confirmed protection. Extended confirmed protection prevents edits from all unregistered editors and registered users with fewer than 30 days tenure and 500 edits. The policy on community use specifies that extended confirmed protection can be applied to combat disruption, if semi-protection has proven to be ineffective. Extended confirmed protection may also be applied to enforce arbitration sanctions. Please discuss any changes on the talk page; you may submit an edit request to ask for uncontroversial changes supported by consensus. |
| This Lua module is used on approximately 2,600 pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them. |
Usage
This module implements the {{Category disambiguation}} template. Please see the template page for usage instructions.
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]]",
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