Jump to content

Module:sv-nouns

From Wiktionary, the free dictionary

Notice This module needs documentation.
Please document this module by describing its purpose and usage on the documentation page.

local m_utilities = require("Module:utilities")
local m_links = require("Module:links")

local export = {}

local ufind = mw.ustring.find

local lang = require("Module:languages").getByCode("sv")

-- Functions that do the actual inflecting by creating the forms of a basic term.
local inflections = {}

local function track(page)
	require("Module:debug/track")("sv-nouns/" .. page)
	return true
end

local function get_s(par)
	return ufind(par, "[sxzſßꜩSXZẞꜨ]:?$") and "" or "s"
end

-- Helper functions

local function postprocess(args, data)
	local n = args.n

	if n == "pl" then
		table.insert(data.categories, lang:getCanonicalName() .. " pluralia tantum")
	end

	if n == "sg" then
		table.insert(data.categories, lang:getCanonicalName() .. " uncountable nouns")
	end

	for key, form in pairs(data.forms) do
		-- Do not show singular or plural forms for nominals that don't have them
		if (n == "pl" and key:find("_sg$")) or (n == "sg" and key:find("_pl$")) then
			form = nil
		end
		-- Escape any intermediate colons (for the link template) and remove any final colons.
		if form then
			for k, v in ipairs(form) do
				form[k] = v:gsub("():", function(pos)
					if pos == #v then
						return ""
					else
						return "\\:"
					end
				end)
			end
		end
		data.forms[key] = form
	end

	-- Check if the lemma form matches the page name
	if lang:stripDiacritics(data.forms[n == "pl" and "indf_nom_pl" or "indf_nom_sg"][1]) ~= mw.loadData("Module:headword/data").pagename then
		table.insert(data.categories, lang:getCanonicalName() .. " entries with inflection not matching pagename")
	end
end


-- Make the table
local function make_table(data)
	local function show_form(form)
		if not form then
			return "—"
		elseif type(form) ~= "table" then
			error("a non-table value was given in the list of inflected forms.")
		elseif #form == 0 then
			return "—"
		end

		local ret = {}

		for key, subform in ipairs(form) do
			table.insert(ret, m_links.full_link({lang = lang, term = subform}))
		end

		return table.concat(ret, "<br/>")
	end

	return mw.getCurrentFrame():expandTemplate{
		title = 'sv-decl-noun',
		args = {
			show_form(data.forms['indf_nom_sg']),
			show_form(data.forms['defn_nom_sg']),
			show_form(data.forms['indf_nom_pl']),
			show_form(data.forms['defn_nom_pl']),
			show_form(data.forms['indf_gen_sg']),
			show_form(data.forms['defn_gen_sg']),
			show_form(data.forms['indf_gen_pl']),
			show_form(data.forms['defn_gen_pl']),
			definitions = data.title and "(" .. data.title .. ")" or "",
		}
	}
end

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

	if not inflections[infl_type] then
		error("Unknown inflection type '" .. infl_type .. "'")
	end

	local params = {
		n = true,
	}
	for k, v in pairs(inflections[infl_type].params) do
		params[k] = v
	end
	local args = require("Module:parameters").process(parent_args, params)
	local data = {forms = {}, title = nil, categories = {}}

	-- Generate the forms
	inflections[infl_type].func(args, data)

	-- Postprocess
	postprocess(args, data)

	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end

--[=[
	Inflection functions
]=]--

inflections["c-ar"] = {
	params = {
		[1] = true,
		[2] = true,
		fv = true,
	},
	func = function(args, data)
		local par1 = args[1]
		local par2 = args[2]
		local fv = args.fv or ""

		par1 = par1 or mw.loadData("Module:headword/data").pagename
		par2 = (par2 or par1) .. fv

		local s = get_s(par1)

		data.forms["indf_nom_sg"] = {par1}
		data.forms["indf_gen_sg"] = {par1 .. s}
		data.forms["defn_nom_sg"] = {par2 .. "en"}
		data.forms["defn_gen_sg"] = {par2 .. "ens"}

		data.forms["indf_nom_pl"] = {par2 .. "ar"}
		data.forms["indf_gen_pl"] = {par2 .. "ars"}
		data.forms["defn_nom_pl"] = {par2 .. "arna"}
		data.forms["defn_gen_pl"] = {par2 .. "arnas"}
	end,
}

inflections["c-er"] = {
	params = {
		[1] = true,
		[2] = true,
		fv = true,
		ien = {type = "boolean"},
		["sg-nom-def"] = true,
		["sg-gen-def"] = true,
	},
	func = function(args, data)
		local par1 = args[1]
		local par2 = args[2]
		local fv = args.fv or ""
		local ien = args.ien
		local sg_nom_def = args["sg-nom-def"]
		local sg_gen_def = args["sg-gen-def"]

		if sg_nom_def or sg_gen_def then
			track("manual")
		end

		par1 = par1 or mw.loadData("Module:headword/data").pagename
		par2 = (par2 or par1) .. fv

		local s = get_s(par1)

		data.forms["indf_nom_sg"] = {par1}
		data.forms["indf_gen_sg"] = {par1 .. s}
		data.forms["defn_nom_sg"] = {sg_nom_def or par2 .. "en"}
		data.forms["defn_gen_sg"] = {sg_gen_def or par2 .. "ens"}

		data.forms["indf_nom_pl"] = {par2 .. "er"}
		data.forms["indf_gen_pl"] = {par2 .. "ers"}
		data.forms["defn_nom_pl"] = {par2 .. "erna"}
		data.forms["defn_gen_pl"] = {par2 .. "ernas"}

		if ien then
			table.insert(data.forms["defn_nom_sg"], 1, sg_nom_def or par2 .. "n")
			table.insert(data.forms["defn_gen_sg"], 1, sg_gen_def or par2 .. "ns")
		end
	end,
}

inflections["c-or"] = {
	params = {
		[1] = {template_default = "{{{1}}}"},
	},
	func = function(args, data)
		local par1 = args[1]
		if not par1 then
			par1 = mw.loadData("Module:headword/data").pagename
			if par1:sub(-1) == "a" then
				par1 = par1:sub(1, -2)
			else
				error(("Infinitive '%s' derived from current pagename doesn't end in -a"):format(par1))
			end
		end

		data.forms["indf_nom_sg"] = {par1 .. "a"}
		data.forms["indf_gen_sg"] = {par1 .. "as"}
		data.forms["defn_nom_sg"] = {par1 .. "an"}
		data.forms["defn_gen_sg"] = {par1 .. "ans"}

		data.forms["indf_nom_pl"] = {par1 .. "or"}
		data.forms["indf_gen_pl"] = {par1 .. "ors"}
		data.forms["defn_nom_pl"] = {par1 .. "orna"}
		data.forms["defn_gen_pl"] = {par1 .. "ornas"}
	end,
}

inflections["c-r"] = {
	params = {
		[1] = {template_default = "{{{1}}}"},
		[2] = true,
		[3] = true,
	},
	func = function(args, data)
		local par1 = args[1]
		local par2 = args[2]
		local par3 = args[3]
		par1 = par1 or mw.loadData("Module:headword/data").pagename
		par2 = par2 or par1
		par3 = par3 or par2 or par1
	
		local s = get_s(par1)
		
		data.forms["indf_nom_sg"] = {par1}
		data.forms["indf_gen_sg"] = {par1 .. s}
		data.forms["defn_nom_sg"] = {par2 .. "n"}
		data.forms["defn_gen_sg"] = {par2 .. "ns"}
		
		data.forms["indf_nom_pl"] = {par3 .. "r"}
		data.forms["indf_gen_pl"] = {par3 .. "rs"}
		data.forms["defn_nom_pl"] = {par3 .. "rna"}
		data.forms["defn_gen_pl"] = {par3 .. "rnas"}
	end,
}

inflections["c-zero"] = {
	params = {
		[1] = {template_default = "{{{1}}}"},
		[2] = true,
		[3] = true,
	},
	func = function(args, data)
		local par1 = args[1]
		local par2 = args[2]
		local par3 = args[3]
		par1 = par1 or mw.loadData("Module:headword/data").pagename
		par2 = par2 or par1
		par3 = par3 or par2 or par1

		local s = get_s(par1)

		data.forms["indf_nom_sg"] = {par1}
		data.forms["indf_gen_sg"] = {par1 .. s}
		data.forms["defn_nom_sg"] = {par2 .. "n"}
		data.forms["defn_gen_sg"] = {par2 .. "ns"}

		data.forms["indf_nom_pl"] = {par1}
		data.forms["indf_gen_pl"] = {par1 .. s}
		data.forms["defn_nom_pl"] = {par3 .. "na"}
		data.forms["defn_gen_pl"] = {par3 .. "nas"}
	end,
}

inflections["c-are"] = {
	params = {
	},
	func = function(args, data)
		local par1 = args[1] or mw.loadData("Module:headword/data").pagename
		if par1:sub(-3) ~= "are" then
			error("The noun must end in -are.")
		end

		data.forms["indf_nom_sg"] = {par1}
		data.forms["indf_gen_sg"] = {par1 .. "s"}
		data.forms["defn_nom_sg"] = {par1 .. "n"}
		data.forms["defn_gen_sg"] = {par1 .. "ns"}

		data.forms["indf_nom_pl"] = {par1}
		data.forms["indf_gen_pl"] = {par1 .. "s"}
		data.forms["defn_nom_pl"] = {par1:sub(1, -2) .. "na"}
		data.forms["defn_gen_pl"] = {par1:sub(1, -2) .. "nas"}
	end,
}

inflections["c-nde"] = {
	params = {
	},
	func = function(args, data)
		local par1 = args[1] or mw.loadData("Module:headword/data").pagename
		if par1:sub(-3) ~= "nde" then
			error("The noun must end in -nde.")
		end

		data.forms["indf_nom_sg"] = {par1}
		data.forms["indf_gen_sg"] = {par1 .. "s"}
		data.forms["defn_nom_sg"] = {par1 .. "n"}
		data.forms["defn_gen_sg"] = {par1 .. "ns"}

		data.forms["indf_nom_pl"] = {par1}
		data.forms["indf_gen_pl"] = {par1 .. "s"}
		data.forms["defn_nom_pl"] = {par1 .. "na"}
		data.forms["defn_gen_pl"] = {par1 .. "nas"}
	end,
}

inflections["n-n"] = {
	params = {
		[1] = true,
		[2] = true,
		[3] = true,
	},
	func = function(args, data)
		local par1 = args[1]
		local par2 = args[2]
		local par3 = args[3]
		par1 = par1 or mw.loadData("Module:headword/data").pagename
		par2 = par2 or par1
		par3 = par3 or par2 or par1

		local s = get_s(par1)

		data.forms["indf_nom_sg"] = {par1}
		data.forms["indf_gen_sg"] = {par1 .. s}
		data.forms["defn_nom_sg"] = {par2 .. "t"}
		data.forms["defn_gen_sg"] = {par2 .. "ts"}

		data.forms["indf_nom_pl"] = {par3 .. "n"}
		data.forms["indf_gen_pl"] = {par3 .. "ns"}
		data.forms["defn_nom_pl"] = {par3 .. "na"}
		data.forms["defn_gen_pl"] = {par3 .. "nas"}
	end,
}

inflections["n-r"] = {
	params = {
		[1] = true,
		[2] = true,
	},
	func = function(args, data)
		local par1 = args[1]
		local par2 = args[2]
		par1 = par1 or mw.loadData("Module:headword/data").pagename
		par2 = par2 or par1

		local s = get_s(par1)

		data.forms["indf_nom_sg"] = {par1}
		data.forms["indf_gen_sg"] = {par1 .. s}
		data.forms["defn_nom_sg"] = {par2 .. "t"}
		data.forms["defn_gen_sg"] = {par2 .. "ts"}

		data.forms["indf_nom_pl"] = {par2 .. "r"}
		data.forms["indf_gen_pl"] = {par2 .. "rs"}
		data.forms["defn_nom_pl"] = {par2 .. "rna"}
		data.forms["defn_gen_pl"] = {par2 .. "rnas"}
	end,
}

inflections["n-zero"] = {
	params = {
		[1] = {template_default = "{{{1}}}"},
		[2] = true,
		stem = {alias_of = 2},
		[3] = true,
	},
	func = function(args, data)
		local par1 = args[1]
		local par2 = args[2] or args.stem
		local par3 = args[3]
		par1 = par1 or mw.loadData("Module:headword/data").pagename
		par2 = par2 or par1
		par3 = par3 or par2 or par1

		local s = get_s(par1)

		data.forms["indf_nom_sg"] = {par1}
		data.forms["indf_gen_sg"] = {par1 .. s}
		data.forms["defn_nom_sg"] = {par2 .. "et"}
		data.forms["defn_gen_sg"] = {par2 .. "ets"}

		data.forms["indf_nom_pl"] = {par1}
		data.forms["indf_gen_pl"] = {par1 .. s}
		data.forms["defn_nom_pl"] = {par3 .. "en"}
		data.forms["defn_gen_pl"] = {par3 .. "ens"}
	end,
}

return export