Module:Category disambiguation

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 = "" 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] == "" 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 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] = "" 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 = "",		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__" .. "" ..			"" ..			(#needs_fixing > 0 and "[[Category:Wikipedia category-disambiguation box parameter needs fixing|∃" ..		title_text .. "]]" or "") .. (pagesInCategory(title_text) > 0 and "" or "") elseif not yesno(args.nocat, true) then output = output .. frame:expandTemplate{ title = "Incorrect namespace", args = { "category" }		}	end return output end

return p