Modulu:redlink category

Documentation for this module may be created at Modulu:redlink category/dok

local export = {}

local rmatch = mw.ustring.match

---------------- for {{redlink category}} ---------------

function export.cat(frame)
	local redlink_category = ""

	local m_languages = require("Module:languages")
	local code = frame.args[1] -- language code
	local template = frame.args["template"]

	local lang = m_languages.getByCode(frame.args[1])
	local entry = require("Module:links").getLinkPage(frame.args[2], lang) -- entry name (parameter 2 in Template:m, Template:l)

	local link_object = mw.title.new (entry)
	
	-- Prevent an expensive parser function error. Unfortunately, we can't check
	-- the expensive parser function count before running the preceding code
	-- in this function.
	local success, exists
	if link_object then
		success, exists = pcall(function () return link_object.exists end)
	end

	if success and not exists then
		local langname = lang:getCanonicalName()
		
		redlink_category = "[[Category:" .. langname .. " redlinks]]"
		if template and template ~= "-" then
			redlink_category = redlink_category .. "[[Category:" .. langname .. " redlinks/" .. template .. "]]"
		end
	end

	return redlink_category

end

---------------- for {{redlinkcat}} ---------------

-- FIXME: Both of these shouldn't exist.

local redlinkcat_posname = {
	['n'] = 'nouns',
	['pn'] = 'proper nouns',
	['v'] = 'verbs',
	['a'] = 'adjectives',
	['part'] = 'participles',
	['sufn'] = 'suffixes',
	['sufv'] = 'suffixes',
	['num'] = 'numerals',
	['pron'] = 'pronouns',
	['det'] = 'determiners',
}

local redlinkcat_inflname = {
	['n'] = 'declension',
	['v'] = 'conjugation',
	['a'] = 'declension',
	['part'] = 'declension',
	['sufn'] = 'declension',
	['sufv'] = 'conjugation',
	['num'] = 'declension',
	['pron'] = 'declension',
	['det'] = 'declension',
}

local function if_not_empty(val)
	return val ~= "" and val
end

function export.redlinkcat(frame)
	local SUBPAGENAME = mw.title.getCurrentTitle().subpageText
	local args = frame:getParent().args
	local langcode = if_not_empty(args[1])
	local pos = if_not_empty(args[2])
	if langcode then
		local canonicalname = require("Module:languages").getByCode(langcode):getCanonicalName()
		if not pos then
			local pos, inflname = rmatch(SUBPAGENAME, "^" .. canonicalname .. " (.*) with red links in their (.*) tables$")
			if pos then
				mw.log(langcode, require("Module:languages").getByCode(langcode), ('%q'):format(pos))
				local text = "This category contains " .. canonicalname .. " " .. pos
				text = text .. " with red links in their " .. inflname .. " tables."
				text = text .. " This category '''may''' sometimes be empty."
				local poscat = pos:gsub("^.", string.upper) .. " with red links in their " .. inflname .. " tables by language"
				local langcat = canonicalname .. " terms with red links in their inflection tables"
				text = text .. "[[Category:" .. poscat .. "]]"
				text = text .. "[[Category:" .. langcat .. "]]"
				text = text .. "__HIDDENCAT__"
				return text
			else
				return "[[Category:Terms with red links in their inflection tables by language]]"
			end
		else
			mw.log(langcode, require("Module:languages").getByCode(langcode), ('%q'):format(pos))
			local text = "This category contains " .. canonicalname .. " " .. redlinkcat_posname[pos]
			text = text .. " with red links in their " .. redlinkcat_inflname[pos] .. " tables."
			text = text .. " This category '''may''' sometimes be empty."
			local poscat = redlinkcat_posname[pos]:gsub("^.", string.upper) .. " with red links in their " .. redlinkcat_inflname[pos] .. " tables by language"
			local langcat = canonicalname .. " terms with red links in their inflection tables"
			text = text .. "[[Category:" .. poscat .. "]]"
			text = text .. "[[Category:" .. langcat .. "]]"
			text = text .. "__HIDDENCAT__"
			return text
		end
	else
		if pos then
			return "[[Category:Terms with red links in their inflection tables by language|*]]"
		else
			return "[[Category:Wiktionary maintenance]]"
		end
	end
end

return export