Module:sl-nouns

From Wiktionary, the free dictionary
Jump to navigation Jump to search

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

local export = {}

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

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

-- Checks each form for the presence of accent marks.
-- If any form doesn't contain any accent marks, flag the entry for attention.
local function check_accents(args, data)
	-- Do we need to check?
	local noacc = args["noacc"]; if noacc == "" then noacc = nil end
	
	if noacc then
		return
	end
	
	-- Yes, we do need to check.
	for key, subforms in pairs(data.forms) do
		for key2, subform in ipairs(subforms) do
			if not require("Module:sl-common").has_accents(subform) then
				table.insert(data.categories, "Requests for accents in Slovene noun entries")
				return  -- So that we don't add the category more than once
			end
		end
	end
end

-- Make the table
local function make_table(data)
	local function repl(param)
		local accel = false  -- Temporary
		local no_store = false
		
		if param == "info" then
			return mw.getContentLanguage():ucfirst(data.info or "")
		elseif string.sub(param, 1, 1) == "!" then
			no_store = true
			param = string.sub(param, 2)
		elseif string.sub(param, 1, 1) == "#" then
			accel = false
			param = string.sub(param, 2)
		end
		
		local forms = data.forms[param]
		
		if not forms then
			return "—"
		end
		
		local ret = {}
		
		for key, subform in ipairs(forms) do
			table.insert(ret, require("Module:links").full_link({lang = lang, term = subform, accel = accel and {form = param, no_store = no_store} or nil}))
		end
		
		return table.concat(ret, "<br/>")
	end
	
	local wikicode
	
	if data.num then
		wikicode = [=[
{| class="messagebox" style="margin-bottom: 0.5em; background: #d9ebff; border: 1px solid #d9ebff;"
|-
| [[Image:Zobnoustnični m.svg|none|45px]]
| The '''[[Wiktionary:About Slovene|diacritics used in this section of the entry are non-tonal]]'''. If you are a native tonal speaker, please help by adding the tonal marks.
|}
{| class="inflection-table vsSwitcher" data-toggle-category="inflection" style="background: #F9F9F9; border: 1px solid #aaaaaa;"
|- style="background: #d9ebff; text-align: left;"
! class="vsToggleElement" colspan="2" | {{{info}}}
|- class="vsShow"
! style="width: 11em; background: #eff7ff;" | nominative
| style="width: 11em;" colspan="2" | {{{!nom_]=] .. data.num .. [=[}}}
|- class="vsShow"
! style="background: #eff7ff;" | genitive
| colspan="2" | {{{!gen_]=] .. data.num .. [=[}}}
|- class="vsHide"
! style="background: #d9ebff; width: 11em;" | 
! style="background: #d9ebff; width: 11em;" | ]=] .. (data.num == "pl" and "plural" or data.num == "du" and "dual" or "singular") .. [=[

|- class="vsHide"
! style="background:#eff7ff" | nominative<br><small>(imenovȃlnik)</small>
| {{{nom_]=] .. data.num .. [=[}}}
|- class="vsHide"
! style="background:#eff7ff" | genitive<br><small>(rodȋlnik)</small>
| {{{gen_]=] .. data.num .. [=[}}}
|- class="vsHide"
! style="background:#eff7ff" | dative<br><small>(dajȃlnik)</small>
| {{{dat_]=] .. data.num .. [=[}}}
|- class="vsHide"
! style="background:#eff7ff" | accusative<br><small>(tožȋlnik)</small>
| {{{acc_]=] .. data.num .. [=[}}}
|- class="vsHide"
! style="background:#eff7ff" | locative<br><small>(mẹ̑stnik)</small>
| {{{loc_]=] .. data.num .. [=[}}}
|- class="vsHide"
! style="background:#eff7ff" | instrumental<br><small>(orọ̑dnik)</small>
| {{{ins_]=] .. data.num .. [=[}}}
|}]=]
	else
		wikicode = [=[
{| class="messagebox" style="margin-bottom: 0.5em; background: #d9ebff; border: 1px solid #d9ebff;"
|-
| [[Image:Zobnoustnični m.svg|none|45px]]
| The '''[[Wiktionary:About Slovene|diacritics used in this section of the entry are non-tonal]]'''. If you are a native tonal speaker, please help by adding the tonal marks.
|}
{| class="inflection-table vsSwitcher" data-toggle-category="inflection" style="background: #F9F9F9; border: 1px solid #d9ebff;"
|- style="background: #d9ebff; text-align: left;"
! class="vsToggleElement" colspan="4" | {{{info}}}
|- class="vsShow"
! style="width: 11em; background: #eff7ff;" | nom. sing.
| style="width: 11em;" colspan="3" | {{{!nom_sg}}}
|- class="vsShow"
! style="background: #eff7ff;" | gen. sing.
| colspan="3" | {{{!gen_sg}}}
|- class="vsHide"
! style="background: #d9ebff; width: 11em;" | 
! style="background: #d9ebff; width: 11em;" | singular
! style="background: #d9ebff; width: 11em;" | dual
! style="background: #d9ebff; width: 11em;" | plural
|- class="vsHide"
! style="background: #eff7ff;" | nominative<br><small>(imenovȃlnik)</small>
| {{{nom_sg}}}
| {{{nom_du}}}
| {{{nom_pl}}}
|- class="vsHide"
! style="background: #eff7ff;" | genitive<br><small>(rodȋlnik)</small>
| {{{gen_sg}}}
| {{{gen_du}}}
| {{{gen_pl}}}
|- class="vsHide"
! style="background: #eff7ff;" | dative<br><small>(dajȃlnik)</small>
| {{{dat_sg}}}
| {{{dat_du}}}
| {{{dat_pl}}}
|- class="vsHide"
! style="background: #eff7ff;" | accusative<br><small>(tožȋlnik)</small>
| {{{acc_sg}}}
| {{{acc_du}}}
| {{{acc_pl}}}
|- class="vsHide"
! style="background: #eff7ff;" | locative<br><small>(mẹ̑stnik)</small>
| {{{loc_sg}}}
| {{{loc_du}}}
| {{{loc_pl}}}
|- class="vsHide"
! style="background: #eff7ff;" | instrumental<br><small>(orọ̑dnik)</small>
| {{{ins_sg}}}
| {{{ins_du}}}
| {{{ins_pl}}}
|}]=]
	end
	
	return mw.ustring.gsub(wikicode, "{{{([^}]+)}}}", repl) .. require("Module:utilities").format_categories(data.categories, lang)
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.")
	local args = frame:getParent().args
	local num = args["n"]; if num == "" then num = nil end
	
	local data = {forms = {}, info = nil, categories = {}, num = num}
	
	if inflections[infl_type] then
		inflections[infl_type](args, data)
	else
		error("Unknown inflection type '" .. infl_type .. "'")
	end
	
	check_accents(args, data)
	
	return make_table(data)
end

local function make_endingless_stem(stem)
	local stem_noaccents = mw.ustring.lower(require("Module:sl-common").remove_accents(stem))
	
	if mw.ustring.find(stem_noaccents, "[^aeioujlrv][ln]j$") then
		return mw.ustring.gsub(stem, "([ln]j)$", "e%1")
	elseif mw.ustring.find(stem_noaccents, "[^aeiouln]j$") then
		return mw.ustring.gsub(stem, "j$", "ij")
	elseif mw.ustring.find(stem_noaccents, "[^aeiou]r$") or mw.ustring.find(stem_noaccents, "[^aeioujlrv][lmnv]$") then
		return mw.ustring.gsub(stem, "(.)$", "e%1")
	else
		return stem
	end
end

-- Masculine o-stem
inflections["m"] = function(args, data)
	local stem_noending = args[1]; if stem_noending == "" then stem_noending = nil end
	local stem = args[2]; if stem == "" then stem = nil end
	local anim = args["a"]; if not anim or anim == "" then anim = false else anim = true end
	
	local nom_pl = args["nom_pl"]; if nom_pl == "" then nom_pl = nil end
	local nom_pl2 = args["nom_pl2"]; if nom_pl2 == "" then nom_pl2 = nil end
	
	if not stem_noending then
		if mw.title.getCurrentTitle().nsText == "Template" then
			stem_noending = "-"
		else
			error("1st parameter (stem) has not been specified.")
		end
	end
	
	if not stem then
		stem = stem_noending
		stem_noending = make_endingless_stem(stem)
	end
	
	-- Is this a hard stem or a soft stem?
	local oe = "o"
	local hs = "hard"
	data.info = "masculine " .. (anim and "anim." or "inan.")
	
	if require("Module:sl-common").is_soft(stem) then
		oe = "e"
		hs = "soft"
	end
	
	data.info = data.info .. ", " .. hs .. " o-stem"
	table.insert(data.categories, "Slovene masculine " .. hs .. " o-stem nouns")
	
	-- Categorize further
	local stem_noaccents = require("Module:sl-common").remove_accents(stem)
	local stem_noending_noaccents = require("Module:sl-common").remove_accents(stem_noending)
	local corrected_stem = nil
	
	if stem_noaccents == stem_noending_noaccents then
		corrected_stem = stem_noending
	elseif stem_noaccents == mw.ustring.gsub(stem_noending_noaccents, "e([ln]j)$", "%1") then
		corrected_stem = mw.ustring.gsub(stem_noending, "e([ln]j)$", "%1")
	elseif stem_noaccents == mw.ustring.gsub(stem_noending_noaccents, "e(.)$", "%1") then
		corrected_stem = mw.ustring.gsub(stem_noending, "e(.)$", "%1")
	elseif stem_noaccents == mw.ustring.gsub(stem_noending_noaccents, "[aeiou]$", "") then
		table.insert(data.categories, "Slovene masculine o-stem nouns with final vowel")
		corrected_stem = mw.ustring.gsub(stem_noending, "[aeiou]$", "")
	elseif stem_noaccents == stem_noending_noaccents .. "j" then
		table.insert(data.categories, "Slovene masculine soft o-stem nouns with j-infix")
		corrected_stem = stem_noending .. "j"
	elseif stem_noaccents == stem_noending_noaccents .. "-j" then
		table.insert(data.categories, "Slovene masculine soft o-stem nouns with j-infix")
		corrected_stem = stem_noending .. "-j"
	elseif stem_noaccents == stem_noending_noaccents .. "n" then
		table.insert(data.categories, "Slovene masculine hard o-stem nouns with n-infix")
		corrected_stem = stem_noending .. "n"
	elseif stem_noaccents == stem_noending_noaccents .. "t" then
		table.insert(data.categories, "Slovene masculine hard o-stem nouns with t-infix")
		corrected_stem = stem_noending .. "t"
	else
		table.insert(data.categories, "Slovene irregular nouns")
	end
	
	if corrected_stem and stem ~= corrected_stem then
		table.insert(data.categories, "Slovene nouns with accent alternations")
	end
	
	-- Singular
	data.forms["nom_sg"] = {stem_noending}
	data.forms["acc_sg"] = {anim and stem .. "a" or stem_noending}
	data.forms["gen_sg"] = {stem .. "a"}
	data.forms["dat_sg"] = {stem .. "u"}
	data.forms["loc_sg"] = {stem .. "u"}
	data.forms["ins_sg"] = {stem .. oe .. "m"}
	
	-- Dual
	data.forms["nom_du"] = {stem .. "a"}
	data.forms["acc_du"] = {stem .. "a"}
	data.forms["gen_du"] = {stem .. oe .. "v"}
	data.forms["dat_du"] = {stem .. oe .. "ma"}
	data.forms["loc_du"] = {stem .. "ih"}
	data.forms["ins_du"] = {stem .. oe .. "ma"}
	
	-- Plural
	data.forms["nom_pl"] = {nom_pl or stem .. "i", nom_pl2}
	data.forms["acc_pl"] = {stem .. "e"}
	data.forms["gen_pl"] = {stem .. oe .. "v"}
	data.forms["dat_pl"] = {stem .. oe .. "m"}
	data.forms["loc_pl"] = {stem .. "ih"}
	data.forms["ins_pl"] = {stem .. "i"}
end

-- Masculine o-stem, plural in -ôv-
inflections["m-ov"] = function(args, data)
	local stem_noending = args[1]; if stem_noending == "" then stem_noending = nil end
	local stem = args[2]; if stem == "" then stem = nil end
	local gen_sg_ending = args[3]; if gen_sg_ending == "" then gen_sg_ending = nil end
	local anim = args["a"]; if not anim or anim == "" then anim = false else anim = true end
	
	if not stem_noending then
		if mw.title.getCurrentTitle().nsText == "Template" then
			stem_noending = "-"
		else
			error("1st parameter (stem) has not been specified.")
		end
	end
	
	if not stem then
		stem = stem_noending
		stem_noending = make_endingless_stem(stem)
	end
	
	local stem_noaccents = require("Module:sl-common").remove_accents(stem)
	
	local gen_sg = stem .. "a"
	
	if gen_sg_ending == "á" or gen_sg_ending == "ú" then
		gen_sg = stem_noaccents .. gen_sg_ending
	elseif gen_sg_ending then
		error("3rd parameter (genitive singular ending) must be \"á\" or \"ú\".")
	end
	
	-- Is this a hard stem or a soft stem?
	local oe = "o"
	local hs = "hard"
	data.info = "masculine " .. (anim and "anim." or "inan.")
	
	if require("Module:sl-common").is_soft(stem) then
		oe = "e"
		hs = "soft"
	end
	
	data.info = data.info .. ", " .. hs .. " o-stem"
	table.insert(data.categories, "Slovene masculine " .. hs .. " o-stem nouns")
	
	if gen_sg_ending then
		data.info = data.info .. ", long mixed accent"
		table.insert(data.categories, "Slovene masculine o-stem nouns with long mixed accent")
	end
	
	if data.num ~= "sg" then
		data.info = data.info .. ", plural in " .. require("Module:links").full_link({lang = lang, alt = "-ôv-"}, "term")
		table.insert(data.categories, "Slovene masculine o-stem nouns with plural in -ov-")
	end
	
	-- Categorize further
	local stem_noending_noaccents = require("Module:sl-common").remove_accents(stem_noending)
	local corrected_stem = nil
	
	if stem_noaccents == stem_noending_noaccents then
		corrected_stem = stem_noending
	elseif stem_noaccents == mw.ustring.gsub(stem_noending_noaccents, "e([ln]j)$", "%1") then
		corrected_stem = mw.ustring.gsub(stem_noending, "e([ln]j)$", "%1")
	elseif stem_noaccents == mw.ustring.gsub(stem_noending_noaccents, "e(.)$", "%1") then
		corrected_stem = mw.ustring.gsub(stem_noending, "e(.)$", "%1")
	elseif stem_noaccents == mw.ustring.gsub(stem_noending_noaccents, "[aeiou]$", "") then
		table.insert(data.categories, "Slovene masculine o-stem nouns with final vowel")
		corrected_stem = mw.ustring.gsub(stem_noending, "[aeiou]$", "")
	elseif stem_noaccents == stem_noending_noaccents .. "j" then
		table.insert(data.categories, "Slovene masculine soft o-stem nouns with j-infix")
		corrected_stem = stem_noending .. "j"
	elseif stem_noaccents == stem_noending_noaccents .. "-j" then
		table.insert(data.categories, "Slovene masculine soft o-stem nouns with j-infix")
		corrected_stem = stem_noending .. "-j"
	elseif stem_noaccents == stem_noending_noaccents .. "n" then
		table.insert(data.categories, "Slovene masculine hard o-stem nouns with n-infix")
		corrected_stem = stem_noending .. "n"
	elseif stem_noaccents == stem_noending_noaccents .. "t" then
		table.insert(data.categories, "Slovene masculine hard o-stem nouns with t-infix")
		corrected_stem = stem_noending .. "t"
	else
		table.insert(data.categories, "Slovene irregular nouns")
	end
	
	if corrected_stem and stem ~= corrected_stem then
		table.insert(data.categories, "Slovene nouns with accent alternations")
	end
	
	-- Singular
	data.forms["nom_sg"] = {stem_noending}
	data.forms["acc_sg"] = {anim and gen_sg or stem_noending}
	data.forms["gen_sg"] = {gen_sg}
	data.forms["dat_sg"] = {stem .. "u"}
	data.forms["loc_sg"] = {stem .. "u"}
	data.forms["ins_sg"] = {stem .. oe .. "m"}
	
	-- Dual
	data.forms["nom_du"] = {stem_noaccents .. "ôva"}
	data.forms["acc_du"] = {stem_noaccents .. "ôva"}
	data.forms["gen_du"] = {stem_noaccents .. "ôv"}
	data.forms["dat_du"] = {stem_noaccents .. "ôvoma"}
	data.forms["loc_du"] = {stem_noaccents .. "ôvih"}
	data.forms["ins_du"] = {stem_noaccents .. "ôvoma"}
	
	-- Plural
	data.forms["nom_pl"] = {stem_noaccents .. "ôvi"}
	data.forms["acc_pl"] = {stem_noaccents .. "ôve"}
	data.forms["gen_pl"] = {stem_noaccents .. "ôv"}
	data.forms["dat_pl"] = {stem_noaccents .. "ôvom"}
	data.forms["loc_pl"] = {stem_noaccents .. "ôvih"}
	data.forms["ins_pl"] = {stem_noaccents .. "ôvi"}
end

-- Masculine a-stem
inflections["m-a"] = function(args, data)
	local stem = args[1]; if stem == "" then stem = nil end
	local anim = args["a"]; if not anim or anim == "" then anim = false else anim = true end
	
	if not stem then
		if mw.title.getCurrentTitle().nsText == "Template" then
			stem = "-"
		else
			error("1st parameter (stem) has not been specified.")
		end
	end
	
	local stem_noending = make_endingless_stem(stem)
	
	data.info = "masculine " .. (anim and "anim." or "inan.") .. ", a-stem"
	table.insert(data.categories, "Slovene masculine a-stem nouns")
	
	-- Singular
	data.forms["nom_sg"] = {stem .. "a"}
	data.forms["acc_sg"] = {stem .. "o"}
	data.forms["gen_sg"] = {stem .. "e"}
	data.forms["dat_sg"] = {stem .. "i"}
	data.forms["loc_sg"] = {stem .. "i"}
	data.forms["ins_sg"] = {stem .. "o"}
	
	-- Dual
	data.forms["nom_du"] = {stem .. "i"}
	data.forms["acc_du"] = {stem .. "i"}
	data.forms["gen_du"] = {stem_noending}
	data.forms["dat_du"] = {stem .. "ama"}
	data.forms["loc_du"] = {stem .. "ah"}
	data.forms["ins_du"] = {stem .. "ama"}
	
	-- Plural
	data.forms["nom_pl"] = {stem .. "e"}
	data.forms["acc_pl"] = {stem .. "e"}
	data.forms["gen_pl"] = {stem_noending}
	data.forms["dat_pl"] = {stem .. "am"}
	data.forms["loc_pl"] = {stem .. "ah"}
	data.forms["ins_pl"] = {stem .. "ami"}
end

-- Feminine a-stem
inflections["f"] = function(args, data)
	local stem = args[1]; if stem == "" then stem = nil end
	
	if not stem then
		if mw.title.getCurrentTitle().nsText == "Template" then
			stem = "-"
		else
			error("1st parameter (stem) has not been specified.")
		end
	end
	
	local stem_noending = make_endingless_stem(stem)
	
	data.info = "feminine, a-stem"
	table.insert(data.categories, "Slovene feminine a-stem nouns")
	
	-- Singular
	data.forms["nom_sg"] = {stem .. "a"}
	data.forms["acc_sg"] = {stem .. "o"}
	data.forms["gen_sg"] = {stem .. "e"}
	data.forms["dat_sg"] = {stem .. "i"}
	data.forms["loc_sg"] = {stem .. "i"}
	data.forms["ins_sg"] = {stem .. "o"}
	
	-- Dual
	data.forms["nom_du"] = {stem .. "i"}
	data.forms["acc_du"] = {stem .. "i"}
	data.forms["gen_du"] = {stem_noending}
	data.forms["dat_du"] = {stem .. "ama"}
	data.forms["loc_du"] = {stem .. "ah"}
	data.forms["ins_du"] = {stem .. "ama"}
	
	-- Plural
	data.forms["nom_pl"] = {stem .. "e"}
	data.forms["acc_pl"] = {stem .. "e"}
	data.forms["gen_pl"] = {stem_noending}
	data.forms["dat_pl"] = {stem .. "am"}
	data.forms["loc_pl"] = {stem .. "ah"}
	data.forms["ins_pl"] = {stem .. "ami"}
end

-- Feminine a-stem, mixed accent paradigm
inflections["f-mobile"] = function(args, data)
	local stem = args[1]; if stem == "" then stem = nil end
	local gen_pl = args["gen_pl"]; if gen_pl == "" then gen_pl = nil end
	
	if not stem then
		if mw.title.getCurrentTitle().nsText == "Template" then
			stem = "-"
		else
			error("1st parameter (stem) has not been specified.")
		end
	end
	
	local stem_noaccents = require("Module:sl-common").remove_accents(stem)
	gen_pl = gen_pl or stem_noaccents .. "á"
	
	data.info = "feminine, a-stem, long mixed accent"
	table.insert(data.categories, "Slovene feminine a-stem nouns")
	table.insert(data.categories, "Slovene feminine a-stem nouns with long mixed accent")
	
	-- Singular
	data.forms["nom_sg"] = {stem .. "a"}
	data.forms["acc_sg"] = {stem_noaccents .. "ó"}
	data.forms["gen_sg"] = {stem_noaccents .. "é"}
	data.forms["dat_sg"] = {stem .. "i"}
	data.forms["loc_sg"] = {stem .. "i"}
	data.forms["ins_sg"] = {stem_noaccents .. "ó"}
	
	-- Dual
	data.forms["nom_du"] = {stem_noaccents .. "é"}
	data.forms["acc_du"] = {stem_noaccents .. "é"}
	data.forms["gen_du"] = {gen_pl}
	data.forms["dat_du"] = {stem_noaccents .. "áma"}
	data.forms["loc_du"] = {stem_noaccents .. "àh"}
	data.forms["ins_du"] = {stem_noaccents .. "áma"}
	
	-- Plural
	data.forms["nom_pl"] = {stem_noaccents .. "é"}
	data.forms["acc_pl"] = {stem_noaccents .. "é"}
	data.forms["gen_pl"] = {gen_pl}
	data.forms["dat_pl"] = {stem_noaccents .. "àm"}
	data.forms["loc_pl"] = {stem_noaccents .. "àh"}
	data.forms["ins_pl"] = {stem_noaccents .. "ámi"}
end

-- Feminine v-stem
inflections["f-v"] = function(args, data)
	local stem = args[1]; if stem == "" then stem = nil end
	
	if not stem then
		if mw.title.getCurrentTitle().nsText == "Template" then
			stem = "-"
		else
			error("1st parameter (stem) has not been specified.")
		end
	end
	
	local stem_noending = stem .. "ev"
	stem = stem .. "v"
	
	data.info = "feminine, v-stem"
	table.insert(data.categories, "Slovene feminine v-stem nouns")
	
	-- Singular
	data.forms["nom_sg"] = {stem_noending}
	data.forms["acc_sg"] = {stem_noending}
	data.forms["gen_sg"] = {stem .. "e"}
	data.forms["dat_sg"] = {stem .. "i"}
	data.forms["loc_sg"] = {stem .. "i"}
	data.forms["ins_sg"] = {stem .. "ijo"}
	
	-- Dual
	data.forms["nom_du"] = {stem .. "i"}
	data.forms["acc_du"] = {stem .. "i"}
	data.forms["gen_du"] = {stem_noending}
	data.forms["dat_du"] = {stem .. "ama"}
	data.forms["loc_du"] = {stem .. "ah"}
	data.forms["ins_du"] = {stem .. "ama"}
	
	-- Plural
	data.forms["nom_pl"] = {stem .. "e"}
	data.forms["acc_pl"] = {stem .. "e"}
	data.forms["gen_pl"] = {stem_noending}
	data.forms["dat_pl"] = {stem .. "am"}
	data.forms["loc_pl"] = {stem .. "ah"}
	data.forms["ins_pl"] = {stem .. "ami"}
end

-- Feminine i-stem
inflections["f-i"] = function(args, data)
	local stem = args[1]; if stem == "" then stem = nil end
	
	if not stem then
		if mw.title.getCurrentTitle().nsText == "Template" then
			stem = "-"
		else
			error("1st parameter (stem) has not been specified.")
		end
	end
	
	local stem_noending = make_endingless_stem(stem)
	
	data.info = "feminine, i-stem"
	table.insert(data.categories, "Slovene feminine i-stem nouns")
	
	-- Singular
	data.forms["nom_sg"] = {stem_noending}
	data.forms["acc_sg"] = {stem_noending}
	data.forms["gen_sg"] = {stem .. "i"}
	data.forms["dat_sg"] = {stem .. "i"}
	data.forms["loc_sg"] = {stem .. "i"}
	data.forms["ins_sg"] = {stem .. (stem ~= stem_noending and "i" or "") .. "jo"}
	
	-- Dual
	data.forms["nom_du"] = {stem .. "i"}
	data.forms["acc_du"] = {stem .. "i"}
	data.forms["gen_du"] = {stem .. "i"}
	data.forms["dat_du"] = {stem .. (stem ~= stem_noending and "i" or "") .. "ma"}
	data.forms["loc_du"] = {stem .. "ih"}
	data.forms["ins_du"] = {stem .. (stem ~= stem_noending and "i" or "") .. "ma"}
	
	-- Plural
	data.forms["nom_pl"] = {stem .. "i"}
	data.forms["acc_pl"] = {stem .. "i"}
	data.forms["gen_pl"] = {stem .. "i"}
	data.forms["dat_pl"] = {stem .. "im"}
	data.forms["loc_pl"] = {stem .. "ih"}
	data.forms["ins_pl"] = {stem .. (stem ~= stem_noending and "i" or "") .. "mi"}
end

-- Feminine i-stem, mixed accent paradigm
inflections["f-i-mobile"] = function(args, data)
	local stem = args[1]; if stem == "" then stem = nil end
	local stem_dat_loc_sg = args[2]; if stem_dat_loc_sg == "" then stem_dat_loc_sg = nil end
	
	if not stem then
		if mw.title.getCurrentTitle().nsText == "Template" then
			stem = "-"
		else
			error("1st parameter (stem) has not been specified.")
		end
	end
	
	local stem_noending = make_endingless_stem(stem)
	local stem_noaccents = require("Module:sl-common").remove_accents(stem)
	stem_dat_loc_sg = stem_dat_loc_sg or stem
	
	data.info = "feminine, i-stem, long mixed accent"
	table.insert(data.categories, "Slovene feminine i-stem nouns")
	table.insert(data.categories, "Slovene feminine i-stem nouns with long mixed accent")
	
	-- Singular
	data.forms["nom_sg"] = {stem_noending}
	data.forms["acc_sg"] = {stem_noending}
	data.forms["gen_sg"] = {stem_noaccents .. "í"}
	data.forms["dat_sg"] = {stem_dat_loc_sg .. "i"}
	data.forms["loc_sg"] = {stem_dat_loc_sg .. "i"}
	data.forms["ins_sg"] = {stem_noaccents .. (stem ~= stem_noending and "i" or "") .. "jó"}
	
	-- Dual
	data.forms["nom_du"] = {stem_noaccents .. "í"}
	data.forms["acc_du"] = {stem_noaccents .. "í"}
	data.forms["gen_du"] = {stem_noaccents .. "í"}
	data.forms["dat_du"] = {stem_noaccents .. "éma"}
	data.forms["loc_du"] = {stem_noaccents .. "éh"}
	data.forms["ins_du"] = {stem_noaccents .. "éma"}
	
	-- Plural
	data.forms["nom_pl"] = {stem_noaccents .. "í"}
	data.forms["acc_pl"] = {stem_noaccents .. "í"}
	data.forms["gen_pl"] = {stem_noaccents .. "í"}
	data.forms["dat_pl"] = {stem_noaccents .. "ém"}
	data.forms["loc_pl"] = {stem_noaccents .. "éh"}
	data.forms["ins_pl"] = {stem_noaccents .. (stem ~= stem_noending and "i" or "") .. "mí"}
end

-- Neuter o-stem
inflections["n"] = function(args, data)
	local stem = args[1]; if stem == "" then stem = nil end
	
	if not stem then
		if mw.title.getCurrentTitle().nsText == "Template" then
			stem = "-"
		else
			error("1st parameter (stem) has not been specified.")
		end
	end
	
	local stem_noending = make_endingless_stem(stem)
	
	-- Is this a hard stem or a soft stem?
	local oe = "o"
	data.info = "neuter"
	
	if require("Module:sl-common").is_soft(stem) then
		oe = "e"
		data.info = data.info .. ", soft"
		table.insert(data.categories, "Slovene neuter soft o-stem nouns")
	else
		data.info = data.info .. ", hard"
		table.insert(data.categories, "Slovene neuter hard o-stem nouns")
	end
	
	-- Singular
	data.forms["nom_sg"] = {stem .. oe}
	data.forms["acc_sg"] = {stem .. oe}
	data.forms["gen_sg"] = {stem .. "a"}
	data.forms["dat_sg"] = {stem .. "u"}
	data.forms["loc_sg"] = {stem .. "u"}
	data.forms["ins_sg"] = {stem .. oe .. "m"}
	
	-- Dual
	data.forms["nom_du"] = {stem .. "i"}
	data.forms["acc_du"] = {stem .. "i"}
	data.forms["gen_du"] = {stem_noending}
	data.forms["dat_du"] = {stem .. oe .. "ma"}
	data.forms["loc_du"] = {stem .. "ih"}
	data.forms["ins_du"] = {stem .. oe .. "ma"}
	
	-- Plural
	data.forms["nom_pl"] = {stem .. "a"}
	data.forms["acc_pl"] = {stem .. "a"}
	data.forms["gen_pl"] = {stem_noending}
	data.forms["dat_pl"] = {stem .. oe .. "m"}
	data.forms["loc_pl"] = {stem .. "ih"}
	data.forms["ins_pl"] = {stem .. "i"}
end

return export