Module:Category disambiguation
Appearance
This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
This Lua module is used on approximately 2,500 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 type(k) == "number" then
if v == "" then
insert(needs_fixing, "Parameter " .. k .. " is blank.")
v = "{{{" .. k .. "}}}"
end
len = k > len and k or len
end
args[k] = v
end
-- Number of parameters should be even.
local orig_len = len
if len % 2 == 1 then
-- Don't give a blank parameter warning if the template call ends "|}}".
if args[len] == "{{{" .. len .. "}}}" then
args[len] = nil
len = len - 1
remove(needs_fixing)
-- Otherwise we need a blank final parameter for the missing category.
else
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 = 0
for i = 1, len do
if not args[i] then
insert(needs_fixing, "Parameter " .. i .. " not given.")
args[i] = "{{{" .. i .. "}}}"
missing = missing + 1
if missing == 10 then
error("Large number of missing parameters between 1 and " .. orig_len .. " (the highest specified parameter)")
end
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 (args.allowredlink or cat_title:getContent()) 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