Module:Category disambiguation

Permanently protected module
From Wikipedia, the free encyclopedia

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