Module:ro-noun

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

This module is experimental.
The details of its operation have not yet been fully decided upon. Do not deploy widely until the module is finished.
This module needs documentation.
Please document this module by describing its purpose and usage on the documentation page.

local export = {}

local m_links = require("Module:links")
local lang = require("Module:languages").getByCode("ro")
local m_gen = require("Module:gender and number")

local PAGENAME = PAGENAME or mw.title.getCurrentTitle().text

local data = {}
data.forms = {}

function export.show(frame)
	local args = frame:getParent().args
	data.n = args
	data.g = args or PAGENAME == 'Redboywild/ro-noun' and 'n' or error('Please provide gender as first parameter')
	data.pl = args or data.n == 'pl' and PAGENAME or PAGENAME == 'Redboywild/ro-noun' and 'cuvinte'
	data.word = args or PAGENAME == 'Redboywild/ro-noun' and 'cuvânt' or 'PAGENAME'
	data.gd = args
	data.hyphen = args
	
	data.forms = inflect(data.word, data.g, data.pl, data.gd, data.hyphen)
	for key, val in pairs(data.forms) do
		if type(data.forms) == 'string' then
			data.forms = { data.forms }
		end
		for i, form in ipairs(data.forms) do
			data.forms = m_links.full_link({term = form, lang = lang}, nil, false)
		end
		data.forms = table.concat(data.forms, ', ')
	end
	return make_table(data)
end

function inflect(word, g, pl, gd, hyphen)
	local forms = {}
	local shortcut = false
	if not pl or pl:sub(1, 1) == '-' then
		shortcut = true
	end
	if shortcut then
		pl = export.make_plural(word, g, pl, hyphen)
	end
	hyph = hyphen and '-' or ''
	if g == 'm' then
		forms.na_sg_indef = word
		forms.na_pl_indef = pl
		forms.na_pl_def = pl .. 'i'
		forms.gd_sg_indef = word
		forms.gd_pl_indef = pl
		forms.gd_pl_def = pl .. 'lor'
		forms.v_pl = pl .. 'lor'
		if not hyphen and mw.ustring.find(word, 'u$') then
			forms.na_sg_def = word .. 'l'
			forms.gd_sg_def = word .. 'lui'
			forms.v_sg = word .. 'le'
		elseif not hyphen and mw.ustring.find(word, 'e$') then
			forms.na_sg_def = word .. 'le'
			forms.gd_sg_def = word .. 'lui'
			forms.v_sg = word
		else
			forms.na_sg_def = word .. hyph .. 'ul'
			forms.gd_sg_def = word .. hyph .. 'ului'
			forms.v_sg = word .. hyph .. 'ule'
		end
	elseif g == 'f' then
		if pl:match('uri$') and not word:match('ură$') then
			if gd then
				gd = export.make_plural(word, g, gd, hyphen)
			else
				error('Please provide the genitive/dative form as the gd= parameter')
			end
		else
			gd = pl
		end
		forms.na_sg_indef = word
		forms.na_pl_indef = pl
		forms.na_pl_def = pl .. 'le'
		forms.gd_sg_indef = gd
		forms.gd_pl_indef = pl
		forms.gd_pl_def = pl .. 'lor'
		forms.v_pl = pl .. 'lor'
		if mw.ustring.find(word, 'ă$') then
			forms.na_sg_def = word:gsub('ă$', 'a')
			forms.gd_sg_def = gd .. 'i'
			forms.v_sg = {word:gsub('ă$', 'o'), word}
		elseif mw.ustring.find(word, 'ie') then
			forms.na_sg_def = word:gsub('e$', 'a')
			forms.gd_sg_def = gd .. 'i'
			forms.v_sg = {word:gsub('e$', 'o'), word}
		elseif mw.ustring.find(word, 'ie$') then
			forms.na_sg_def = word:gsub('e$', 'a')
			forms.gd_sg_def = word .. 'i'
			forms.v_sg = {word:gsub('e$', 'o'), word}
		elseif mw.ustring.find(word, 'e$') then
			forms.na_sg_def = word .. 'a'
			forms.gd_sg_def = gd .. 'i'
			forms.v_sg = {word .. 'o', word}
		elseif mw.ustring.find(word, 'a$') then
			forms.na_sg_def = word .. 'ua'
			forms.gd_sg_def = gd .. 'i'
			forms.v_sg = word
		end
	elseif g == 'n' then
		forms.na_sg_indef = word
		forms.na_pl_indef = pl
		forms.na_pl_def = pl .. 'le'
		forms.gd_sg_indef = word
		forms.gd_pl_indef = pl
		forms.gd_pl_def = pl .. 'lor'
		forms.v_pl = pl .. 'lor'
		if mw.ustring.find(word, 'u$') then
			forms.na_sg_def = word .. 'l'
			forms.gd_sg_def = word .. 'lui'
			forms.v_sg = word .. 'le'
		elseif mw.ustring.find(word, 'e$') then
			forms.na_sg_def = word .. 'le'
			forms.gd_sg_def = word .. 'lui'
			forms.v_sg = word
		else
			forms.na_sg_def = word .. hyph .. 'ul'
			forms.gd_sg_def = word .. hyph .. 'ului'
			forms.v_sg = word .. hyph .. 'ule'
		end
	end
	return forms
end

function split(word)
	local stem, vow, cons
	if word:match('$') then
		stem, vow, cons = word:match('^(.-)(-)()$')
	else
		stem, vow, cons = word:match('^(.-)(-)(-)$')
	end
	return stem, vow, cons
end

function pl_error(g, no_error, sg_end)
	if no_error then
		if sg_end == "?" then
			return nil, "sg"
		else
			return nil, "pl"
		end
	else
		if sg_end == "?" then
			return error("Unrecognized word ending for \"" .. g .. "\" gender")
		elseif sg_end then
			return error("Unrecognized plural ending for \"" .. sg_end .. "\" singular ending and " .. g .. " gender")
		else
			return error("Unrecognized plural ending for " .. g .. " gender")
		end
	end
end

function find_cons(cons, array, len)
	for i = mw.ustring.len(cons) < len and -mw.ustring.len(cons) or -len, -1 do
		if array then
			cons = mw.ustring.sub(cons, 1, i-1) .. array
			break
		end
	end
	return cons
end

function export.make_plural(word, g, ending, hyphen, no_error)
	local pl = ''
	if ending then
		ending = ending:sub(2)
	end
	local suf1, suf2, pre1, pre2 = mw.ustring.sub(word, -1), mw.ustring.sub(word, -2), mw.ustring.sub(word, 1, -2), mw.ustring.sub(word, 1, -3)
	if g == 'm' then
		if hyphen then
			pl = word .. '-i'
		elseif suf1 == 'i' then
			pl = word
		else
			local stem, vow, cons = split(word:match('^(.-)?$'))
			cons = find_cons(cons, cons_m, 3)
			pl = stem .. vow .. cons .. 'i'
		end
	elseif g == 'f' then
		if suf1 == 'a' then
			if suf2 == 'ea' then
				pl = mw.ustring.sub(word, 1, -2) .. 'le'
			elseif suf2 == 'ia' then
				pl = mw.ustring.sub(word, 1, -2) .. 'ele'
			else
				pl = word .. 'le'
			end
		else
			if ending and ending ~= 'e' and ending ~= 'i' and ending ~= 'uri' then
				return pl_error(g, no_error)
			end
			if suf2 == 'ie' then
				if not ending then
					error('Please provide plural ending or full plural')
				end
				if ending == 'e' then
					pl = word
				else
					local stem, vow, cons = split(pre2)
					if cons ~= '' then
						if ending == 'i' then
							pl = stem .. vow .. cons .. 'ii'
						elseif ending == 'uri' then
							pl = stem .. vow .. cons .. 'iuri'
						else
							return pl_error(g, no_error)
						end
					else
						if ending == 'i' then
							pl = stem .. (vow_f or vow) .. 'i'
						elseif ending == 'uri' then
							pl = stem .. (vow_f or vow) .. 'iuri'
						else
							return pl_error(g, no_error)
						end
					end
				end
			elseif suf1 == 'e' then
				if not ending then
					error('Please provide plural ending or full plural')
				end
				if ending == 'e' then
					pl = word
				else
					local stem, vow, cons = split(pre1)
					if ending == 'i' then
						cons = find_cons(cons, cons_f, 2)
						pl = stem .. (vow_f or vow) .. cons .. 'i'
					elseif ending == 'uri' then
						pl = stem .. (vow_f or vow) .. cons .. 'uri'
					else
						return pl_error(g, no_error)
					end
				end
			elseif suf1 == 'ă' then
				if not ending then
					error('Please provide plural ending or full plural')
				end
				local stem, vow, cons = split(pre1)
				if ending == 'e' then
					cons = find_cons(cons, cons_f_e, 2)
					pl = stem .. (vow_f_e or vow) .. cons .. 'e'
				elseif ending == 'i' then
					cons = find_cons(cons, cons_f, 2)
					pl = stem .. (vow_f or vow) .. cons .. 'i'
				elseif ending == 'uri' then
					cons = find_cons(cons, cons_f, 2)
					pl = stem .. (vow_f or vow) .. cons .. 'uri'
				else
					return pl_error(g, no_error)
				end
			else
				return pl_error(g, no_error, "?")
			end
		end
	elseif g == 'n' then
		if not ending then
			error('Please provide plural ending or full plural')
		end
		if hyphen then
			pl = word .. '-' .. ending
		elseif word:match('h?i$') then
			if ending == 'uri' then
				pl = word .. 'uri'
			elseif ending == "e" then
				local stem, vow, cons = split(pre1)
				pl = stem .. (vow_n or vow) .. cons .. 'e'
			else
				return pl_error(g, no_error, word:match("h?i$"))
			end
		elseif suf2 == 'iu' then
			if ending == 'i' then
				pl = mw.ustring.sub(word, 1, -2) .. 'i'
			elseif ending == 'uri' then
				pl = word .. 'ri'
			elseif ending == "e" then
				pl = pre1 .. "e"
			else
				return pl_error(g, no_error)
			end
		elseif suf1 == 'e' then
			if ending == 'e' then
				pl = word
			elseif ending == 'uri' then
				if word:find('e$') then
					pl = mw.ustring.sub(word, 1, -2) .. 'iuri'
				else
					pl = mw.ustring.sub(word, 1, -2) .. 'uri'
				end
			else
				return pl_error(g, no_error, "-e")
			end
		elseif suf1 == 'u' then
			if ending == 'uri' then
				pl = word .. 'ri'
			elseif ending == 'e' then
				local stem, vow, cons = split(pre1)
				pl = stem .. (vow_n or vow) .. cons .. 'e'
				if pl:find('e') then
					pl = mw.ustring.sub(pl, 1, -2) .. 'ie'
				end
			else
				return pl_error(g, no_error)
			end
		else
			if ending == 'uri' then
				pl = word .. 'uri'
			elseif ending == 'e' then
				local stem, vow, cons = split(word)
				pl = stem .. (vow_n or vow) .. cons .. 'e'
				if pl:find('e$') then
					pl = mw.ustring.sub(pl, 1, -2) .. 'ie'
				end
			else
				return pl_error(g, no_error)
			end
		end
	end
	return pl
end

function export.make_feminine(word)
	word = "tor"
	local iea = false
	if word:find("iea") then
		iea = true
	end
	local f = ""
	if word:find("e$") then
		f = word
	elseif word:find("ui$") then
		f = word .. "e"
	elseif word:find("iu$") then
		f = word:gsub("u$", "e")
	elseif word:find("tor$") then
		f = word:gsub("tor$", "toare")
	elseif word:find("esc$") then
		f = word:gsub("esc$", "ească")
	elseif word:find("os$") then
		f = word:gsub("os$", "oasă")
	elseif word:find("u$") then
		f = word:sub(1, -2) .. "ă"
	else
		f = word .. "ă"
	end
	f:gsub("iea", "ia")
	return f
end

cons_m = {
	str = 'ștr';
	st = 'șt';
	 = 'șt'; -- this prevents the plural of "pește" from being generated as "peșți"
	d = 'z';
	s = 'ș';
	t = 'ț';
	x = 'cș';
}

cons_f_e = {
	sc = 'șt';
	 = 'șt';
}

vow_f_e = {
	ea = 'e'
}

cons_f = {
	sc = 'șt';
	 = 'șt';
	t = 'ț';
	d = 'z';
	x = 'cș'; --probably useless
}

vow_f = {
	ea = 'e';
	oa = 'o';
	a = 'ă';
}

vow_n = {
	o = 'oa'
}

function make_table(data)
	local result = ''
	if data.n == 'sg' then
		result = result .. '<div class="NavFrame" style="width:57.5%">\n'
		result = result .. '<div class="NavHead" style="background:#e2e4c0" align=center>declension of ' .. data.word .. ' (singular only)</div>\n'
		result = result .. '<div class="NavContent">\n'
		result = result .. '{| border="1px solid #000000" style="border-collapse:collapse; width:100%; background:#F0F0F0; text-align:center" class="inflection-table"\n'
		result = result .. '|-\n'
		result = result .. '! style="background:#e2e4c0" |\n'
		result = result .. '! colspan="2" style="background:#e2e4c0" | singular\n'
		result = result .. '|-\n'
		result = result .. '| style="width:26%;background:#e2e4cb" | ' .. m_gen.format_list({data.g}) .. ' gender\n'
		result = result .. '! style="width:37%;background:#e2e4cb" | indefinite articulation\n'
		result = result .. '! style="width:37%;background:#e2e4cb" | definite articulation\n'
		result = result .. '|-\n'
		result = result .. '! style="height:3em;background:#e2e4cb;border" | nominative/accusative\n'
		result = result .. '| (' .. (data.g == 'f' and 'o' or 'un') .. ') ' .. data.forms.na_sg_indef .. '\n'
		result = result .. '| ' .. data.forms.na_sg_def .. '\n'
		result = result .. '|-\n'
		result = result .. '! style="height:3em;background:#e2e4cb" | genitive/dative\n'
		result = result .. '| (' .. (data.g == 'f' and 'unei' or 'unui') .. ') ' .. data.forms.gd_sg_indef .. '\n'
		result = result .. '| ' .. data.forms.gd_sg_def .. '\n'
		result = result .. '|-\n'
		result = result .. '! style="height:3em;background:#e2e4cb" | vocative\n'
		result = result .. '| colspan="2" | ' .. data.forms.v_sg .. '\n'
		result = result .. '|}\n'
		result = result .. '</div></div>'
	elseif data.n == 'pl' then
		result = result .. '<div class="NavFrame" style="width:57.5%">\n'
		result = result .. '<div class="NavHead" style="background:#e2e4c0" align=center>declension of ' .. data.word .. ' (plural only)</div>\n'
		result = result .. '<div class="NavContent">\n'
		result = result .. '{| border="1px solid #000000" style="border-collapse:collapse; width:100%; background:#F0F0F0; text-align:center" class="inflection-table"\n'
		result = result .. '|-\n'
		result = result .. '! style="background:#e2e4c0" |\n'
		result = result .. '! colspan="2" style="background:#e2e4c0" | plural\n'
		result = result .. '|-\n'
		result = result .. '| style="width:26%;background:#e2e4cb" | ' .. m_gen.format_list({data.g}) .. ' gender\n'
		result = result .. '! style="width:37%;background:#e2e4cb" | indefinite articulation\n'
		result = result .. '! style="width:37%;background:#e2e4cb" | definite articulation\n'
		result = result .. '|-\n'
		result = result .. '! style="height:3em;background:#e2e4cb;border" | nominative/accusative\n'
		result = result .. '| (niște) ' .. data.forms.na_pl_indef .. '\n'
		result = result .. '| ' .. data.forms.na_pl_def .. '\n'
		result = result .. '|-\n'
		result = result .. '! style="height:3em;background:#e2e4cb" | genitive/dative\n'
		result = result .. '| (unor) ' .. data.forms.gd_pl_indef .. '\n'
		result = result .. '| ' .. data.forms.gd_pl_def .. '\n'
		result = result .. '|-\n'
		result = result .. '! style="height:3em;background:#e2e4cb" | vocative\n'
		result = result .. '| colspan="2" | ' .. data.forms.v_pl .. '\n'
		result = result .. '|}\n'
		result = result .. '</div></div>'
	else
		result = result .. '<div class="NavFrame">\n'
		result = result .. '<div class="NavHead" style="background:#e2e4c0" align=center>declension of ' .. data.word .. '</div>\n'
		result = result .. '<div class="NavContent">\n'
		result = result .. '{| border="1px solid #000000" style="border-collapse:collapse; width:100%; background:#F0F0F0; text-align:center" class="inflection-table"\n'
		result = result .. '|-\n'
		result = result .. '! style="background:#e2e4c0" |\n'
		result = result .. '! colspan="2" style="background:#e2e4c0" | singular\n'
		result = result .. '! colspan="2" style="background:#e2e4c0" | plural\n'
		result = result .. '|-\n'
		result = result .. '| colspan="1" style="width:15%;background:#e2e4cb" | ' .. m_gen.format_list({data.g}) .. ' gender\n'
		result = result .. '! style="width:21.25%;background:#e2e4cb" | indefinite articulation\n'
		result = result .. '! style="width:21.25%;background:#e2e4cb" | definite articulation\n'
		result = result .. '! style="width:21.25%;background:#e2e4cb" | indefinite articulation\n'
		result = result .. '! style="width:21.25%;background:#e2e4cb" | definite articulation\n'
		result = result .. '|-\n'
		result = result .. '! style="height:3em;background:#e2e4cb;border" | nominative/accusative\n'
		result = result .. '| (' .. (data.g == 'f' and 'o' or 'un') .. ') ' .. data.forms.na_sg_indef .. '\n'
		result = result .. '| ' .. data.forms.na_sg_def .. '\n'
		result = result .. '| (niște) ' .. data.forms.na_pl_indef .. '\n'
		result = result .. '| ' .. data.forms.na_pl_def .. '\n'
		result = result .. '|-\n'
		result = result .. '! style="height:3em;background:#e2e4cb" | genitive/dative\n'
		result = result .. '| (' .. (data.g == 'f' and 'unei' or 'unui') .. ') ' .. data.forms.gd_sg_indef .. '\n'
		result = result .. '| ' .. data.forms.gd_sg_def .. '\n'
		result = result .. '| (unor) ' .. data.forms.gd_pl_indef .. '\n'
		result = result .. '| ' .. data.forms.gd_pl_def .. '\n'
		result = result .. '|-\n'
		result = result .. '! style="height:3em;background:#e2e4cb" | vocative\n'
		result = result .. '| colspan="2" | ' .. data.forms.v_sg .. '\n'
		result = result .. '| colspan="2" | ' .. data.forms.v_pl .. '\n'
		result = result .. '|}\n'
		result = result .. '</div></div>'
	end
	return result
end

return export