Module:snon-headword: Difference between revisions

From Linguifex
Jump to navigation Jump to search
Undo revision 502335 by Sware (talk)
No edit summary
 
(6 intermediate revisions by the same user not shown)
Line 119: Line 119:
local function make_plural(term)
local function make_plural(term)
return {{term .. "arr"}, {term .. "ar", l = "VE"}}
return {{term = term .. "arr"}, {term = term .. "ar", l = {"VE"}}}
end
end
Line 126: Line 126:
error("Can't specify plurals of plurale tantum " .. category_pos)
error("Can't specify plurals of plurale tantum " .. category_pos)
end
end
insert(data.inflections, {label = m_hw_util.glossary_link("plural only")})
else
else
plurals = m_hw_util.parse_term_list_with_modifiers {
plurals = m_hw_util.parse_term_list_with_modifiers {
Line 152: Line 151:
if is_plurale_tantum then
if is_plurale_tantum then
-- both singular and plural
-- both singular and plural
insert(data.inflections, {label = "sometimes " .. m_hw_util.glossary_link("plural only") .. ", in variation"})
table.insert(data.inflections, {label = "sometimes " .. m_hw_util.glossary_link("plural only") .. ", in variation"})
end
end
if mode == "?" then
if mode == "?" then
-- Plural is unknown
-- Plural is unknown
insert(data.categories, langname .. " " .. data.pos_category .. " with unknown or uncertain plurals")
table.insert(data.categories, langname .. " " .. data.pos_category .. " with unknown or uncertain plurals")
elseif mode == "!" then
elseif mode == "!" then
-- Plural is not attested
-- Plural is not attested
insert(data.inflections, {label = "plural not attested"})
table.insert(data.inflections, {label = "plural not attested"})
insert(data.categories, langname .. " " .. data.pos_category .. " with unattested plurals")
table.insert(data.categories, langname .. " " .. data.pos_category .. " with unattested plurals")
if plurals[1] then
if plurals[1] then
error("Can't specify any plurals along with unattested plural code '!'")
error("Can't specify any plurals along with unattested plural code '!'")
Line 170: Line 169:
-- If plural forms were given explicitly, then show "usually"
-- If plural forms were given explicitly, then show "usually"
if plurals[1] then
if plurals[1] then
insert(data.inflections, {label = "usually " .. m_hw_util.glossary_link("uncountable")})
table.insert(data.inflections, {label = "usually " .. m_hw_util.glossary_link("uncountable")})
insert(data.categories, langname .. " countable " .. data.pos_category)
table.insert(data.categories, langname .. " countable " .. data.pos_category)
else
else
insert(data.inflections, {label = m_hw_util.glossary_link("uncountable")})
table.insert(data.inflections, {label = m_hw_util.glossary_link("uncountable")})
end
end
else
else
Line 182: Line 181:
if mode == "~" then
if mode == "~" then
-- Mixed countable/uncountable noun, always has a plural
-- Mixed countable/uncountable noun, always has a plural
insert(data.inflections, {label = m_hw_util.glossary_link("countable") .. " and " .. m_hw_util.glossary_link("uncountable")})
table.insert(data.inflections, {label = m_hw_util.glossary_link("countable") .. " and " .. m_hw_util.glossary_link("uncountable")})
insert(data.categories, langname .. " uncountable " .. data.pos_category)
table.insert(data.categories, langname .. " uncountable " .. data.pos_category)
insert(data.categories, langname .. " countable " .. data.pos_category)
table.insert(data.categories, langname .. " countable " .. data.pos_category)
elseif plurals[1] then
elseif plurals[1] then
-- Countable nouns
-- Countable nouns
insert(data.categories, langname .. " countable " .. data.pos_category)
table.insert(data.categories, langname .. " countable " .. data.pos_category)
else
else
-- Uncountable nouns
-- Uncountable nouns
insert(data.categories, langname .. " uncountable " .. data.pos_category)
table.insert(data.categories, langname .. " uncountable " .. data.pos_category)
end
end
end
end


-- Gather plurals, handling requests for default plurals.
local new_plurals = {}
local has_default_or_hash = false
for _, pl in ipairs(plurals) do
for _, pl in ipairs(plurals) do
if pl.term:find("^%+") or pl.term:find("#") then
if pl.term == "+" then
has_default_or_hash = true
for _, generated_pl in ipairs(make_plural(lemma)) do
break
table.insert(new_plurals, generated_pl)
end
end
 
if has_default_or_hash then
for _, pl in ipairs(plurals) do
if pl.term == "+" then
-- make_plural should never return nil
pl = make_plural(lemma)
end
end
else
table.insert(new_plurals, pl)
end
end
end
end
plurals = new_plurals


insert_noun_inflection(plurals, "plural", "p")
insert_noun_inflection(plurals, "plural", "p")


if plurals[2] then
if plurals[2] then
insert(data.categories, langname .. " " .. data.pos_category .. " with multiple plurals")
table.insert(data.categories, langname .. " " .. data.pos_category .. " with multiple plurals")
end
end
end
end

Latest revision as of 14:37, 6 May 2026

export.show

function export.show(frame)

This function lacks documentation. Please add a description of its usages, inputs and outputs, or its difference from similar functions, or make it local to remove it from the function list.


local export = {}
local pos_functions = {}

local m_links = require("Module:links")
local m_table = require("Module:table")
local m_en_util = require("Module:en-utilities")
local m_hw_util = require("Module:headword utilities")

local lang = require("Module:languages").getByCode("snon")
local langname = lang:getCanonicalName()

local pagename = mw.loadData("Module:headword/data").pagename

local suffix_categories = {
	["adjectives"] = true,
	["adverbs"] = true,
	["nouns"] = true,
	["verbs"] = true,
}

local function do_inflection(data, forms, label, accel)
	if forms and #forms > 0 then
		forms.label = label
		if accel then
			forms.accel = accel
		end
		table.insert(data.inflections, forms)
	end
end

-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)
	local poscat = frame.args[1] or error("Part of speech has not been specified. Please pass parameter 1 to the module invocation.")
	local parargs = frame:getParent().args

	local params = {
		["head"] = {list = true, disallow_holes = true},
		["nomut"] = {type = "boolean"},
	}

	if pos_functions[poscat] then
		for key, val in pairs(pos_functions[poscat].params) do
			params[key] = val
		end
	end

	local args = require("Module:parameters").process(parargs, params)

	local heads = args.head
	if #heads == 0 then
		heads = {pagename}
	end

	local data = {
		lang = lang,
		pos_category = poscat,
		categories = {},
		heads = heads,
		genders = {},
		inflections = {},
		pagename = pagename,
	}

	if pos_functions[poscat] then
		pos_functions[poscat].func(args, data)
	end

	return require("Module:headword").full_headword(data)
end

-----------------------------------------------------------------------------------------
--                                          Nouns                                      --
-----------------------------------------------------------------------------------------

local allowed_genders = m_table.listToSet(
    {"m", "f", "mf", "mfbysense", "mfequiv", "gneut", "n", "m-p", "f-p", "mf-p", "mfbysense-p", "mfequiv-p", "gneut-p", "n-p", "?", "?-p"}
)

local function validate_genders(genders)
	for _, g in ipairs(genders) do
		if type(g) == "table" then
			g = g.spec
		end
		if not allowed_genders[g] then
			error("Unrecognized gender: " .. g)
		end
	end
end

local function do_noun(args, data, is_proper)
	local is_plurale_tantum = false
	local category_pos = m_en_util.singularize(data.pos_category)

	validate_genders(args[1])
	data.genders = args[1]
	-- Check for specific genders and pluralia tantum.
	for _, g in ipairs(args[1]) do
		if type(g) == "table" then
			g = g.spec
		end
		if g:find("-p$") then
			is_plurale_tantum = true
		end
	end

	local lemma = data.pagename

	local plurals = {}

	local function insert_noun_inflection(terms, label, accel)
		m_hw_util.insert_inflection {
			headdata = data,
			terms = terms,
			label = label,
			accel = accel and {form = accel} or nil,
		}
	end
	
	local function make_plural(term)
		return {{term = term .. "arr"}, {term = term .. "ar", l = {"VE"}}}
	end
	
	if is_plurale_tantum then
		if args[2][1] then
			error("Can't specify plurals of plurale tantum " .. category_pos)
		end
	else
		plurals = m_hw_util.parse_term_list_with_modifiers {
			paramname = {2, "pl"},
			forms = args[2],
			splitchar = ",",
		}
		-- Check for special plural signals
		local mode = nil

		local pl1 = plurals[1]
		if pl1 and #pl1.term == 1 then
			mode = pl1.term
			if mode == "?" or mode == "!" or mode == "-" or mode == "~" then
				pl1.term = nil
				if next(pl1) then
					error(("Can't specify inline modifiers with plural code '%s'"):format(mode))
				end
				table.remove(plurals, 1)  -- Remove the mode parameter
			elseif mode ~= "+" and mode ~= "#" then
				error(("Unexpected plural code '%s'"):format(mode))
			end
		end

		if is_plurale_tantum then
			-- both singular and plural
			table.insert(data.inflections, {label = "sometimes " .. m_hw_util.glossary_link("plural only") .. ", in variation"})
		end
		if mode == "?" then
			-- Plural is unknown
			table.insert(data.categories, langname .. " " .. data.pos_category .. " with unknown or uncertain plurals")
		elseif mode == "!" then
			-- Plural is not attested
			table.insert(data.inflections, {label = "plural not attested"})
			table.insert(data.categories, langname .. " " .. data.pos_category .. " with unattested plurals")
			if plurals[1] then
				error("Can't specify any plurals along with unattested plural code '!'")
			end
		elseif mode == "-" then
			-- Uncountable noun; may occasionally have a plural
			insert(data.categories, langname .. " uncountable " .. data.pos_category)

			-- If plural forms were given explicitly, then show "usually"
			if plurals[1] then
				table.insert(data.inflections, {label = "usually " .. m_hw_util.glossary_link("uncountable")})
				table.insert(data.categories, langname .. " countable " .. data.pos_category)
			else
				table.insert(data.inflections, {label = m_hw_util.glossary_link("uncountable")})
			end
		else
			-- Countable or mixed countable/uncountable
			if not plurals[1] and not is_proper then
				plurals[1] = {term = "+"}
			end
			if mode == "~" then
				-- Mixed countable/uncountable noun, always has a plural
				table.insert(data.inflections, {label = m_hw_util.glossary_link("countable") .. " and " .. m_hw_util.glossary_link("uncountable")})
				table.insert(data.categories, langname .. " uncountable " .. data.pos_category)
				table.insert(data.categories, langname .. " countable " .. data.pos_category)
			elseif plurals[1] then
				-- Countable nouns
				table.insert(data.categories, langname .. " countable " .. data.pos_category)
			else
				-- Uncountable nouns
				table.insert(data.categories, langname .. " uncountable " .. data.pos_category)
			end
		end

		local new_plurals = {}
		for _, pl in ipairs(plurals) do
			if pl.term == "+" then
				for _, generated_pl in ipairs(make_plural(lemma)) do
					table.insert(new_plurals, generated_pl)
				end
			else
				table.insert(new_plurals, pl)
			end
		end
		plurals = new_plurals

		insert_noun_inflection(plurals, "plural", "p")

		if plurals[2] then
			table.insert(data.categories, langname .. " " .. data.pos_category .. " with multiple plurals")
		end
	end
end

local function get_noun_params(is_proper)
	return {
		[1] = {list = "g", disallow_holes = true, required = not is_proper, default = "?", type = "genders", flatten = true},
		[2] = {list = "pl", disallow_holes = true},
		["w"] = {list = true, disallow_holes = true},
	}
end

pos_functions["nouns"] = {
	params = get_noun_params(),
	func = do_noun,
}

pos_functions["proper nouns"] = {
	params = get_noun_params("is proper"),
	func = function(args, data)
		do_noun(args, data, "is proper noun")
	end,
}

return export