Module:gem-decl-noun

Hello, you have come here looking for the meaning of the word Module:gem-decl-noun. In DICTIOUS you will not only get to know all the dictionary meanings for the word Module:gem-decl-noun, but we will also tell you about its etymology, its characteristics and you will know how to say Module:gem-decl-noun in singular and plural. Everything you need to know about the word Module:gem-decl-noun you have here. The definition of the word Module:gem-decl-noun will help you to be more precise and correct when speaking or writing your texts. Knowing the definition ofModule:gem-decl-noun, as well as those of other words, enriches your vocabulary and provides you with more and better linguistic resources.

Called by {{gem-decl-noun}}. Do not use directly.


local export = {}

local m_pron = require("Module:gem-pronunc")
local m_links = require("Module:links")
local m_utils = require("Module:utilities")

local lang = require("Module:languages").getByCode("gem-pro")

local i_muts = m_pron.i_mutations

local decl_data = require("Module:gem-decl-noun/data")
local decl_data_irreg = require("Module:gem-decl-noun/data/irreg")

local endings = {
	 = "a-m",  = "a-n",  = "i-mf",  = "i-n",  = "ijo-f",  = "in-f",
	 = "n-f",  = "o-f",  = "r-mf",  = "u-mf",  = "u-n"
}

local endings_reverse = {
	 = "az",  = "ą",  = "",  = "iz",  = "iz",  = "iz",  = "i", 
	 = "ī",  = "į̄",  = "ô",  = "ô",  = "ǭ",  = "ō",  = "ēr",  = "ēr", 
	 = "ēr",  = "uz",  = "uz",  = "uz",  = "u",  = "az",
}

local function detect_decl(word, stem, gender)
	if stem and gender then
		local decl = stem .. "-" .. gender
		return decl, {mw.ustring.sub(word, 1, -(mw.ustring.len(endings_reverse) + 1))}
	elseif stem == "z" and mw.ustring.sub(word, -2) == "az" then -- z-stem
		return "z-n", {mw.ustring.sub(word, 1, -3)}
	elseif mw.ustring.find(word, "ô$") then -- an-stem
		if gender then
			return "n-" .. gender, {mw.ustring.sub(word, 1, -2)}
		else
			error("Gender must be specified for an-stems.")
		end
	else
		for ending, decl in pairs(endings) do
			if mw.ustring.find(word, ending .. "$") then
				return decl, {mw.ustring.sub(word, 1, -(mw.ustring.len(ending) + 1))}
			end
		end
		-- No matches, assume consonant stem. Now check for s-stems
		local stem = ""
		if mw.ustring.sub(word, -1, -1) == "s" and not mw.ustring.find(mw.ustring.sub(word, -2, -2), "") then
			stem = word
		else
			stem = mw.ustring.sub(word, 1, -2)
		end
		return (gender and "cons-" .. gender or "cons-mf"), {stem}
	end
end
		
	
local function add_asterisks(forms, data)
	for _, form in ipairs(forms) do
		for i, subform in ipairs(data.forms) do
			data.forms = "*" .. subform
		end
	end
end

-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)
	local parent_args = frame:getParent().args
	if mw.title.getCurrentTitle().nsText ~= "Reconstruction" then return end
	
	local stems = nil
	local decl_type = {}
	local word = mw.title.getCurrentTitle().subpageText
	local args = {}

	if not decl_data_irreg then
		if frame.args.decl then
			decl_type = frame.args.decl
		else
			if parent_args.stem and parent_args.g and parent_args then
				decl_type = parent_args.stem .. "-" .. parent_args.g
				stems = {parent_args}
			else
				decl_type, stems = detect_decl(word, parent_args.stem, parent_args.g)
			end
		end
		
		if not decl_type then
			error("Unknown declension '" .. decl_type .. "'")
		end
		
		args = require("Module:parameters").process(parent_args, decl_data.params, true)
	
		if stems then
			for i, stem in ipairs(stems) do
				args = stem
			end
		end
	end

	local data = {forms = {}, categories = {}}
	
	data.head = parent_args or nil
	
	-- Generate the forms
	if decl_data_irreg then
		table.insert(data.categories, "Proto-Germanic irregular nouns")
		decl_data_irreg(parent_args, data)
	else
		decl_data(args, data)
	end

	-- Make the table
	return make_table(data)
end

function make_table(data)

	local function show_form(form)
		if not form then
			return "—"
		end
		
		local ret = {}
		
		for key, subform in ipairs(form) do
			if mw.ustring.find(subform, "") or mw.ustring.find(subform, "e") then
				subform = i_muts(subform)
			end
			if subform ~= "—" then
				subform = "*" .. subform
			end
			table.insert(ret, subform)
		end
			
		return table.concat(ret, ", ")
	end
	
	local function repl(param)
		if param == "decl_type" then
			return data.decl_type
		elseif param == "title" then
			return "*" .. data.forms.nom_sg
		else
			return show_form(data.forms)
		end
	end

	local function make_cases(data)
		local cases = {"nominative", "vocative", "accusative", "genitive", "dative", "instrumental"}
		local ret = {}
		
		for _, case in ipairs(cases) do
			local case_short = mw.ustring.sub(case, 1, 3)
		--	assert(false, case_short)
			table.insert(ret, "|- \n! | " .. case .. "\n")
			table.insert(ret, "| " .. show_form(data.forms) .. "\n")
			if data.forms then
				table.insert(ret, "| " .. show_form(data.forms) .. "\n")
			end
		end
		return table.concat(ret)
	end

	local no_plural = data.forms.nom_pl == nil
	
	local table_top = mw.getCurrentFrame():expandTemplate{
		title = 'inflection-table-top',
		args = {
			title = 'Declension of <span lang="gem-pro">{{{title}}} ({{{decl_type}}})',
			palette = 'orange',
			tall = 'yes',
		}
	}

	local table_bottom = mw.getCurrentFrame():expandTemplate{
		title = 'inflection-table-bottom'
	}

	local wikicode = table_top .. [=[
! class="outer" |
! class="outer" | singular ]=] .. (no_plural and "\n" or [=[

! class="outer" | plural
]=]) .. make_cases(data) .. [=[
]=] .. table_bottom

	return (mw.ustring.gsub(wikicode, "{{{(+)}}}", repl)) .. m_utils.format_categories(data.categories, lang)
end

return export