Module:en-headword

Definition from Wiktionary, the free dictionary
Jump to: navigation, search
The following documentation is located at Module:en-headword/documentation. [edit]

This module is used to implement English headword-line templates. It currently supports {{en-noun}}, {{en-adj}}, and {{en-adv}}. See the documentation of those templates for more information.


local m_headword = require("Module:headword")
local m_utilities = require("Module:utilities")
 
local export = {}
local pos_functions = {}
 
local lang = require("Module:languages").getByCode("en")
 
-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)
	PAGENAME = mw.title.getCurrentTitle().text
	local args = frame:getParent().args
	local poscat = frame.args[1] or error("Part of speech has not been specified. Please pass parameter 1 to the module invocation.")
 
	local head = args["head"]; if head == "" then head = nil end
	local inflections = {}
	local categories = {"English " .. poscat}
 
	if pos_functions[poscat] then
		pos_functions[poscat](args, inflections, categories)
	end
 
	return
		m_headword.format_headword(head, lang, nil) ..
		m_headword.format_inflections(inflections, lang, nil) ..
		m_utilities.format_categories(categories, lang)
end
 
-- This function does the common work between adjectives and adverbs
function make_comparatives(params, inflections, categories)
	local comp_parts = {label = "[[Appendix:Glossary#comparable|comparative]]", accel = "comparative-form-of"}
	local sup_parts = {label = "[[Appendix:Glossary#comparable|superlative]]", accel = "superlative-form-of"}
 
	if #params == 0 then
		table.insert(params, {"more"})
	end
 
	-- To form the stem, replace -(e)y with -i and remove a final -e.
	local stem = PAGENAME:gsub("([^aeiou])e?y$", "%1i"):gsub("e$", "")
 
	-- Go over each parameter given and create a comparative and superlative form
	for i, val in ipairs(params) do
		local comp = val[1]
		local sup = val[2]
 
		if comp == "more" and PAGENAME ~= "many" and PAGENAME ~= "much" then
			table.insert(comp_parts, "[[more]] " .. PAGENAME)
			table.insert(sup_parts, "[[most]] " .. PAGENAME)
		elseif comp == "further" and PAGENAME ~= "far" then
			table.insert(comp_parts, "[[further]] " .. PAGENAME)
			table.insert(sup_parts, "[[furthest]] " .. PAGENAME)
		elseif comp == "er" then
			table.insert(comp_parts, stem .. "er")
			table.insert(sup_parts, stem .. "est")
		else
			-- If the full comparative was given, but no superlative, then
			-- create it by replacing the ending -er with -est.
			if not sup then
				if comp:find("er$") then
					sup = comp:gsub("er$", "est")
				else
					error("The superlative of \"" .. comp .. "\" cannot be generated automatically. Please provide it with the \"sup" .. (i == 1 and "" or i) .. "=\" parameter.")
				end
			end
 
			table.insert(comp_parts, comp)
			table.insert(sup_parts, sup)
		end
	end
 
	table.insert(inflections, comp_parts)
	table.insert(inflections, sup_parts)
end
 
pos_functions["adjectives"] = function(args, inflections, categories)
	local shift = 0
 
	-- If the first parameter is ?, then don't show anything, just return.
	if args[1] == "?" then
		return
	-- If the first parameter is -, then move all parameters up one position.
	elseif args[1] == "-" then
		shift = 1
	end
 
	-- Gather all the comparative and superlative parameters.
	local params = {}
	local i = 1
 
	while true do
		local comp = args[i + shift]; if comp == "" then comp = nil end
		local sup = args["sup" .. (i == 1 and "" or i)]; if sup == "" then sup = nil end
 
		if not comp then
			break
		end
 
		table.insert(params, {comp, sup})
		i = i + 1
	end
 
	if shift == 1 then
		-- If the first parameter is "-" but there are no parameters,
		-- then show "not comparable" only and return. If there are parameters,
		-- then show "not generally comparable" before the forms.
		if #params == 0 then
			table.insert(inflections, {label = "not [[Appendix:Glossary#comparable|comparable]]"})
			return
		else
			table.insert(inflections, {label = "not generally [[Appendix:Glossary#comparable|comparable]]"})
		end
	end
 
	-- Process the parameters
	make_comparatives(params, inflections, categories)
end
 
pos_functions["adverbs"] = function(args, inflections, categories)
	local shift = 0
 
	-- If the first parameter is ?, then don't show anything, just return.
	if args[1] == "?" then
		return
	-- If the first parameter is -, then move all parameters up one position.
	elseif args[1] == "-" then
		shift = 1
	end
 
	-- Gather all the comparative and superlative parameters.
	local params = {}
	local i = 1
 
	while true do
		local comp = args[i + shift]; if comp == "" then comp = nil end
		local sup = args["sup" .. (i == 1 and "" or i)]; if sup == "" then sup = nil end
 
		if not comp then
			break
		end
 
		table.insert(params, {comp, sup})
		i = i + 1
	end
 
	if shift == 1 then
		-- If the first parameter is "-" but there are no parameters,
		-- then show "not comparable" only and return. If there are parameters,
		-- then show "not generally comparable" before the forms.
		if #params == 0 then
			table.insert(inflections, {label = "not [[Appendix:Glossary#comparable|comparable]]"})
			return
		else
			table.insert(inflections, {label = "not generally [[Appendix:Glossary#comparable|comparable]]"})
		end
	end
 
	-- Process the parameters
	make_comparatives(params, inflections, categories)
end
 
pos_functions["nouns"] = function(args, inflections, categories)
	-- Gather all the plural parameters from the numbered parameters.
	local plurals = {}
	local i = 1
 
	while true do
		local pl = args[i]; if pl == "" then pl = nil end
 
		if not pl then
			break
		end
 
		table.insert(plurals, pl)
		i = i + 1
	end
 
	-- Decide what to do next...
	local mode = plurals[1]
 
	-- Plural is unknown
	if mode == "?" then
		table.insert(categories, "English nouns with unknown or uncertain plurals")
		return
	-- Plural is not attested
	elseif mode == "!" then
		table.insert(inflections, {label = "plural not attested"})
		table.insert(categories, "English nouns with unattested plurals")
		return
	-- Uncountable noun; may occasionally have a plural
	elseif mode == "-" then
		table.insert(categories, "English uncountable nouns")
		table.remove(plurals, 1)  -- Remove the mode parameter
 
		-- If plural forms were given explicitly, then show "usually"
		if #plurals > 0 then
			table.insert(inflections, {label = "usually [[Appendix:Glossary#uncountable|uncountable]]"})
			table.insert(categories, "English countable nouns")
		else
			table.insert(inflections, {label = "[[Appendix:Glossary#uncountable|uncountable]]"})
		end
	-- Mixed countable/uncountable noun, always has a plural
	elseif mode == "~" then
		table.insert(inflections, {label = "[[Appendix:Glossary#countable|countable]] and [[Appendix:Glossary#uncountable|uncountable]]"})
		table.insert(categories, "English uncountable nouns")
		table.insert(categories, "English countable nouns")
		table.remove(plurals, 1)  -- Remove the mode parameter
 
		-- If no plural was given, add a default one now
		if #plurals == 0 then
			plurals = {"s"}
		end
	-- The default, always has a plural
	else
		table.insert(categories, "English countable nouns")
 
		-- If no plural was given, add a default one now
		if #plurals == 0 then
			plurals = {"s"}
		end
	end
 
	-- If there are no plurals to show, return now
	if #plurals == 0 then
		return
	end
 
	-- There are plural forms to show, so show them
	local pl_parts = {label = "plural", accel = "plural-form-of"}
 
	local stem = PAGENAME
 
	for i, pl in ipairs(plurals) do
		if pl == "s" then
			table.insert(pl_parts, stem .. "s")
		elseif pl == "es" then
			table.insert(pl_parts, stem .. "es")
		else
			table.insert(pl_parts, pl)
		end
	end
 
	table.insert(inflections, pl_parts)
end
 
return export