local m_links = require("Module:links")
local export = {}
local lang = require("Module:languages").getByCode("fi")
-- Functions that do the actual inflecting by creating the forms of a basic term.
local inflections = {}
local kotus_grad_type = {
= "A",
= "B",
= "C",
= "D",
= "E",
= "F",
= "G",
= "H",
= "I",
= "J",
= "K",
= "L",
= "M"
}
local function tag_term(term)
-- return require("Module:script utilities").tag_text(term, lang, nil, "term")
return '<i class="Latn mention" lang="fi">' .. term .. '</i>'
end
local function normalize_apostrophes(term, link_target)
if link_target then
if term and mw.ustring.find(term, "’") then
term = mw.ustring.gsub(term, "’", "'")
end
else
if term and mw.ustring.find(term, "'") then
term = mw.ustring.gsub(term, "'", "’")
end
end
return term
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 or error("Inflection type has not been specified. Please pass parameter 1 to the module invocation")
local args = frame:getParent().args
if not inflections then
error("Unknown inflection type '" .. infl_type .. "'")
end
local data = {
forms = {},
title = nil,
categories = {},
vh = nil,
pagename = mw.title.getCurrentTitle().text
}
if args and mw.title.getCurrentTitle().namespace > 0 then
data.pagename = args.title
end
data.pagename = normalize_apostrophes(data.pagename)
-- Generate the forms
inflections(args, data)
-- Postprocess
postprocess(args, data)
if args then
table.insert(data.categories, "fi-conj with appendix")
end
if args then
table.insert(data.categories, "fi-conj with noagent")
end
if args or
args or args or args or args or args or args or
args or args or args or args or args or args then
table.insert(data.categories, "fi-conj with qual")
end
local categories
if args then
categories = ""
else
categories = require("Module:utilities").format_categories(data.categories, lang)
end
return make_table(data) .. categories
end
local function args_get_required(args, i, purpose)
local v = args
if not v then
error(purpose .. " (parameter " .. i .. ") may not be omitted.")
end
return v
end
local function args_get_vowel_harmony(args, i)
local v = args
if not v or not mw.ustring.match(v, "^$") then
error("Vowel harmony (parameter " .. i .. ") must be \"a\" or \"ä\".")
end
return v
end
-- Get parameters from the template, in standard order and numbering
local function get_params(args, num, invert_grades)
local params = {}
params.base = normalize_apostrophes(args)
if num >= 2 then
if num >= 4 then
params.strong = normalize_apostrophes(args_get_required(args, 2, "Infinitive grade"))
params.weak = normalize_apostrophes(args_get_required(args, 3, "Other grade"))
-- Swap the grades
if invert_grades then
params.strong, params.weak = params.weak, params.strong
end
end
if num >= 5 then
params.final = args_get_required(args, 4, "Final letter(s)")
end
params.a = args_get_vowel_harmony(args, num)
end
if params.a then
params.o = params.a == "ä" and "ö" or "o"
params.u = params.a == "ä" and "y" or "u"
end
return params
end
--[=[
Inflection functions
]=]--
local stem_endings = {}
stem_endings = {
= "a",
= "akse¤",
}
stem_endings = {
= "essa¤",
= "en",
}
stem_endings = {
= "V",
= "vat",
= "massa",
= "masta",
= "maan",
= "malla",
= "matta",
= "man",
= "minen",
= "maisilla¤",
= "va",
= "ma",
= "maton",
}
stem_endings = {
= "n",
= "t",
= "mme",
= "tte",
= "",
= "",
}
stem_endings = {
= "",
= "vat",
}
stem_endings = {
= "n",
= "t",
= "mme",
= "tte",
}
stem_endings = {
= "sin",
= "sit",
= "si",
= "simme",
= "sitte",
= "sivat",
= "si",
}
stem_endings = {
= "oon",
= "aamme",
= "aa",
= "oot",
= "o",
}
stem_endings = {
= "en",
= "et",
= "ee",
= "emme",
= "ette",
= "evat",
= "e",
= "ut",
= "eet",
}
stem_endings = {
= "aan",
= "a",
}
stem_endings = {
= "iin",
= "aisiin",
= "aisi",
= "akoon",
= "ako",
= "aneen",
= "ane",
= "aessa",
= "aman",
= "ava",
= "u",
}
-- Make a copy of the endings, with front vowels
stem_endings = { = stem_endings, = mw.clone(stem_endings)}
for stem_key, endings in pairs(stem_endings) do
for key, ending in pairs(endings) do
endings = mw.ustring.gsub(endings, "()", { = "ä", = "ö", = "y"})
end
end
local function process_stems(data, stems, vh, no_make_stems)
-- Create any stems that were not given
if not no_make_stems then
stems = stems or mw.clone(stems)
if not stems and stems then
stems = {}
for _, stem in ipairs(stems) do
table.insert(stems, mw.ustring.gsub(stem, "$", "") .. "i")
end
end
if not stems and stems then
stems = {}
for _, stem in ipairs(stems) do
table.insert(stems, stem .. "k")
end
end
if not stems and stems then
stems = {}
for _, stem in ipairs(stems) do
table.insert(stems, stem .. "n")
end
end
end
-- Create forms based on each stem, by adding endings to it
if not stems and stems then
stems = {}
for _, stem in ipairs(stems) do
table.insert(stems, (mw.ustring.gsub(stem, "e$", "i")))
end
end
stems = stems or mw.clone(stems)
stems = stems or mw.clone(stems)
-- Go through each of the stems given
for stem_key, substems in pairs(stems) do
for _, stem in ipairs(substems) do
-- Attach the endings to the stem
for form_key, ending in pairs(stem_endings) do
if not data.forms then
data.forms = {}
end
-- If the ending is "V" then it is a copy of the preceding vowel...
if ending == "V" then
-- ...but not if the stem ends in a long vowel or diphthong.
if mw.ustring.find(stem, "()%1$") or mw.ustring.find(stem, "()$") or mw.ustring.find(stem, "ie$") or mw.ustring.find(stem, "uo$") or mw.ustring.find(stem, "yö$") then
ending = ""
else
ending = mw.ustring.match(stem, "()$") or ""
end
end
table.insert(data.forms, stem .. ending)
end
end
end
data = vh
end
local KOTUS_TYPE = "] type "
local function make_kotus_title_number(type_number)
return KOTUS_TYPE .. type_number
end
local function make_kotus_title_word(reference_word)
return "/]"
end
local function make_kotus_title(number, reference_word)
return make_kotus_title_number(number) .. make_kotus_title_word(reference_word)
end
local function inflection_type_is(data, number, reference_word, strong, weak)
local title = make_kotus_title_number(number)
local has_gradation = strong and strong ~= weak
if has_gradation then
local letter = kotus_grad_type
if letter then
title = title .. "*" .. letter
else
title = title .. "*"
end
end
title = title .. make_kotus_title_word(reference_word)
if has_gradation then
local EMPTY = "<small>∅</small>"
local function format(grade)
if grade == "" then
return EMPTY
else
return "''" .. grade .. "''"
end
end
title = title .. ", " .. format(strong) .. "-" .. format(weak) .. " gradation"
else
title = title .. ", no gradation"
end
data.title = title
table.insert(data.categories, "Finnish " .. reference_word .. "-type verbs")
end
local function inflection_type_is_t_d(data, number, reference_word, weak)
if weak == "d" then
inflection_type_is(data, number, reference_word, "t", "d")
else
inflection_type_is(data, number, reference_word, weak .. "t", weak .. weak)
end
end
local function inflection_type_is_combo(data, number_a, reference_word_a, number_b, reference_word_b, strong, weak)
local title = KOTUS_TYPE
local has_gradation = strong and strong ~= weak
local gradation_suffix = ""
if has_gradation then
local letter = kotus_grad_type
if letter then
gradation_suffix = "*" .. letter
else
gradation_suffix = "*"
end
end
title = title .. number_a .. gradation_suffix .. make_kotus_title_word(reference_word_a)
title = title .. " and " .. number_b .. gradation_suffix .. make_kotus_title_word(reference_word_b)
if has_gradation then
local EMPTY = "<small>∅</small>"
local function format(grade)
if grade == "" then
return EMPTY
else
return "''" .. grade .. "''"
end
end
title = title .. ", " .. format(strong) .. "-" .. format(weak) .. " gradation"
else
title = title .. ", no gradation"
end
data.title = title
table.insert(data.categories, "Finnish " .. reference_word_a .. "-type verbs")
table.insert(data.categories, "Finnish " .. reference_word_b .. "-type verbs")
end
--[=[
Inflection types
]=]--
inflections = function(args, data)
local params = get_params(args, 5)
local apo = (params.weak == "" and mw.ustring.sub(params.base, -1) == params.final) and "'" or ""
local stems = {}
stems = {params.base .. params.strong .. params.final}
stems = {params.base .. params.weak .. apo .. params.final}
stems = {params.base .. params.strong .. params.final .. "i"}
stems = {params.base .. params.weak .. apo .. params.final .. "i"}
stems = {params.base .. params.weak .. apo .. params.final .. "t"}
stems = {params.base .. params.weak .. apo .. params.final .. "tt"}
inflection_type_is(data, 52, "sanoa", params.strong, params.weak)
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 4)
local stems = {}
stems = {params.base .. params.strong .. params.a}
stems = {params.base .. params.weak .. params.a}
stems = {params.base .. params.strong .. "i"}
stems = {params.base .. params.weak .. "i"}
stems = {params.base .. params.weak .. "et"}
stems = {params.base .. params.weak .. "ett"}
inflection_type_is(data, 53, "muistaa", params.strong, params.weak)
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 2)
local weak = mw.ustring.match(params.base, "()$") or "d"
local stems = {}
stems = {params.base .. "t" .. params.a}
stems = {params.base .. weak .. params.a}
stems = {params.base .. "si"}
stems = {params.base .. weak .. "et"}
stems = {params.base .. weak .. "ett"}
inflection_type_is_t_d(data, 54, "huutaa", weak)
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 2)
local weak = mw.ustring.match(params.base, "()$") or "d"
local stems = {}
stems = {params.base .. "t" .. params.a}
stems = {params.base .. weak .. params.a}
stems = {params.base .. "ti", params.base .. "si"}
stems = {params.base .. weak .. "i", params.base .. "si"}
stems = {params.base .. weak .. "et"}
stems = {params.base .. weak .. "ett"}
inflection_type_is_t_d(data, 55, "soutaa", weak)
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 4)
local stems = {}
stems = {params.base .. params.strong .. params.a}
stems = {params.base .. params.weak .. params.a}
stems = {params.base .. params.strong .. params.o .. "i"}
stems = {params.base .. params.weak .. params.o .. "i"}
stems = {params.base .. params.weak .. "et"}
stems = {params.base .. params.weak .. "ett"}
inflection_type_is(data, 56, "kaivaa", params.strong, params.weak)
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 2)
local weak = mw.ustring.match(params.base, "()$") or "d"
local stems = {}
stems = {params.base .. "t" .. params.a}
stems = {params.base .. weak .. params.a}
stems = {params.base .. "si", params.base .. "t" .. params.o .. "i"}
stems = {params.base .. "si", params.base .. weak .. params.o .. "i"}
stems = {params.base .. weak .. "et"}
stems = {params.base .. weak .. "ett"}
inflection_type_is_t_d(data, 57, "saartaa", weak)
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 4)
local stems = {}
stems = {params.base .. params.strong .. "e"}
stems = {params.base .. params.weak .. "e"}
stems = {params.base .. params.strong .. "i"}
stems = {params.base .. params.weak .. "i"}
stems = {params.base .. params.weak .. "et"}
stems = {params.base .. params.weak .. "ett"}
inflection_type_is(data, 58, "laskea", params.strong, params.weak)
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 2)
local weak = mw.ustring.match(params.base, "()$") or "d"
local stems = {}
stems = {params.base .. "te"}
stems = {params.base .. weak .. "e"}
stems = {params.base .. "si"}
stems = {params.base .. weak .. "et"}
stems = {params.base .. weak .. "ett"}
inflection_type_is_t_d(data, 59, "tuntea", weak)
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 2)
local stems = {}
stems = {params.base .. "hte"}
stems = {params.base .. "hde"}
stems = {params.base .. "hti", params.base .. "ksi"}
stems = {params.base .. "hdi", params.base .. "ksi"}
stems = {params.base .. "hdet"}
stems = {params.base .. "hdett"}
inflection_type_is(data, 60, "lähteä", "t", "d")
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 4)
local apo = (params.weak == "" and mw.ustring.sub(params.base, -1) == "i") and "'" or ""
local stems = {}
stems = {params.base .. params.strong .. "i"}
stems = {params.base .. params.weak .. apo .. "i"}
stems = {params.base .. params.strong .. "i"}
stems = {params.base .. params.weak .. apo .. "i"}
stems = {params.base .. params.weak .. apo .. "it"}
stems = {params.base .. params.weak .. apo .. "itt"}
inflection_type_is(data, 61, "sallia", params.strong, params.weak)
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 2)
local stems = {}
stems = {params.base .. "d"}
stems = {params.base}
stems = {params.base}
stems = {params.base .. "d"}
stems = {params.base .. "t"}
inflection_type_is(data, 62, "voida")
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 2)
local vowel = mw.ustring.sub(params.base, -1)
local stems = {}
stems = {params.base .. vowel .. "d"}
stems = {params.base .. vowel}
stems = {params.base .. "i"}
stems = {params.base .. "i"}
stems = {params.base .. vowel .. "d"}
stems = {params.base .. vowel .. "t"}
inflection_type_is(data, 63, "saada")
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 2)
local past_cond_stem = mw.ustring.sub(params.base, 1, -3) .. mw.ustring.sub(params.base, -1)
local stems = {}
stems = {params.base .. "d"}
stems = {params.base}
stems = {past_cond_stem .. "i"}
stems = {past_cond_stem .. "i"}
stems = {params.base .. "d"}
stems = {params.base .. "t"}
inflection_type_is(data, 64, "juoda")
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 2)
local stems = {}
stems = {params.base .. params.u .. "d"}
stems = {params.base .. params.u}
stems = {params.base .. "vi"}
stems = {params.base .. "vi"}
stems = {params.base .. params.u .. "d"}
stems = {params.base .. params.u .. "t"}
inflection_type_is(data, 65, "käydä")
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 5, true)
local stems = {}
stems = {params.base .. params.weak .. params.final .. "st"}
stems = {params.base .. params.strong .. params.final .. "se"}
stems = {params.base .. params.strong .. params.final .. "si"}
stems = {params.base .. params.weak .. params.final .. "sk"}
stems = {params.base .. params.weak .. params.final .. "ss"}
stems = {params.base .. params.weak .. params.final .. "st"}
stems = {params.base .. params.weak .. params.final .. "st"}
inflection_type_is(data, 66, "rohkaista", params.strong, params.weak)
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 5, true)
local cons = mw.ustring.sub(params.final, -1)
local stems = {}
stems = {params.base .. params.weak .. params.final .. cons}
stems = {params.base .. params.strong .. params.final .. "e"}
stems = {params.base .. params.strong .. params.final .. "i"}
stems = {params.base .. params.weak .. params.final .. "k"}
stems = {params.base .. params.weak .. params.final .. cons}
stems = {params.base .. params.weak .. params.final .. cons}
stems = {params.base .. params.weak .. params.final .. "t"}
inflection_type_is(data, 67, "tulla", params.strong, params.weak)
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 2)
local stems = {}
stems = {params.base .. "d"}
stems = {params.base, params.base .. "tse"}
stems = {params.base, params.base .. "tsi"}
stems = {params.base .. "k"}
stems = {params.base .. "n"}
stems = {params.base .. "d"}
stems = {params.base .. "t"}
inflection_type_is(data, 68, "tupakoida")
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 2)
local stems = {}
stems = {params.base .. "t"}
stems = {params.base .. "tse"}
stems = {params.base .. "tsi"}
stems = {params.base .. "tk"}
stems = {params.base .. "nn"}
stems = {params.base .. "t"}
stems = {params.base .. "tt"}
inflection_type_is(data, 69, "valita")
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 2)
local stems = {}
stems = {params.base .. "st"}
stems = {params.base .. "kse"}
stems = {params.base .. "ksi"}
stems = {params.base .. "sk"}
stems = {params.base .. "ss"}
stems = {params.base .. "st"}
stems = {params.base .. "st"}
inflection_type_is(data, 70, "juosta")
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 2)
local stems = {}
stems = {params.base .. "hd"}
stems = {params.base .. "ke"}
stems = {params.base .. "e"}
stems = {params.base .. "ki"}
stems = {params.base .. "i"}
stems = {params.base .. "hk"}
stems = {params.base .. "hn"}
stems = {params.base .. "hd"}
stems = {params.base .. "ht"}
inflection_type_is(data, 71, "nähdä", "k", "")
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 5, true)
local stems = {}
stems = {params.base .. params.weak .. params.final .. "t"}
stems = {params.base .. params.strong .. params.final .. "ne"}
stems = {params.base .. params.strong .. params.final .. "ni"}
stems = {params.base .. params.weak .. params.final .. "tk"}
stems = {params.base .. params.weak .. params.final .. "nn"}
stems = {params.base .. params.weak .. params.final .. "t"}
stems = {params.base .. params.weak .. params.final .. "tt"}
inflection_type_is(data, 72, "vanheta", params.strong, params.weak)
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 4, true)
local stems = {}
stems = {params.base .. params.weak .. params.a .. "t"}
stems = {params.base .. params.strong .. params.a .. params.a}
stems = {params.base .. params.strong .. params.a .. "si"}
stems = {params.base .. params.strong .. params.a .. "i"}
stems = {params.base .. params.weak .. params.a .. "tk"}
stems = {params.base .. params.weak .. params.a .. "nn"}
stems = {params.base .. params.weak .. params.a .. "t"}
stems = {params.base .. params.weak .. params.a .. "tt"}
inflection_type_is(data, 73, "salata", params.strong, params.weak)
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 5, true)
local stems = {}
stems = {params.base .. params.weak .. params.final .. "t"}
stems = {params.base .. params.strong .. params.final .. params.a}
stems = {params.base .. params.strong .. params.final .. "si"}
stems = {params.base .. params.strong .. params.final .. params.a .. "i", params.base .. params.strong .. params.final .. "i"}
stems = {params.base .. params.weak .. params.final .. "tk"}
stems = {params.base .. params.weak .. params.final .. "nn"}
stems = {params.base .. params.weak .. params.final .. "t"}
stems = {params.base .. params.weak .. params.final .. "tt"}
inflection_type_is(data, 74, "katketa", params.strong, params.weak)
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 5, true)
local stems = {}
stems = {params.base .. params.weak .. params.final .. "t"}
stems = {params.base .. params.strong .. params.final .. params.a}
stems = {params.base .. params.strong .. params.final .. "si"}
stems = {params.base .. params.weak .. params.final .. "tk"}
stems = {params.base .. params.weak .. params.final .. "nn"}
stems = {params.base .. params.weak .. params.final .. "t"}
stems = {params.base .. params.weak .. params.final .. "tt"}
inflection_type_is(data, 75, "selvitä", params.strong, params.weak)
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local params = get_params(args, 2)
local stems = {}
stems = {params.base .. "t" .. params.a}
stems = {params.base .. "d" .. params.a}
stems = {params.base .. "si"}
stems = {params.base .. "t" .. params.a .. "n", params.base .. "nn"}
stems = {params.base .. "det"}
stems = {params.base .. "dett"}
inflection_type_is(data, 76, "taitaa", "t", "d")
process_stems(data, stems, params.a)
end
inflections = function(args, data)
local stems = {}
stems = {"virkka"}
stems = {"virkka"}
stems = {"virka"}
stems = {"virkkoi"}
stems = {"virkoi"}
stems = {"virkkai"}
stems = {"virkkak"}
stems = {"virkkan"}
process_stems(data, stems, "a", true)
local stems = {}
stems = {"virket"}
stems = {"virkett"}
process_stems(data, stems, "ä", true)
inflection_type_is_combo(data, 56, "kaivaa", 53, "muistaa", "kk", "k")
data.title = data.title .. ", irregular vowel harmony"
end
inflections = function(args, data)
local stems = {}
stems = {"seist"}
stems = {"seisk"}
stems = {"seiss"}
stems = {"seist"}
stems = {"seist"}
process_stems(data, stems, "ä", true)
local stems = {}
stems = {"seiso"}
stems = {"seisoi"}
stems = {"seisoi"}
process_stems(data, stems, "a", true)
inflection_type_is_combo(data, 52, "sanoa", 66, "rohkaista")
end
inflections = function(args, data)
local stems = {}
stems = {"oll"}
stems = {"ole"}
stems = {"oli"}
stems = {"olk"}
stems = {"oll"}
stems = {"oll"}
stems = {"olt"}
process_stems(data, stems, "a")
data.forms = {"on"}
data.forms = {"ovat"}
data.forms = {"lienen"}
data.forms = {"lienet"}
data.forms = {"lienee"}
data.forms = {"lienemme"}
data.forms = {"lienette"}
data.forms = {"lienevät"}
data.forms = {"liene"}
inflection_type_is_combo(data, 67, "tulla", 64, "juoda")
end
-- Helper functions
local complex_forms = {
-- Present
= { "en", "pres_conn" },
= { "et", "pres_conn" },
= { "ei", "pres_conn" },
= { "emme", "pres_conn" },
= { "ette", "pres_conn" },
= { "eivät", "pres_conn" },
= { "ei", "pres_pasv_conn" },
= { "olen", "past_part" },
= { "olet", "past_part" },
= { "on", "past_part" },
= { "olemme", "past_part_pl" },
= { "olette", "past_part_pl" },
= { "ovat", "past_part_pl" },
= { "on", "past_pasv_part" },
= { "en ole", "past_part" },
= { "et ole", "past_part" },
= { "ei ole", "past_part" },
= { "emme ole", "past_part_pl" },
= { "ette ole", "past_part_pl" },
= { "eivät ole", "past_part_pl" },
= { "ei ole", "past_pasv_part" },
-- Past
= { "en", "past_part" },
= { "et", "past_part" },
= { "ei", "past_part" },
= { "emme", "past_part_pl" },
= { "ette", "past_part_pl" },
= { "eivät", "past_part_pl" },
= { "ei", "past_pasv_part" },
= { "olin", "past_part" },
= { "olit", "past_part" },
= { "oli", "past_part" },
= { "olimme", "past_part_pl" },
= { "olitte", "past_part_pl" },
= { "olivat", "past_part_pl" },
= { "oli", "past_pasv_part" },
= { "en ollut", "past_part" },
= { "et ollut", "past_part" },
= { "ei ollut", "past_part" },
= { "emme olleet", "past_part_pl" },
= { "ette olleet", "past_part_pl" },
= { "eivät olleet", "past_part_pl" },
= { "ei ollut", "past_pasv_part" },
-- Conditional
= { "en", "cond_conn" },
= { "et", "cond_conn" },
= { "ei", "cond_conn" },
= { "emme", "cond_conn" },
= { "ette", "cond_conn" },
= { "eivät", "cond_conn" },
= { "ei", "cond_pasv_conn" },
= { "olisin", "past_part" },
= { "olisit", "past_part" },
= { "olisi", "past_part" },
= { "olisimme", "past_part_pl" },
= { "olisitte", "past_part_pl" },
= { "olisivat", "past_part_pl" },
= { "olisi", "past_pasv_part" },
= { "en olisi", "past_part" },
= { "et olisi", "past_part" },
= { "ei olisi", "past_part" },
= { "emme olisi", "past_part_pl" },
= { "ette olisi", "past_part_pl" },
= { "eivät olisi", "past_part_pl" },
= { "ei olisi", "past_pasv_part" },
-- Imperative
= { "älä", "impr_2sg" },
= { "älköön", "impr_conn" },
= { "älkäämme", "impr_conn" },
= { "älkää", "impr_conn" },
= { "älkööt", "impr_conn" },
= { "älköön", "impr_pasv_conn" },
= { "ole", "past_part" },
= { "olkoon", "past_part" },
= { "olkaamme", "past_part_pl" },
= { "olkaa", "past_part_pl" },
= { "olkoot", "past_part_pl" },
= { "olkoon", "past_pasv_part" },
= { "älä ole", "past_part" },
= { "älköön olko", "past_part" },
= { "älkäämme olko", "past_part_pl" },
= { "älkää olko", "past_part_pl" },
= { "älkööt olko", "past_part_pl" },
= { "älköön olko", "past_pasv_part" },
-- Potential
= { "en", "potn_conn" },
= { "et", "potn_conn" },
= { "ei", "potn_conn" },
= { "emme", "potn_conn" },
= { "ette", "potn_conn" },
= { "eivät", "potn_conn" },
= { "ei", "potn_pasv_conn" },
= { "lienen", "past_part" },
= { "lienet", "past_part" },
= { "lienee", "past_part" },
= { "lienemme", "past_part_pl" },
= { "lienette", "past_part_pl" },
= { "lienevät", "past_part_pl" },
= { "lienee", "past_pasv_part" },
= { "en liene", "past_part" },
= { "et liene", "past_part" },
= { "ei liene", "past_part" },
= { "emme liene", "past_part_pl" },
= { "ette liene", "past_part_pl" },
= { "eivät liene", "past_part_pl" },
= { "ei liene", "past_pasv_part" },
}
function postprocess(args, data)
local appendix = args; if appendix == "" then appendix = nil end
local qual = args; if qual == "" then qual = nil end
-- Create the periphrastic forms (negative and perfect)
local function make_forms(aux, forms)
if not forms then
return nil
end
local ret = {}
for _, form in ipairs(forms) do
table.insert(ret, aux .. " ]")
end
return ret
end
if qual then data.no_accel = true end
-- Present
for key, value in pairs(complex_forms) do
data.forms = make_forms(value, data.forms])
end
-- Add qualifier
for key, form in pairs(data.forms) do
-- Add qual
-- for participles, qual is before, while for others it is after
if string.sub(key, -5) == "_part" then
for i, subform in ipairs(form) do
subform = (qual and qual .. " " or "") .. subform
form = subform
end
if form.rare then
for i, subform in ipairs(form.rare) do
subform = (qual and qual .. " " or "") .. subform
form.rare = subform
end
end
else
for i, subform in ipairs(form) do
subform = subform .. (qual and " " .. qual or "")
form = subform
end
if form.rare then
for i, subform in ipairs(form.rare) do
subform = subform .. (qual and " " .. qual or "")
form.rare = subform
end
end
end
data.forms = form
end
data.is_appendix = appendix
if args.noagent then
data.forms = nil
end
-- Check if the lemma form matches the page name
if not appendix and not (args or args or args or args or args or args) and (lang:makeEntryName(data.forms)) ~= normalize_apostrophes(data.pagename, true) then
table.insert(data.categories, "Finnish entries with inflection not matching pagename")
end
end
local inf_to_accel = {
= nil,
= "long|first|inf",
= "ine|of|second|actv|inf",
= "ine|of|second|pasv|inf",
= "ist|of|second|actv|inf",
= "ine|of|third|actv|inf",
= "ela|of|third|actv|inf",
= "ill|of|third|actv|inf",
= "ade|of|third|actv|inf",
= "abe|of|third|actv|inf",
= "ist|of|third|actv|inf",
= "ist|of|third|pasv|inf",
= "nom|of|fourth|inf",
= "par|of|fourth|inf",
= "fifth|inf"
}
local part_to_accel = {
= "pres|actv|part",
= "pres|pasv|part",
= "past|actv|part",
= "past|pasv|part",
= "agentpart",
= "neg|part"
}
function convert_to_accel_inf(form)
return inf_to_accel
end
function convert_to_accel_part(form)
return "participle-" .. part_to_accel
end
function convert_to_accel(form, vh)
if mw.ustring.match(form, "_perf") then
-- all perf forms involve the past participle which we do not want
-- to create manually
return nil
elseif form == "vnoun" then
return "vnoun-" .. vh
elseif form == "prox" then
return "proximative"
elseif mw.ustring.match(form, "^inf") then
return convert_to_accel_inf(form)
elseif mw.ustring.match(form, "_part$") then
return convert_to_accel_part(form)
end
-- imperative connegative is special
if form == "impr_2sg_neg" then
return "2|s|impr|conn"
elseif mw.ustring.match(form, "impr_%d%a%a_neg") then
return "3|or|p|impr|conn"
end
-- split to tense/mood, person, extra
local tmood, person, extra = unpack(mw.text.split(form, "_"))
if person == nil then error(form) end
local tense, mood = "", tmood
if tmood == "pres" or tmood == "past" then
tense, mood = tmood .. "|", "indc"
end
-- negative/connegative?
if extra == "neg" then
local result = tense
if person == "pasv" then
result = result .. "pasv"
else
-- not passive => active (no distinction between person here)
result = result .. "actv"
end
result = result .. "|" .. mood .. "|conn"
return result
end
-- convert person if not passive
person = person:gsub("(%d)(%a)%a", "%1|%2")
return person .. "|" .. tense .. mood
end
local poss_endings = {
= "ni", = "si", = "mme", = "nne", = "nsa"
}
local accel_prefixes = {
= "1|s", = "2|s", = "1|p", = "2|p", = "3"
}
-- Make the table
function make_table(data)
local vh = data.vh
local function show_form(form, accel)
if not form then
return "—"
elseif type(form) ~= "table" then
error("a non-table value was given in the list of inflected forms.")
end
local ret = {}
for key, subform in ipairs(form) do
if mw.ustring.find(subform, "¤") then subform = mw.ustring.gsub(subform, "¤", "") end
table.insert(ret, m_links.full_link({lang = lang, term = subform, accel = (accel and not data.no_accel) and { = accel } or nil}))
end
return table.concat(ret, "<br/>")
end
local function make_and_show_poss_table(form, vh, accel_suffix)
local short
if mw.ustring.find(form, "()¤") then
short = mw.ustring.gsub(form, "()¤", "%1%1n")
end
local function poss_repl(mode)
local ending = poss_endings
if ending:find("a") then ending = mw.ustring.gsub(ending, "a", vh) end
local forms = {(mw.ustring.gsub(form, "¤", ending))}
if mode == "3" and short then
table.insert(forms, 1, short)
end
local ret = {}
for key, subform in ipairs(forms) do
table.insert(ret, m_links.full_link({lang = lang, term = subform, accel = (accel_suffix and not data.no_accel) and { = accel_prefixes .. "|form|of|" .. accel_suffix } or nil}))
end
return table.concat(ret, "<br/>")
end
local poss_table_wikicode = [=[
{| class="inflection-table vsSwitcher fi-conj-poss" data-toggle-category="possessive inflection" style="text-align: center;" cellspacing="1" cellpadding="1"
|- class="fi-conj-poss-header"
! class="vsToggleElement" style="min-width: 30em; text-align: left;" colspan="3" | Possessive forms
|- class="vsHide"
! Person
! sing.
! plur.
|- class="vsHide"
! 1st
| {{{1s}}}
| {{{1p}}}
|- class="vsHide"
! 2nd
| {{{2s}}}
| {{{2p}}}
|- class="vsHide"
! 3rd
| colspan="2" | {{{3}}}
|}]=]
return mw.ustring.gsub(poss_table_wikicode, "{{{(+)}}}", poss_repl)
end
local function repl(param)
if param == "lemma" then
return (data.is_appendix and m_links.full_link({lang = lang, term = data.pagename}) or tag_term(data.pagename))
elseif param == "info" then
return data.title and " (" .. data.title .. ")" or ""
elseif param:find("^m_") then
return tag_term(param:sub(3))
elseif param:find("^poss_") then
local result = ""
local accel_suffix = convert_to_accel(param:sub(6), nil)
for _, subform in ipairs(data.forms) do
result = result .. make_and_show_poss_table(subform, vh, accel_suffix) .. "\n"
end
return result
else
return show_form(data.forms, convert_to_accel(param, vh))
end
end
local wikicode = [=[
{| class="inflection-table vsSwitcher" data-toggle-category="inflection" style="border: solid 1px #CCCCFF; text-align: left;" cellspacing="1" cellpadding="2"
|- style="background: #CCCCFF;"
! class="vsToggleElement" colspan="7" | ] of {{{lemma}}}{{{info}}}
|- class="vsHide" style="background: #CCCCFF;"
! colspan="7" | ]
|- class="vsHide" style="background: #CCCCFF;"
! colspan="4" | ]
! colspan="3" | perfect
|- class="vsHide" style="background: #E6E6FF;"
! style="min-width: 10em; background: #CCCCFF;" colspan="2" | person
! style="min-width: 13em;" | positive
! style="min-width: 13em;" | negative
! style="min-width: 10em; background: #CCCCFF;" | person
! style="min-width: 13em;" | positive
! style="min-width: 13em;" | negative
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 1st sing.
| data-accel-col="1" | {{{pres_1sg}}}
| data-accel-col="2" | {{{pres_1sg_neg}}}
! style="background: #CCCCFF;" | 1st sing.
| data-accel-col="3" | {{{pres_perf_1sg}}}
| data-accel-col="4" | {{{pres_perf_1sg_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 2nd sing.
| data-accel-col="1" | {{{pres_2sg}}}
| data-accel-col="2" | {{{pres_2sg_neg}}}
! style="background: #CCCCFF;" | 2nd sing.
| data-accel-col="3" | {{{pres_perf_2sg}}}
| data-accel-col="4" | {{{pres_perf_2sg_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 3rd sing.
| data-accel-col="1" | {{{pres_3sg}}}
| data-accel-col="2" | {{{pres_3sg_neg}}}
! style="background: #CCCCFF;" | 3rd sing.
| data-accel-col="3" | {{{pres_perf_3sg}}}
| data-accel-col="4" | {{{pres_perf_3sg_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 1st plur.
| data-accel-col="1" | {{{pres_1pl}}}
| data-accel-col="2" | {{{pres_1pl_neg}}}
! style="background: #CCCCFF;" | 1st plur.
| data-accel-col="3" | {{{pres_perf_1pl}}}
| data-accel-col="4" | {{{pres_perf_1pl_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 2nd plur.
| data-accel-col="1" | {{{pres_2pl}}}
| data-accel-col="2" | {{{pres_2pl_neg}}}
! style="background: #CCCCFF;" | 2nd plur.
| data-accel-col="3" | {{{pres_perf_2pl}}}
| data-accel-col="4" | {{{pres_perf_2pl_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 3rd plur.
| data-accel-col="1" | {{{pres_3pl}}}
| data-accel-col="2" | {{{pres_3pl_neg}}}
! style="background: #CCCCFF;" | 3rd plur.
| data-accel-col="3" | {{{pres_perf_3pl}}}
| data-accel-col="4" | {{{pres_perf_3pl_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | passive
| data-accel-col="1" | {{{pres_pasv}}}
| data-accel-col="2" | {{{pres_pasv_neg}}}
! style="background: #CCCCFF;" | passive
| data-accel-col="3" | {{{pres_perf_pasv}}}
| data-accel-col="4" | {{{pres_perf_pasv_neg}}}
|- class="vsHide" style="background: #CCCCFF;"
! colspan="4" | ]
! colspan="3" | pluperfect
|- class="vsHide" style="background: #E6E6FF;"
! style="background: #CCCCFF;" colspan="2" | person
! positive
! negative
! style="background: #CCCCFF;" | person
! positive
! negative
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 1st sing.
| data-accel-col="1" | {{{past_1sg}}}
| data-accel-col="2" | {{{past_1sg_neg}}}
! style="background: #CCCCFF;" | 1st sing.
| data-accel-col="3" | {{{past_perf_1sg}}}
| data-accel-col="4" | {{{past_perf_1sg_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 2nd sing.
| data-accel-col="1" | {{{past_2sg}}}
| data-accel-col="2" | {{{past_2sg_neg}}}
! style="background: #CCCCFF;" | 2nd sing.
| data-accel-col="3" | {{{past_perf_2sg}}}
| data-accel-col="4" | {{{past_perf_2sg_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 3rd sing.
| data-accel-col="1" | {{{past_3sg}}}
| data-accel-col="2" | {{{past_3sg_neg}}}
! style="background: #CCCCFF;" | 3rd sing.
| data-accel-col="3" | {{{past_perf_3sg}}}
| data-accel-col="4" | {{{past_perf_3sg_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 1st plur.
| data-accel-col="1" | {{{past_1pl}}}
| data-accel-col="2" | {{{past_1pl_neg}}}
! style="background: #CCCCFF;" | 1st plur.
| data-accel-col="3" | {{{past_perf_1pl}}}
| data-accel-col="4" | {{{past_perf_1pl_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 2nd plur.
| data-accel-col="1" | {{{past_2pl}}}
| data-accel-col="2" | {{{past_2pl_neg}}}
! style="background: #CCCCFF;" | 2nd plur.
| data-accel-col="3" | {{{past_perf_2pl}}}
| data-accel-col="4" | {{{past_perf_2pl_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 3rd plur.
| data-accel-col="1" | {{{past_3pl}}}
| data-accel-col="2" | {{{past_3pl_neg}}}
! style="background: #CCCCFF;" | 3rd plur.
| data-accel-col="3" | {{{past_perf_3pl}}}
| data-accel-col="4" | {{{past_perf_3pl_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | passive
| data-accel-col="1" | {{{past_pasv}}}
| data-accel-col="2" | {{{past_pasv_neg}}}
! style="background: #CCCCFF;" | passive
| data-accel-col="3" | {{{past_perf_pasv}}}
| data-accel-col="4" | {{{past_perf_pasv_neg}}}
|- class="vsHide" style="background: #CCCCFF;"
! colspan="7" | ]
|- class="vsHide" style="background: #CCCCFF;"
! colspan="4" | present
! colspan="3" | perfect
|- class="vsHide" style="background: #E6E6FF;"
! style="background: #CCCCFF;" colspan="2" | person
! positive
! negative
! style="background: #CCCCFF;" | person
! positive
! negative
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 1st sing.
| data-accel-col="1" | {{{cond_1sg}}}
| data-accel-col="2" | {{{cond_1sg_neg}}}
! style="background: #CCCCFF;" | 1st sing.
| data-accel-col="3" | {{{cond_perf_1sg}}}
| data-accel-col="4" | {{{cond_perf_1sg_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 2nd sing.
| data-accel-col="1" | {{{cond_2sg}}}
| data-accel-col="2" | {{{cond_2sg_neg}}}
! style="background: #CCCCFF;" | 2nd sing.
| data-accel-col="3" | {{{cond_perf_2sg}}}
| data-accel-col="4" | {{{cond_perf_2sg_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 3rd sing.
| data-accel-col="1" | {{{cond_3sg}}}
| data-accel-col="2" | {{{cond_3sg_neg}}}
! style="background: #CCCCFF;" | 3rd sing.
| data-accel-col="3" | {{{cond_perf_3sg}}}
| data-accel-col="4" | {{{cond_perf_3sg_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 1st plur.
| data-accel-col="1" | {{{cond_1pl}}}
| data-accel-col="2" | {{{cond_1pl_neg}}}
! style="background: #CCCCFF;" | 1st plur.
| data-accel-col="3" | {{{cond_perf_1pl}}}
| data-accel-col="4" | {{{cond_perf_1pl_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 2nd plur.
| data-accel-col="1" | {{{cond_2pl}}}
| data-accel-col="2" | {{{cond_2pl_neg}}}
! style="background: #CCCCFF;" | 2nd plur.
| data-accel-col="3" | {{{cond_perf_2pl}}}
| data-accel-col="4" | {{{cond_perf_2pl_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 3rd plur.
| data-accel-col="1" | {{{cond_3pl}}}
| data-accel-col="2" | {{{cond_3pl_neg}}}
! style="background: #CCCCFF;" | 3rd plur.
| data-accel-col="3" | {{{cond_perf_3pl}}}
| data-accel-col="4" | {{{cond_perf_3pl_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | passive
| data-accel-col="1" | {{{cond_pasv}}}
| data-accel-col="2" | {{{cond_pasv_neg}}}
! style="background: #CCCCFF;" | passive
| data-accel-col="3" | {{{cond_perf_pasv}}}
| data-accel-col="4" | {{{cond_perf_pasv_neg}}}
|- class="vsHide" style="background: #CCCCFF;"
! colspan="7" | ]
|- class="vsHide" style="background: #CCCCFF;"
! colspan="4" | present
! colspan="3" | perfect
|- class="vsHide" style="background: #E6E6FF;"
! style="background: #CCCCFF;" colspan="2" | person
! positive
! negative
! style="background: #CCCCFF;" | person
! positive
! negative
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 1st sing.
| —
| —
! style="background: #CCCCFF;" | 1st sing.
| —
| —
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 2nd sing.
| data-accel-col="1" | {{{impr_2sg}}}
| data-accel-col="2" | {{{impr_2sg_neg}}}
! style="background: #CCCCFF;" | 2nd sing.
| data-accel-col="3" | {{{impr_perf_2sg}}}
| data-accel-col="4" | {{{impr_perf_2sg_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 3rd sing.
| data-accel-col="1" | {{{impr_3sg}}}
| data-accel-col="2" | {{{impr_3sg_neg}}}
! style="background: #CCCCFF;" | 3rd sing.
| data-accel-col="3" | {{{impr_perf_3sg}}}
| data-accel-col="4" | {{{impr_perf_3sg_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 1st plur.
| data-accel-col="1" | {{{impr_1pl}}}
| data-accel-col="2" | {{{impr_1pl_neg}}}
! style="background: #CCCCFF;" | 1st plur.
| data-accel-col="3" | {{{impr_perf_1pl}}}
| data-accel-col="4" | {{{impr_perf_1pl_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 2nd plur.
| data-accel-col="1" | {{{impr_2pl}}}
| data-accel-col="2" | {{{impr_2pl_neg}}}
! style="background: #CCCCFF;" | 2nd plur.
| data-accel-col="3" | {{{impr_perf_2pl}}}
| data-accel-col="4" | {{{impr_perf_2pl_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 3rd plur.
| data-accel-col="1" | {{{impr_3pl}}}
| data-accel-col="2" | {{{impr_3pl_neg}}}
! style="background: #CCCCFF;" | 3rd plur.
| data-accel-col="3" | {{{impr_perf_3pl}}}
| data-accel-col="4" | {{{impr_perf_3pl_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | passive
| data-accel-col="1" | {{{impr_pasv}}}
| data-accel-col="2" | {{{impr_pasv_neg}}}
! style="background: #CCCCFF;" | passive
| data-accel-col="3" | {{{impr_perf_pasv}}}
| data-accel-col="4" | {{{impr_perf_pasv_neg}}}
|- class="vsHide" style="background: #CCCCFF;"
! colspan="7" | ]
|- class="vsHide" style="background: #CCCCFF;"
! colspan="4" | present
! colspan="3" | perfect
|- class="vsHide" style="background: #E6E6FF;"
! style="background: #CCCCFF;" colspan="2" | person
! positive
! negative
! style="background: #CCCCFF;" | person
! positive
! negative
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 1st sing.
| data-accel-col="1" | {{{potn_1sg}}}
| data-accel-col="2" | {{{potn_1sg_neg}}}
! style="background: #CCCCFF;" | 1st sing.
| data-accel-col="3" | {{{potn_perf_1sg}}}
| data-accel-col="4" | {{{potn_perf_1sg_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 2nd sing.
| data-accel-col="1" | {{{potn_2sg}}}
| data-accel-col="2" | {{{potn_2sg_neg}}}
! style="background: #CCCCFF;" | 2nd sing.
| data-accel-col="3" | {{{potn_perf_2sg}}}
| data-accel-col="4" | {{{potn_perf_2sg_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 3rd sing.
| data-accel-col="1" | {{{potn_3sg}}}
| data-accel-col="2" | {{{potn_3sg_neg}}}
! style="background: #CCCCFF;" | 3rd sing.
| data-accel-col="3" | {{{potn_perf_3sg}}}
| data-accel-col="4" | {{{potn_perf_3sg_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 1st plur.
| data-accel-col="1" | {{{potn_1pl}}}
| data-accel-col="2" | {{{potn_1pl_neg}}}
! style="background: #CCCCFF;" | 1st plur.
| data-accel-col="3" | {{{potn_perf_1pl}}}
| data-accel-col="4" | {{{potn_perf_1pl_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 2nd plur.
| data-accel-col="1" | {{{potn_2pl}}}
| data-accel-col="2" | {{{potn_2pl_neg}}}
! style="background: #CCCCFF;" | 2nd plur.
| data-accel-col="3" | {{{potn_perf_2pl}}}
| data-accel-col="4" | {{{potn_perf_2pl_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 3rd plur.
| data-accel-col="1" | {{{potn_3pl}}}
| data-accel-col="2" | {{{potn_3pl_neg}}}
! style="background: #CCCCFF;" | 3rd plur.
| data-accel-col="3" | {{{potn_perf_3pl}}}
| data-accel-col="4" | {{{potn_perf_3pl_neg}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | passive
| data-accel-col="1" | {{{potn_pasv}}}
| data-accel-col="2" | {{{potn_pasv_neg}}}
! style="background: #CCCCFF;" | passive
| data-accel-col="3" | {{{potn_perf_pasv}}}
| data-accel-col="4" | {{{potn_perf_pasv_neg}}}
|- class="vsHide" style="background: #CCCCFF;"
! colspan="7" | Nominal forms
|- class="vsHide" style="background: #CCCCFF;"
! colspan="4" | ]s
! colspan="3" | ]s
|- class="vsHide" style="background: #E6E6FF;"
| style="background: #CCCCFF;" colspan="2" |
! active
! passive
| style="background: #CCCCFF;" |
! active
! passive
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | 1st
| data-accel-col="1" colspan="2" | {{{inf1}}}
! style="background: #CCCCFF;" | present
| data-accel-col="1" | {{{pres_part}}}
| data-accel-col="1" | {{{pres_pasv_part}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | long 1st<sup>1</sup>
| data-accel-col="1" colspan="2" |
{{{poss_inf1_long}}}
! style="background: #CCCCFF;" | past
| data-accel-col="1" | {{{past_part}}}
| data-accel-col="1" | {{{past_pasv_part}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" rowspan="3" | 2nd
! style="background: #E6E6FF;" rowspan="2" | inessive<sup>2</sup>
| data-accel-col="1" | {{{inf2_ine}}}
| data-accel-col="1" | {{{inf2_pasv_ine}}}
! style="background: #CCCCFF;" | agent<sup>3</sup>
| data-accel-col="1" colspan="2" | {{{agnt_part}}}
|- class="vsHide" style="background: #F2F2FF;"
| data-accel-col="1" colspan="2" |
{{{poss_inf2_ine}}}
! style="background: #CCCCFF;" | negative
| data-accel-col="1" colspan="2" | {{{nega_part}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #E6E6FF;" | instructive
| data-accel-col="1" | {{{inf2_ins}}}
| —
| colspan="3" rowspan="10" style="text-align:left;vertical-align:top;font-size:smaller;" | <sup>1)</sup> Used only with a possessive suffix.<br/>
<sup>2)</sup> Usually with a possessive suffix (active only).<br/>
<sup>3)</sup> Usually with a possessive suffix. Does not exist in the case of intransitive verbs. Do not confuse with nouns formed with the {{{m_-ma}}} suffix or the third infinitives.<br/>
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" rowspan="6" | 3rd
! style="background: #E6E6FF;" | inessive
| data-accel-col="1" | {{{inf3_ine}}}
| —
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #E6E6FF;" | elative
| data-accel-col="1" | {{{inf3_ela}}}
| —
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #E6E6FF;" | illative
| data-accel-col="1" | {{{inf3_ill}}}
| —
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #E6E6FF;" | adessive
| data-accel-col="1" | {{{inf3_ade}}}
| —
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #E6E6FF;" | abessive
| data-accel-col="1" | {{{inf3_abe}}}
| —
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #E6E6FF;" | instructive
| data-accel-col="1" | {{{inf3_ins}}}
| data-accel-col="1" | {{{inf3_pasv_ins}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | verbal noun
| colspan="2" data-accel-col="1" | {{{vnoun}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #CCCCFF;" colspan="2" | ]
| colspan="2" data-accel-col="1" |
{{{poss_prox}}}
|}]=]
return mw.ustring.gsub(wikicode, "{{{(+)}}}", repl)
end
return export