local export = {}
local m_vot = require("Module:vot")
local function get_stem(word, ending)
local fragment = mw.ustring.match(word, ending .. "$")
if fragment then
return mw.ustring.sub(word, 1, -mw.ustring.len(fragment) - 1), fragment
end
error("Unexpected ending (<" .. ending .. "> for <" .. word .. ">) for this inflection type! Wrong type?")
end
local function frontalize(w, vh)
if vh == "ä" then
w = mw.ustring.gsub(w, "", { a = "ä", = "e", o = "ö", u = "y" })
end
return w
end
local function get_e(vh)
return (vh == "ä") and "e" or "õ"
end
local function get_or(value, fallback)
return (value and #value > 0) and value or fallback
end
local function join(...)
local t = {}
for _, s in ipairs({...}) do
if type(s) == "table" then
for _, v in ipairs(s) do
table.insert(t, v)
end
else
table.insert(t, s)
end
end
return t
end
local function gsub_all(t, s, d)
if type(t) == "string" then
return mw.ustring.gsub(t, s, d)
end
local r = {}
for _, v in ipairs(t) do
table.insert(r, mw.ustring.gsub(v, s, d))
end
return r
end
local function append(t, x)
if not x then return t end
if type(t) == "string" then
return t .. x
end
local r = {}
for _, v in ipairs(t) do
table.insert(r, v .. x)
end
return r
end
local function unreduce_full(t)
local final = mw.ustring.sub(t, -1, -1)
if final == "a" then
return t .. "a"
elseif final == "ä" then
return t .. "ä"
elseif final == "õ" then
return mw.ustring.sub(t, 1, -2) .. "a"
elseif final == "e" then
return mw.ustring.sub(t, 1, -2) .. "ä"
else
return t
end
end
local function unreduce(t)
local final = mw.ustring.sub(t, -1, -1)
if final == "õ" then
return mw.ustring.sub(t, 1, -2) .. "a"
elseif final == "e" then
return mw.ustring.sub(t, 1, -2) .. "ä"
else
return t
end
end
local function lengthen(t)
if mw.ustring.find(t, m_vot.vowel .. "$") and not mw.ustring.find(t, m_vot.vowel .. m_vot.vowel .. "$") then
return t .. mw.ustring.sub(t, -1)
else
return t
end
end
local function make_gen_sg(data, t)
if type(t) == "string" then
--return lengthen(t)
return (m_vot.guess_reduction(t, data.first_stressed) and lengthen(t) or t)
end
local r = {}
for _, v in ipairs(t) do
table.insert(r, make_gen_sg(data, v))
end
return r
end
local function make_gradation(s, w)
if s == w then
return "no gradation"
else
return s .. "-" .. w .. " gradation"
end
end
local function unwind(data, word, grade, final, ending, may_have_gemination)
local stem = (ending and #ending > 0) and get_stem(word, ending) or word
local ci, stem = m_vot.extract_ci(stem)
data.ci = ci
final = select(3, mw.ustring.find(stem, "(" .. final .. ")$"))
if not final then final = "õ" end
stem = get_stem(stem, grade .. final)
if data.geminate ~= false and may_have_gemination then
local repl
stem, repl = mw.ustring.gsub(stem, grade .. "$", "")
data.geminate = repl > 0
end
return stem, final
end
local function geminate(stem)
local gem = m_vot.guess_gemination(stem)
return gem and (gem .. mw.ustring.sub(stem, -1)) or stem
end
local function geminate_surface(stem, final)
local gem = m_vot.guess_gemination(stem)
return gem and (gem .. final) or stem
end
local function rewind(data, stem, grade, final, ending)
local result
if mw.ustring.find(grade, "k+$") then
result = m_vot.apply_ci(data.ci, stem, grade, final)
elseif grade == "vv" and mw.ustring.find(stem, "$") then
result = mw.ustring.sub(stem, 1, -2) .. grade .. (type(final) == "string" and final or "")
else
result = stem .. grade .. (type(final) == "string" and final or "")
end
return result .. (ending or "")
end
local function rewind_long(data, stem, grade, final, ending)
return geminate_surface(m_vot.apply_ci(data.ci, stem, grade, final), final) .. (ending or "")
end
local function rewind_oovv_uuvv(data, stem, grade, final, ending)
if mw.ustring.match(stem, "$") and mw.ustring.match(grade, "^vv") then
return rewind(data, mw.ustring.sub(stem, 1, -3) .. ({ = "uu", = "üü" }), grade, final, ending)
end
end
local function get_tuli_short_nom_sg(x)
if not mw.ustring.find(x, "i$") then
return nil
end
local syl = m_vot.split_syllables(x)
if #syl % 2 == 0 and not mw.ustring.find(syl, m_vot.vowel .. ".") then
return nil
end
local form = mw.ustring.sub(x, 1, -2)
if not mw.ustring.find(form, "$") then
return nil
end
return form
end
local function do_geminate(data, t)
if type(t) == "table" then
local r = {}
for _, v in ipairs(t) do
table.insert(r, do_geminate(data, t))
end
return r
end
if data.geminate == false then return t end
if not mw.ustring.find(t, "(" .. m_vot.vowel .. ")%1$") then
return t
end
local g = m_vot.guess_gemination(mw.ustring.sub(t, 1, -2))
if not g then return t end
return g .. mw.ustring.sub(t, -2)
end
local function cleanup_form(data, form)
local form = mw.ustring.gsub(form, m_vot.virtual_syllable_break, "")
form = m_vot.apply_reduction(form, data.infl_root_split, nil, data.first_stressed)
return mw.ustring.gsub(form, m_vot.ungeminate, "")
end
local function process(data)
local vh = data.vh
-- nominative singular stem
local ns = data.stem_ns
-- genitive singular stem
local gs = data.stem_gs
-- partitive singular stem
local ps = data.stem_ps
-- illative singular stem
local is = data.stem_is or ps
-- oblique singular stem
local os = data.stem_os or gs
-- oblique plural stem
local op = data.stem_op
-- genitive plural stem
local gp = data.stem_gp or op
-- partitive plural stem
local pp = data.stem_pp or gp
local is_short = data.stem_is_short or is
local ill_sg = data.illative_sg or "long_short"
local result = { }
data.infl_root_split = m_vot.split_syllables(data.infl_root)
if not data.no_singular then
result = ns
result = gs
result = append(ps, vh)
local short_ill = lengthen(do_geminate(data, is_short))
local long_ill = append(data.no_illative_sg_lengthen and is or lengthen(do_geminate(data, is)), frontalize("sõ", vh))
if ill_sg == "short" then
result = short_ill
elseif ill_sg == "long" then
result = long_ill
elseif ill_sg == "short_long" then
result = join(short_ill, long_ill)
elseif ill_sg == "long_short" then
result = join(long_ill, short_ill)
else
error("unsupported ill_sg")
end
result = append(os, "z")
result = append(os, frontalize("ssa", vh))
result = append(os, frontalize("lõõ", vh))
result = append(os, frontalize("lla", vh))
result = append(os, frontalize("lta", vh))
result = append(os, "ssi")
end
if not data.no_plural then
result = append(os, "d")
result = join(append(gp, frontalize("õ", vh)), not data.no_short_pl and op or nil)
result = join(append(pp, vh), not data.no_short_pl and op or nil)
result = append(op, frontalize("sõ", vh))
result = append(op, "z")
result = append(op, frontalize("ssa", vh))
result = append(op, frontalize("lõõ", vh))
result = append(op, frontalize("lla", vh))
result = append(op, frontalize("lta", vh))
result = append(op, "ssi")
end
-- cleanup virtual syllable breaks and do reductions
for k, v in pairs(result) do
if type(v) == "string" then
result = cleanup_form(data, v)
elseif type(v) == "table" then
for i, f in ipairs(v) do
if type(f) == "table" and f.form then
f.form = cleanup_form(data, f.form)
elseif type(f) == "string" then
v = cleanup_form(data, f)
end
end
end
end
return result
end
-- inflection classes begin
local inflections = {}
inflections = function (data)
data.typeno = "I"
local word = data.title
if data.no_singular then -- plural title -> singular
word = get_stem(word, "d")
end
local stem = word
local final = mw.ustring.sub(word, -1, -1)
local stem_pl = (mw.ustring.find(word, m_vot.vowel .. m_vot.vowel .. "$") and mw.ustring.gsub(word, m_vot.vowel .. "$", "") or word) .. "i"
data.stem_ns = stem
data.stem_gs = stem
data.stem_ps = stem .. "t"
if mw.ustring.find(stem, final .. final .. "$") then
local stem_ill = mw.ustring.sub(stem, 1, -2)
data.stem_is = stem_ill .. "h" .. final
data.stem_is_short = stem_ill .. "hh" .. final
data.no_illative_sg_lengthen = true
else
data.stem_is = stem .. "h" .. final
end
data.stem_op = stem_pl
data.stem_gp = stem_pl .. "j"
data.stem_pp = stem_pl .. "t"
data.illative_sg = "short_long"
data.infl_root = stem
data.no_short_pl = true
return process(data)
end
inflections = function (data)
data.typeno = "II"
local word = data.title
local strong = data.args or error("must specify strong grade")
local weak = data.args or error("must specify weak grade")
local vh = data.vh
local stem, final
if data.no_singular then -- plural title -> singular
stem, final = unwind(data, word, weak, m_vot.vowel, "d")
else
stem, final = unwind(data, word, strong, m_vot.vowel)
end
data.stem_ns = rewind(data, stem, strong, final)
if mw.ustring.find(stem, final .. final .. "$") and weak == "" and strong ~= "" then
data.stem_gs = stem
else
data.stem_gs = rewind(data, stem, weak, final)
end
data.stem_ps = rewind_long(data, stem, strong, final)
data.stem_is = rewind_long(data, stem, strong, final)
data.stem_os = data.stem_gs
local pl = m_vot.apply_ci(data.ci, stem, strong, final)
data.stem_op = pl .. m_vot.ungeminate .. "i"
data.stem_gp = pl .. "j"
data.stem_pp = data.stem_op .. "t"
data.illative_sg = "long_short"
data.grade = make_gradation(strong, weak)
data.infl_root = stem
return process(data)
end
inflections = function (data)
data.typeno = "III"
local word = data.title
local strong = data.args or error("must specify strong grade")
local weak = data.args or error("must specify weak grade")
local vh = data.vh
local stem, final
if data.no_singular then -- plural title -> singular
stem, final = unwind(data, word, weak, m_vot.vowel, "d")
else
stem, final = unwind(data, word, strong, m_vot.vowel)
end
final = unreduce(final)
data.stem_ns = word
data.stem_gs = make_gen_sg(data, rewind(data, stem, weak, final))
data.stem_ps = rewind_long(data, stem, strong, final)
data.stem_is = rewind_long(data, stem, strong, final)
data.stem_os = rewind(data, stem, weak, final)
local pl = rewind(data, stem, strong, frontalize("o", vh_plural))
data.stem_op = pl .. "i"
data.stem_gp = pl .. "j"
data.stem_pp = pl .. "it"
data.illative_sg = "long_short"
data.grade = make_gradation(strong, weak)
data.infl_root = stem
return process(data)
end
inflections = function (data)
data.typeno = "V"
local word = data.title
local strong = data.args or error("must specify strong grade")
local weak = data.args or error("must specify weak grade")
local vh = data.vh
local stem, final
if data.no_singular then -- plural title -> singular
stem, final = unwind(data, word, weak, m_vot.vowel, "d")
else
stem, final = unwind(data, word, strong, m_vot.vowel)
end
final = unreduce(final)
local pl = rewind(data, stem, strong, vh == "ä") .. "i"
local gs = rewind(data, stem, weak, final)
if data.args and mw.ustring.match(stem, "$") and mw.ustring.match(weak, "^vv") then
gs = join(rewind_oovv_uuvv(data, stem, weak, final), gs)
end
data.stem_ns = word
data.stem_gs = make_gen_sg(data, gs)
data.stem_ps = rewind_long(data, stem, strong, final)
data.stem_is = rewind_long(data, stem, strong, final)
data.stem_os = rewind(data, stem, weak, final)
data.stem_op = pl .. m_vot.ungeminate .. "i"
data.stem_gp = pl .. "j"
data.stem_pp = data.stem_op .. "t"
data.illative_sg = "long_short"
data.grade = make_gradation(strong, weak)
data.infl_root = stem
return process(data)
end
inflections = function (data)
data.typeno = "VI"
local word = data.title
local vh = data.vh
if data.no_singular then -- plural title -> singular
stem = get_stem(word, "d")
end
local stem = lengthen(word)
local pl_stem = word
local pl_stem_g = pl_stem
if mw.ustring.find(word, "i$") then
pl_stem = mw.ustring.gsub(word, "iä$", get_e(vh))
pl_stem_g = pl_stem .. "i"
elseif mw.ustring.find(word, "õa$") then
pl_stem = mw.ustring.gsub(word, "õa$", get_e(vh))
pl_stem_g = pl_stem .. "i"
end
data.stem_ns = stem
data.stem_gs = stem
data.stem_ps = stem .. "t"
data.stem_is = stem
data.stem_os = stem
data.stem_op = pl_stem .. "i"
data.stem_gp = unreduce_full(pl_stem_g) .. "j"
data.stem_pp = pl_stem .. "it"
data.illative_sg = "long_short"
data.grade = make_gradation(strong, weak)
data.infl_root = mw.ustring.gsub(word, m_vot.vowel .. "+$", "")
return process(data)
end
inflections = function (data)
data.typeno = "VII"
local word = data.title
local strong = data.args or error("must specify strong grade")
local weak = data.args or error("must specify weak grade")
local vh = data.vh
local stem, final
if data.no_singular then -- plural title -> singular
stem, final = unwind(data, word, weak, m_vot.vowel, "d")
else
stem, final = unwind(data, word, strong, m_vot.vowel)
end
local e = get_e(vh)
local pl = rewind(data, stem, strong, "i")
data.stem_ns = word
data.stem_gs = rewind(data, stem, weak, e)
data.stem_ps = rewind_long(data, stem, strong, "i")
data.stem_is = rewind_long(data, stem, strong, e)
data.stem_os = rewind(data, stem, weak, e)
data.stem_op = pl .. m_vot.ungeminate .. "i"
data.stem_gp = pl .. "j"
data.stem_pp = data.stem_op .. "t"
data.illative_sg = "long_short"
data.grade = make_gradation(strong, weak)
data.infl_root = stem
return process(data)
end
inflections = function (data)
data.typeno = "VII"
local word = data.title
local strong = "s"
local weak = "z"
local vh = data.vh
local stem, final
if data.no_singular then -- plural title -> singular
stem, final = unwind(data, word, "h" .. weak, m_vot.vowel, "d")
else
stem, final = unwind(data, word, "h" .. strong, m_vot.vowel)
end
local e = get_e(vh)
local pl = rewind(data, stem .. "h", strong, "i")
data.stem_ns = word
data.stem_gs = rewind(data, stem .. "h", weak, e)
data.stem_ps = stem .. strong .. strong
data.stem_is = rewind_long(data, stem .. "h", strong, e)
data.stem_os = rewind(data, stem .. "h", weak, e)
data.stem_op = pl .. m_vot.ungeminate .. "i"
data.stem_gp = pl .. "j"
data.stem_pp = data.stem_op .. "t"
data.illative_sg = "long_short"
data.grade = make_gradation(strong, weak)
data.infl_root = stem
return process(data)
end
inflections = function (data)
data.typeno = "VIII"
local word = data.title
local strong = data.args or error("must specify strong grade")
local weak = data.args or error("must specify weak grade")
local vh = data.vh
local stem, final
if data.no_singular then -- plural title -> singular
stem, final = unwind(data, word, weak, m_vot.vowel, "d")
else
stem, final = unwind(data, word, strong, m_vot.vowel)
end
final = get_or(data.args, unreduce(final) or final)
local pl = rewind(data, stem, strong, vh == "ä") .. "i"
data.stem_ns = word
data.stem_gs = make_gen_sg(data, rewind(data, stem, weak, final))
data.stem_ps = rewind_long(data, stem, strong, final)
data.stem_is = rewind_long(data, stem, strong, final)
data.stem_os = rewind(data, stem, weak, final)
data.stem_op = pl .. m_vot.ungeminate .. "i"
data.stem_gp = pl .. "j"
data.stem_pp = data.stem_op .. "t"
data.illative_sg = "long_short"
data.grade = make_gradation(strong, weak)
data.infl_root = stem
return process(data)
end
inflections = function (data)
data.typeno = "VIII"
local word = data.title
local vh = data.vh
local stem
if data.no_singular then -- plural title -> singular
stem = get_stem(word, "d")
else
stem = get_stem(word, "i")
end
local pl = stem .. "i"
data.stem_ns = word
data.stem_gs = stem .. vh .. vh
data.stem_ps = stem .. vh
data.stem_is = stem .. vh
data.stem_os = stem .. vh
data.stem_op = pl .. m_vot.ungeminate .. "i"
data.stem_gp = pl .. "j"
data.stem_pp = data.stem_op .. "t"
data.illative_sg = "long_short"
data.grade = make_gradation(strong, weak)
data.infl_root = stem
return process(data)
end
local LENGTHEN = mw.ustring.char(0xEEF0)
local tuli_weak = {
= "ll", = "rr", = "nn",
= "l", = "m", = "n", = "r",
= "z", = "hz", = "h",
= "d", = "h"
}
local tuli_partitive = {
= "ltt", = "rtt", = "nt", = "ss", = "ss", = "ntt"
}
local tuli_plural = {
= "ls", = "rs", = "s", = "hz", = LENGTHEN .. "s"
}
local function clean_lengthen(x)
return mw.ustring.gsub(x, "(" .. m_vot.vowel .. "?)" .. LENGTHEN, "%1%1")
end
inflections = function (data)
data.typeno = "X"
local word = data.title
local vh = data.vh
local strong = data.args or error("must specify final consonant")
local weak = tuli_weak or error("unrecognized final consonant")
local partitive = tuli_partitive or (strong .. "t")
local plural = tuli_plural or strong
local e = get_e(vh)
local stem
local has_i = true
if data.no_singular then -- plural title -> singular
stem = unwind(data, word, weak, e, "d")
elseif not mw.ustring.find(word, "i$") then
has_i = false
stem = get_stem(word, mw.ustring.gsub(plural, LENGTHEN, ""))
else
stem = unwind(data, word, mw.ustring.gsub(plural, LENGTHEN, ""), "i")
end
if weak == "d" then
if mw.ustring.find(stem, m_vot.vowel .. "i$") then
weak = "jj"
elseif mw.ustring.find(stem, m_vot.vowel .. "$") then
weak = "vv"
else
weak = ""
end
end
if has_i then
local short = get_tuli_short_nom_sg(word)
data.stem_ns = (short and { word, short } or word)
else
data.stem_ns = { word, word .. "i" }
end
local pl = clean_lengthen(stem .. plural .. "i")
local gs = rewind(data, stem, weak, e)
if data.args and mw.ustring.match(stem, "$") and mw.ustring.match(weak, "^vv") then
gs = join(rewind_oovv_uuvv(data, stem, weak, e), gs)
end
data.stem_gs = gs
data.stem_ps = stem .. partitive
data.stem_is = rewind_long(data, stem, strong, e)
data.stem_os = data.stem_gs
data.stem_op = pl .. m_vot.ungeminate .. "i"
data.stem_gp = pl .. "j"
data.stem_pp = data.stem_op .. "t"
if mw.ustring.match(partitive, "^t+$") then
data.stem_ps = mw.ustring.gsub(data.stem_ps, "(" .. m_vot.consonant .. "t)t$", "%1")
end
data.illative_sg = "short_long"
data.grade = make_gradation(strong, weak)
data.infl_root = stem
return process(data)
end
inflections = function (data)
data.typeno = "XI"
local word = data.title
local vh = data.vh
local e = get_e(vh)
local stem
if data.no_singular then -- plural title -> singular
stem = get_stem(word, "s" .. e .. "d")
else
stem = get_stem(word, "z")
end
local pl = stem .. "ssi"
data.stem_ns = word
data.stem_gs = stem .. "s" .. e
data.stem_ps = stem .. "ss"
data.stem_is = stem .. "ss" .. e
data.stem_os = data.stem_gs
data.stem_op = pl .. m_vot.ungeminate .. "i"
data.stem_gp = pl .. "j"
data.stem_pp = data.stem_op .. "t"
data.illative_sg = "long"
data.grade = make_gradation(strong, weak)
data.infl_root = stem
return process(data)
end
inflections = function (data)
data.typeno = "XII"
local word = data.title
local strong = data.args or ""
local weak = data.args or ""
local vh = data.vh
local e = get_e(vh)
local stem, final
if data.no_singular then -- plural title -> singular
stem, final = unwind(data, word, strong, m_vot.vowel, "z" .. e .. "d")
else
stem, final = unwind(data, word, strong, m_vot.vowel, "n")
end
local pl = m_vot.apply_ci(data.ci, stem, strong, final) .. "si" .. m_vot.ungeminate .. "i"
data.stem_ns = word
data.stem_gs = m_vot.apply_ci(data.ci, stem, strong, final) .. "z" .. e
data.stem_ps = m_vot.apply_ci(data.ci, stem, weak, final) .. "ss"
data.stem_is = geminate(m_vot.apply_ci(data.ci, stem, strong, final) .. "s" .. e)
data.stem_os = data.stem_gs
data.stem_op = pl
data.stem_gp = pl .. "j"
data.stem_pp = data.stem_op .. "t"
data.illative_sg = "short_long"
data.grade = make_gradation(strong, weak)
data.infl_root = stem
return process(data)
end
inflections = function (data)
data.typeno = "XIII"
local word = data.title
local weak = data.args or error("must specify weak grade")
local strong = data.args or error("must specify strong grade")
local vh = data.vh
local e = get_e(vh)
local v1, c1, v2
if data.no_singular then -- plural title -> singular
word = get_stem(word, "d")
v2 = data.args or mw.ustring.sub(word, -1, -1)
c1 = data.args or mw.ustring.sub(word, -2, -2)
v1 = data.args or mw.ustring.sub(word, -3, -3)
if not mw.ustring.match(v1, m_vot.vowel) then error("unexpected sound for type 11") end
if not mw.ustring.match(c1, m_vot.consonant) then error("unexpected sound for type 11") end
if not mw.ustring.match(v2, m_vot.vowel) then error("unexpected sound for type 11") end
word = get_stem(mw.ustring.sub(word, 1, -4), strong) .. weak .. v1
else
v1 = data.args or error("must specify penultimate stem vowel")
c1 = data.args or error("must specify final stem consonant")
v2 = data.args or error("must specify final stem vowel")
end
local stem
if mw.ustring.find(word, c1 .. "$") then
stem = mw.ustring.sub(word, 1, -2)
elseif mw.ustring.find(word, "$") then
stem = mw.ustring.sub(word, 1, -2)
else
stem = word
end
local stem = unwind(data, stem, weak, "", nil, true)
local pl = rewind(data, stem, strong, v1) .. c1 .. "i"
data.ci = true
data.stem_ns = word
data.stem_gs = rewind(data, stem, strong, v1) .. c1 .. v2
data.stem_ps = rewind(data, stem, weak, v1) .. (mw.ustring.match(c1, "") and "tt" or c1 .. "t")
data.stem_is = geminate(rewind(data, stem, strong, v1).. c1 .. v2)
data.stem_os = data.stem_gs
data.stem_op = pl .. m_vot.ungeminate .. "i"
data.stem_gp = pl .. "j"
data.stem_pp = data.stem_op .. "t"
data.illative_sg = "short_long"
data.grade = make_gradation(strong, weak)
data.infl_root = stem
return process(data)
end
inflections = function (data)
data.typeno = "XIII"
local word = data.title
local weak = data.args or error("must specify weak grade")
local strong = data.args or error("must specify strong grade")
local vh = data.vh
local v1, c1, v2
if data.no_singular then -- plural title -> singular
word = get_stem(word, "d")
v2 = data.args or mw.ustring.sub(word, -1, -1)
c1 = data.args or mw.ustring.sub(word, -2, -2)
v1 = data.args or mw.ustring.sub(word, -3, -3)
if not mw.ustring.match(v1, m_vot.vowel) then error("unexpected sound for type 11") end
if not mw.ustring.match(c1, m_vot.consonant) then error("unexpected sound for type 11") end
if not mw.ustring.match(v2, m_vot.vowel) then error("unexpected sound for type 11") end
word = get_stem(mw.ustring.sub(word, 1, -4), strong) .. weak .. v1
else
v1 = data.args or error("must specify penultimate stem vowel")
c1 = data.args or error("must specify final stem consonant")
v2 = data.args or error("must specify final stem vowel")
end
local stem = get_stem(word, weak .. "?")
local pl = stem .. strong .. v1 .. c1 .. "i"
data.ci = true
data.stem_ns = word
data.stem_gs = stem .. strong .. v1 .. c1 .. v2
data.stem_ps = rewind(data, stem, weak, v1) .. c1 .. vh
data.stem_is = geminate(stem .. strong .. v1 .. c1 .. v2)
data.stem_os = data.stem_gs
data.stem_op = pl .. m_vot.ungeminate .. "i"
data.stem_gp = pl .. "j"
data.stem_pp = data.stem_op .. "t"
data.illative_sg = "short_long"
data.grade = make_gradation(strong, weak)
data.infl_root = stem
return process(data)
end
inflections = function (data)
data.typeno = "XIII"
local word = data.title
local weak = data.args or error("must specify weak grade")
local strong = data.args or error("must specify strong grade")
local vh = data.vh
local v1, c1, v2
if data.no_singular then -- plural title -> singular
word = get_stem(word, "d")
v2 = data.args or mw.ustring.sub(word, -1, -1)
c1 = data.args or mw.ustring.sub(word, -2, -2)
v1 = data.args or mw.ustring.sub(word, -3, -3)
if not mw.ustring.match(v1, m_vot.vowel) then error("unexpected sound for type 11") end
if not mw.ustring.match(c1, m_vot.consonant) then error("unexpected sound for type 11") end
if not mw.ustring.match(v2, m_vot.vowel) then error("unexpected sound for type 11") end
word = get_stem(mw.ustring.sub(word, 1, -4), strong) .. weak .. v1
else
v1 = data.args or error("must specify penultimate stem vowel")
c1 = data.args or error("must specify final stem vowel")
v2 = data.args or error("must specify final stem consonant")
end
local stem = get_stem(word, weak .. m_vot.vowel)
local pl = stem .. strong .. v1 .. c1 .. "i"
data.ci = true
data.stem_ns = lengthen(word)
data.stem_gs = stem .. strong .. v1 .. c1 .. v2
data.stem_ps = geminate(rewind(data, stem, strong, v1) .. c1 .. vh)
data.stem_is = geminate(stem .. strong .. v1 .. c1 .. v2)
data.stem_os = data.stem_gs
data.stem_op = stem .. strong .. v1 .. c1 .. "i"
data.stem_gp = pl .. "j"
data.stem_pp = pl .. "t"
data.illative_sg = "short_long"
data.grade = make_gradation(strong, weak)
data.infl_root = stem
return process(data)
end
inflections = function (data)
data.typeno = "XIII"
local word = data.title
local vh = data.vh
if data.no_singular then -- plural title -> singular
error("Plural-only not supported for type kolmaz")
end
local stem = get_stem(word, "z")
local v1 = mw.ustring.sub(stem, -1)
local c1 = "m"
local v2 = data.args or error("must specify final stem vowel")
local pl = stem .. "tt" .. v1 .. c1 .. "i"
data.stem_ns = word
data.stem_gs = stem .. "tt" .. v1 .. c1 .. v2
data.stem_ps = stem .. "tt"
data.stem_is = geminate(stem .. "tt" .. v1 .. c1 .. v2)
data.stem_os = stem .. "tt" .. v1 .. c1 .. v2
data.stem_op = pl .. m_vot.ungeminate .. "i"
data.stem_gp = pl .. "j"
data.stem_pp = data.stem_op .. "t"
data.illative_sg = "short_long"
data.infl_root = stem
return process(data)
end
inflections = function (data)
data.typeno = "XIV"
local word = data.title
local weak = data.args or error("must specify weak grade")
local strong = data.args or error("must specify strong grade")
local vh = data.vh
local final
if data.no_singular then -- plural title -> singular
word = get_stem(word, "d")
final = mw.ustring.sub(word, -1, -1)
word = get_stem(mw.ustring.sub(word, 1, -2), strong) .. weak .. final .. "z"
else
final = mw.ustring.sub(word, -2, -2)
end
local stem = get_stem(word, weak .. final .. "z")
final = get_or(data.args, unreduce(final))
local h = false
if final == "e" and mw.ustring.find(stem, "e$") then
stem = stem .. "h"
h = true
end
local pl = h and stem .. strong .. "i" or geminate(stem .. strong .. final)
local stem_nom
if mw.ustring.match(mw.ustring.sub(word, 1, -3), "$") and mw.ustring.match(final, "") then
stem_nom = mw.ustring.sub(word, 1, -3) .. "i"
else
stem_nom = mw.ustring.sub(word, 1, -3) .. final
end
data.stem_ns = stem_nom .. "z"
data.stem_gs = h and stem .. strong .. final or geminate(stem .. strong .. final) .. final
data.stem_ps = stem_nom .. "ss"
data.stem_is = geminate(stem .. strong .. final)
data.stem_os = h and stem .. strong .. final or lengthen(data.stem_is)
data.stem_op = pl .. (not h and final == "i" and m_vot.ungeminate or "") .. "i"
data.stem_gp = unreduce_full(pl) .. "j"
data.stem_pp = data.stem_op .. "t"
data.illative_sg = "long_short"
data.grade = make_gradation(strong, weak)
data.infl_root = stem
return process(data)
end
inflections = function (data)
data.typeno = "XIV"
local word = data.title
local weak = data.args or error("must specify weak grade")
local strong = data.args or error("must specify strong grade")
local vh = data.vh
local e = get_e(vh)
local v1, c1, v2
local stem
if data.no_singular then -- plural title -> singular
stem = get_stem(word, strong .. e .. "d")
else
stem = get_stem(word, weak .. e)
end
data.stem_ns = word
data.stem_gs = geminate(stem .. strong .. e) .. e
data.stem_ps = stem .. weak .. e .. "tt"
data.stem_is = geminate(stem .. strong .. e)
data.stem_os = data.stem_gs
data.stem_op = geminate(stem .. strong .. e) .. "i"
data.stem_gp = geminate(stem .. strong .. e) .. "j"
data.stem_pp = data.stem_op .. "t"
data.illative_sg = "long_short"
data.grade = make_gradation(strong, weak)
data.infl_root = stem
return process(data)
end
inflections = function (data)
data.typeno = "XV"
local word = data.title
local vh = data.vh
local stem
if data.no_singular then -- plural title -> singular
stem = get_stem(word, "d")
elseif mw.ustring.find(word, "$") then
stem = mw.ustring.sub(word, 1, -2)
else
stem = word
end
local e = get_e(vh)
local final = mw.ustring.sub(stem, -1, -1)
stem = get_stem(stem, m_vot.vowel)
local final2 = data.args or error("Must specify final stem vowel")
data.stem_ns = word
data.stem_gs = make_gen_sg(data, geminate(stem .. final2))
data.stem_ps = stem .. final .. "tt"
data.stem_is = geminate(stem .. final2)
data.stem_os = data.stem_gs
data.stem_op = geminate(stem .. final) .. "i"
data.stem_gp = data.stem_op .. "j"
data.stem_pp = data.stem_op .. "t"
data.illative_sg = "long"
data.grade = make_gradation(strong, weak)
data.infl_root = stem
return process(data)
end
inflections = function (data)
data.typeno = "XV"
local word = data.title
local vh = data.vh
local stem
if data.no_singular then -- plural title -> singular
stem = get_stem(word, "d")
elseif mw.ustring.find(word, "$") then
stem = mw.ustring.sub(word, 1, -2)
else
stem = word
end
local e = get_e(vh)
local final = mw.ustring.sub(stem, -1, -1)
stem = get_stem(stem, "")
data.stem_ns = word
data.stem_gs = geminate(stem .. final)
data.stem_ps = stem .. final .. "tt"
data.stem_is = geminate(stem .. final)
data.stem_os = data.stem_gs
data.stem_op = geminate(stem .. final) .. "i"
data.stem_gp = data.stem_op .. "j"
data.stem_pp = data.stem_op .. "t"
data.illative_sg = "long"
data.grade = make_gradation(strong, weak)
data.infl_root = stem
return process(data)
end
-- inflection classes end
local infl_table = [=[{| class="inflection-table vsSwitcher vot-decl" data-toggle-category="declension"
|-
!colspan=3 class="vsToggleElement vot-decl-header-row" |Declension of {{{title}}} (<span class="vot-decl-type">{{{type}}}</span>)
|- class="vsHide"
! class="vot-decl-case-column" |
! class="vot-decl-form-column" | singular
! class="vot-decl-form-column" | plural
|-
! class="vot-decl-case-column" | nominative
| class="vot-decl-form-column" | {{{nom_sg}}}
| class="vot-decl-form-column" | {{{nom_pl}}}
|-
! genitive
|{{{gen_sg}}}
|{{{gen_pl}}}
|-
! partitive
|{{{par_sg}}}
|{{{par_pl}}}
|-
! illative
|{{{ill_sg}}}
|{{{ill_pl}}}
|- class="vsHide" |
! inessive
|{{{ine_sg}}}
|{{{ine_pl}}}
|- class="vsHide" |
! elative
|{{{ela_sg}}}
|{{{ela_pl}}}
|- class="vsHide" |
! allative
|{{{all_sg}}}
|{{{all_pl}}}
|- class="vsHide" |
! adessive
|{{{ade_sg}}}
|{{{ade_pl}}}
|- class="vsHide" |
! ablative
|{{{abl_sg}}}
|{{{abl_pl}}}
|- class="vsHide" |
! translative
|{{{tra_sg}}}
|{{{tra_pl}}}
|- class="vsHide" |
| colspan="3" class="vot-decl-notes" | <sup>*)</sup> the '''accusative''' corresponds with either the '''genitive''' (<span class="gender"><abbr title="singular number">sg</abbr></span>) or '''nominative''' (<span class="gender"><abbr title="plural number">pl</abbr></span>)<br /> <sup>**)</sup> the '''terminative''' is formed by adding the suffix {{m|vot|-ssaa}} to {{{has_short_ill}}}the '''genitive'''.<br /> <sup>***)</sup> the '''comitative''' is formed by adding the suffix {{m|vot|-ka}} to the '''genitive'''.
|}]=]
local function link(text)
return require("Module:links").full_link{ term = text, lang = m_vot.lang }
end
local function mention(text)
return require("Module:links").full_link({ term = text, lang = m_vot.lang }, "term")
end
function export.show(frame)
local infl_type = frame.args or error("inflection class not specified")
local infl = inflections or error("unsupported inflection type")
local args = frame:getParent().args
local title = args or mw.title.getCurrentTitle().text
local categories = {}
local geminate, vh, headword
if args == "1" then
geminate = true
elseif args == "0" or args == "-" then
geminate = false
else
headword = args
end
local prefix = args
local original_title = title
if prefix then
local prefix_len = mw.ustring.len(prefix)
local split
split, title = mw.ustring.sub(title, 1, prefix_len), mw.ustring.sub(title, prefix_len + 1)
if #title == 0 or prefix ~= split then
error("Prefix is too long or does not match title")
end
end
if args then
vh = args
if vh ~= "a" and vh ~= "ä" then
error("Invalid vowel harmony specification")
end
elseif not vh then
vh = m_vot.guess_vowel_harmony(headword or title)
end
local first_stressed = args and tonumber(args) or 1
local data = { title = title, headword = headword, geminate = geminate, prefix = prefix, vh = vh, args = args, first_stressed = first_stressed }
local word_prefix = prefix or ""
if args then
if args == "s" or args == "sg" then
data.no_plural = true
elseif args == "p" or args == "pl" then
data.no_singular = true
end
end
local forms = infl(data)
local function repl(form)
if form == "title" then
return "'''" .. original_title .. "'''"
elseif form == "type" then
if data.irregular then
return "irregular"
end
local s = "type " .. data.typeno .. "/" .. mention(infl_type)
if data.grade then
s = s .. ", " .. data.grade
else
s = s .. ", " .. make_gradation(nil, nil)
end
if data.geminate then
s = s .. ", gemination"
end
return s
elseif form == "has_short_ill" then
if data.illative_sg == "long" or data.no_singular then
return ""
elseif data.illative_sg == "short" then
return "the '''illative''' (<span class=\"gender\"><abbr title=\"singular number\">sg</abbr></span>) or "
else
return "the short '''illative''' (<span class=\"gender\"><abbr title=\"singular number\">sg</abbr></span>) or "
end
else
local value = forms
if not value then
return "—"
elseif type(value) == "table" then
local result = {}
for _, f in ipairs(value) do
table.insert(result, link(word_prefix .. f))
end
return table.concat(result, ", ")
else
return link(word_prefix .. value)
end
end
end
if mw.title.getCurrentTitle().namespace == 0 then
table.insert(categories, "Votic " .. infl_type .. "-type nominals")
end
local result = mw.ustring.gsub(infl_table, "{{{(+)}}}", repl)
result = mw.ustring.gsub(result, "{{m|vot|(-)}}", mention)
return result .. require("Module:utilities").format_categories(categories, m_vot.lang)
.. require("Module:TemplateStyles")("Module:vot-decl/style.css")
end
return export