local m_utilities = require("Module:utilities")
local m_links = require("Module:links")
local export = {}
local lang = require("Module:languages").getByCode("cel-pro")
local function postprocess(args, data)
data.actv = true
data.pasv = true
if args == "actv" then
data.pasv = false
elseif args == "pasv" then
data.actv = false
data.info = data.info .. ", deponent"
table.insert(data.categories, lang:getCanonicalName() .. " deponent verbs")
end
for key, form in pairs(data.forms) do
-- Do not show singular or plural forms for nominals that don't have them
if (args == "actv" and key:find("pasv")) or (args == "pasv" and key:find("actv")) then
form = nil
end
data.forms = form
end
end
local function present(data, stem)
if not stem then
stem = "?"
end
local stem2 = stem
local stem_pl = stem
-- Present indicative: default athematic; overridden by stem-class specific rules
data.forms = {stem .. "mi"}
data.forms = {stem .. "si"}
data.forms = {stem .. "ti"}
data.forms = {stem .. "mosi"}
data.forms = {stem .. "tesi"}
data.forms = {stem .. "nti"}
data.forms = {stem .. "r"}
data.forms = {stem .. "tar"}
data.forms = {stem .. "tor"}
data.forms = {stem .. "mmor"}
data.forms = {stem .. "dwe"}
data.forms = {stem .. "ntor"}
-- Imperfect indicative
data.forms = {stem .. "mam"}
data.forms = {stem .. "tās"}
data.forms = {stem .. "to"}
data.forms = {stem .. "mo"}
data.forms = {stem .. "stē"}
data.forms = {stem .. "nto"}
data.forms = {"?"}
data.forms = {"?"}
-- Imperative
data.forms = {stem}
data.forms = {stem .. "tou"}
data.forms = {stem .. "mos"}
data.forms = {stem .. "te"}
data.forms = {stem .. "ntou"}
-- Present-stem overrides
if mw.ustring.find(stem, "e$") then
table.insert(data.info, "thematic present")
stem2 = string.sub(stem, 1, -2)
data.forms = {stem2 .. "ū"}
data.forms = {stem2 .. "esi"}
data.forms = {stem2 .. "eti"}
data.forms = {stem2 .. "omosi"}
data.forms = {stem2 .. "etesi"}
data.forms = {stem2 .. "onti"}
data.forms = {stem2 .. "ūr"}
data.forms = {stem2 .. "etar"}
data.forms = {stem2 .. "etor"}
data.forms = {stem2 .. "ommor"}
data.forms = {stem2 .. "edwe"}
data.forms = {stem2 .. "ontor"}
data.forms = {stem2 .. "omos"}
data.forms = {stem2 .. "ete"}
data.forms = {stem2 .. "ontou"}
elseif mw.ustring.find(stem, "<h2e>$") then
table.insert(data.info, "thematic present with a-colouring")
stem2 = string.sub(stem, 1, -6)
pref, suf = string.match(stem2, "^(.-)e(.+)$")
-- for *sistati
if pref == nil then
stem_a = stem2
else stem_a = pref .. "a" .. suf
end
data.forms = {stem2 .. "ū"}
data.forms = {stem_a .. "asi"}
data.forms = {stem_a .. "ati"}
data.forms = {stem2 .. "omosi"}
data.forms = {stem_a .. "atesi"}
data.forms = {stem2 .. "onti"}
data.forms = {stem2 .. "ūr"}
data.forms = {stem_a .. "atar"}
data.forms = {stem_a .. "ator"}
data.forms = {stem2 .. "ommor"}
data.forms = {stem_a .. "adwe"}
data.forms = {stem2 .. "ontor"}
data.forms = {stem_a .. "amam"}
data.forms = {stem_a .. "atās"}
data.forms = {stem_a .. "ato"}
data.forms = {stem_a .. "amo"}
data.forms = {stem_a .. "astē"}
data.forms = {stem_a .. "anto"}
data.forms = {stem_a .. "a"}
data.forms = {stem_a .. "atou"}
data.forms = {stem2 .. "omos"}
data.forms = {stem_a .. "ate"}
data.forms = {stem2 .. "ontou"}
elseif mw.ustring.find(stem, "a$") then
table.insert(data.info, "athematic present")
-- Seṭ-root nasal-infixed presents
elseif mw.ustring.find(stem, "<H>$") then
table.insert(data.info, "athematic h₂-root nasal-infix present")
stem2 = string.sub(stem, 1, -4)
stem_pl = string.sub(stem, 1, -6) .. "a"
data.forms = {stem2 .. "mi"}
data.forms = {stem2 .. "si"}
data.forms = {stem2 .. "ti"}
data.forms = {stem_pl .. "mosi"}
data.forms = {stem_pl .. "tesi"}
data.forms = {stem_pl .. "nti"}
data.forms = {stem2 .. "r"}
data.forms = {stem2 .. "tar"}
data.forms = {stem2 .. "tor"}
data.forms = {stem_pl .. "mmor"}
data.forms = {stem_pl .. "dwe"}
data.forms = {stem_pl .. "ntor"}
data.forms = {stem_pl .. "mam"}
data.forms = {stem_pl .. "tās"}
data.forms = {stem_pl .. "to"}
data.forms = {stem_pl .. "mo"}
data.forms = {stem_pl .. "stē"}
data.forms = {stem_pl .. "nto"}
data.forms = {stem2}
data.forms = {stem2 .. "tou"}
data.forms = {stem_pl .. "mos"}
data.forms = {stem_pl .. "te"}
data.forms = {stem_pl .. "ntou"}
elseif mw.ustring.find(stem, "<h1>$") then
table.insert(data.info, "athematic h₁-root nasal-infix present")
stem2 = string.sub(stem, 1, -5)
stem_pl = string.sub(stem, 1, -7) .. "a"
stem_3pl = string.sub(stem, 1, -7) .."e"
data.forms = {stem2 .. "mi"}
data.forms = {stem2 .. "si"}
data.forms = {stem2 .. "ti"}
data.forms = {stem_pl .. "mosi"}
data.forms = {stem_pl .. "tesi"}
data.forms = {stem_3pl .. "nti"}
data.forms = {stem2 .. "r"}
data.forms = {stem2 .. "tar"}
data.forms = {stem2 .. "tor"}
data.forms = {stem_pl .. "mmor"}
data.forms = {stem_pl .. "dwe"}
data.forms = {stem_3pl .. "ntor"}
data.forms = {stem_pl .. "mam"}
data.forms = {stem_pl .. "tās"}
data.forms = {stem_pl .. "to"}
data.forms = {stem_pl .. "mo"}
data.forms = {stem_pl .. "stē"}
data.forms = {stem_pl .. "nto"}
data.forms = {stem2}
data.forms = {stem2 .. "tou"}
data.forms = {stem_pl .. "mos"}
data.forms = {stem_pl .. "te"}
data.forms = {stem_3pl .. "ntou"}
elseif mw.ustring.find(stem, "<h3>$") then
table.insert(data.info, "athematic h₃-root nasal-infix present")
stem2 = string.sub(stem, 1, -5)
stem_pl = string.sub(stem, 1, -7) .. "a"
stem_3pl = string.sub(stem, 1, -7) .."o"
data.forms = {stem2 .. "mi"}
data.forms = {stem2 .. "si"}
data.forms = {stem2 .. "ti"}
data.forms = {stem_pl .. "mosi"}
data.forms = {stem_pl .. "tesi"}
data.forms = {stem_3pl .. "nti"}
data.forms = {stem2 .. "r"}
data.forms = {stem2 .. "tar"}
data.forms = {stem2 .. "tor"}
data.forms = {stem_pl .. "mmor"}
data.forms = {stem_pl .. "dwe"}
data.forms = {stem_3pl .. "ntor"}
data.forms = {stem_pl .. "mam"}
data.forms = {stem_pl .. "tās"}
data.forms = {stem_pl .. "to"}
data.forms = {stem_pl .. "mo"}
data.forms = {stem_pl .. "stē"}
data.forms = {stem_pl .. "nto"}
data.forms = {stem2}
data.forms = {stem2 .. "tou"}
data.forms = {stem_pl .. "mos"}
data.forms = {stem_pl .. "te"}
data.forms = {stem_3pl .. "ntou"}
-- Weak presents
elseif mw.ustring.find(stem, "ā$") then
table.insert(data.info, "ā-present")
elseif mw.ustring.find(stem, "ī$") then
table.insert(data.info, "ī-present")
stem2 = string.sub(stem, 1, -3) .. "ey"
data.forms = {stem2 .. "ū"}
data.forms = {stem .. "si"}
data.forms = {stem .. "ti"}
data.forms = {stem2 .. "omosi"}
data.forms = {stem .. "tesi"}
data.forms = {stem2 .. "onti"}
data.forms = {stem2 .. "ūr"}
data.forms = {stem .. "tar"}
data.forms = {stem .. "tor"}
data.forms = {stem2 .. "ommor"}
data.forms = {stem .. "dwe"}
data.forms = {stem2 .. "ontor"}
data.forms = {stem2 .. "omos"}
data.forms = {stem .. "te"}
data.forms = {stem2 .. "ontou"}
--- Copula
elseif mw.ustring.find(stem, "esē$") then
table.insert(data.info, "athematic present")
data.forms = {"esmi"}
data.forms = {"esi"}
data.forms = {"esti"}
data.forms = {"esmosi"}
data.forms = {"estesi"}
data.forms = {"senti"}
data.forms = {"es"}
data.forms = {"estou"}
data.forms = {"smos"}
data.forms = {"ste"}
data.forms = {"sentou"}
--- *essi "to eat"
elseif mw.ustring.find(stem, "ed$") then
table.insert(data.info, "athematic present")
data.forms = {"etsi"}
data.forms = {"essi"}
data.forms = {"essesi"}
data.forms = {"(e)denti"}
data.forms = {"?"}
data.forms = {"?"}
data.forms = {"?"}
data.forms = {"?"}
data.forms = {"?"}
data.forms = {"?"}
data.forms = {"?"}
data.forms = {"?"}
data.forms = {"?"}
data.forms = {"?"}
data.forms = {"?"}
data.forms = {"?"}
data.forms = {"?"}
data.forms = {"?"}
data.forms = {"?"}
data.forms = {"?"}
data.forms = {"?"}
else
stem = "?"
end
-- Non-finite forms, do not use
data.forms = {stem .. "nts"}
data.forms = {stem .. "mnos"}
end
local function future(data, stem)
if not stem then
stem = "?"
elseif stem == "-" then
return
end
data.forms = {stem .. "sū"}
data.forms = {stem .. "sesi"}
data.forms = {stem .. "seti"}
data.forms = {stem .. "somosi"}
data.forms = {stem .. "setesi"}
data.forms = {stem .. "sonti"}
data.forms = {stem .. "sūr"}
data.forms = {stem .. "setar"}
data.forms = {stem .. "setor"}
data.forms = {stem .. "sommor"}
data.forms = {stem .. "sedwe"}
data.forms = {stem .. "sontor"}
end
local function preterite_actv(data, stem)
if not stem then
stem = "?"
elseif stem == "-" then
return
end
-- t-preterite
if mw.ustring.find(stem, "<t>$") then
stem_t = string.sub(stem, 1, -4)
stem_t2 = mw.ustring.gsub(stem_t, "$", { = "x", = "x", = "x", = "x", = "n"})
table.insert(data.info, "t-preterite")
data.forms = {stem_t .. "am"}
data.forms = {stem_t2 .. "s" or stem_t .. "s"}
data.forms = {stem_t2 .. "t" or stem_t .. "t"}
data.forms = {stem_t .. "me"}
data.forms = {stem_t2 .. "te" or stem_t .. "te"}
data.forms = {stem_t .. "ant"}
-- s-preterite
elseif mw.ustring.find(stem, "<st>$") then
stem_s = string.sub(stem, 1, -5)
table.insert(data.info, "s-preterite")
data.forms = {stem_s .. "am"}
data.forms = {stem_s .. "s"}
data.forms = {stem_s .. "t"}
data.forms = {stem_s .. "me"}
data.forms = {stem_s .. "te"}
data.forms = {stem_s .. "ant"}
--- For *dāti "give"
elseif mw.ustring.find(stem, "<oh>$") then
stem_oh = string.sub(stem, 1, -5)
table.insert(data.info, "suffixless preterite")
data.forms = {stem_oh .. "ū"}
data.forms = {stem_oh .. "ūs"}
data.forms = {stem_oh .. "ū"}
data.forms = {stem_oh .. "amo"}
data.forms = {stem_oh .. "ate"}
data.forms = {stem_oh .. "ar"}
--- For *kerat "fell"
elseif mw.ustring.find(stem, "<at>$") then
stem_at = string.sub(stem, 1, -5)
table.insert(data.info, "root aorist")
data.forms = {stem_at .. "am"}
data.forms = {stem_at .. "as"}
data.forms = {stem_at .. "at"}
data.forms = {stem_at .. "ame"}
data.forms = {stem_at .. "ate"}
data.forms = {stem_at .. "ant"}
--- Stative endings as default
else
table.insert(data.info, "suffixless preterite")
stem_2pl = mw.ustring.gsub(stem, "$", { = "xt", = "xt", = "xt", = "xt", = "nt", = "ss", = "ss"})
data.forms = {stem .. "a"}
data.forms = {stem .. "as?"}
data.forms = {stem .. "e"}
data.forms = {stem .. "mo"}
data.forms = {stem_2pl .. "e"}
data.forms = {stem .. "ar"}
end
end
local function subjunctive(data, stem)
if not stem then
stem = "?"
elseif stem == "-" then
return
end
data.forms = {stem .. "ū"}
data.forms = {stem .. "esi"}
data.forms = {stem .. "eti"}
data.forms = {stem .. "omosi"}
data.forms = {stem .. "etesi"}
data.forms = {stem .. "onti"}
data.forms = {stem .. "ūr"}
data.forms = {stem .. "etar"}
data.forms = {stem .. "etor"}
data.forms = {stem .. "ommor"}
data.forms = {stem .. "edwe"}
data.forms = {stem .. "ontor"}
data.forms = {"?"}
data.forms = {"?"}
data.forms = {"?"}
data.forms = {"?"}
data.forms = {"?"}
data.forms = {"?"}
end
-- Inflection functions
export = function(frame)
local params = {
= {},
= {},
= {},
= {allow_holes = true},
= {},
= {},
}
local args = require("Module:parameters").process(frame:getParent().args, params)
local data = {forms = {}, info = {}, categories = {}}
present(data, args)
future(data, args)
preterite_actv(data, args)
subjunctive(data, args)
data.info = table.concat(data.info, ", ")
postprocess(args, data)
return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end
local names = {
= "Active voice",
= "Passive voice",
= "Present",
= "Imperfect",
= "Future",
= "Preterite",
= "Pres. subjunctive",
= "Past subjunctive",
= "Imperative",
= "1st singular",
= "2nd singular",
= "3rd singular",
= "1st plural",
= "2nd plural",
= "3rd plural",
}
-- Make the table
function make_table(data)
local function repl(param)
if param == "info" then
return mw.getContentLanguage():ucfirst(data.info or "")
end
local form = data.forms
if not form or #form == 0 then
return "—"
end
if mw.ustring.find(form, "^?") then
return "?"
end
local ret = {}
for key, subform in ipairs(form) do
table.insert(ret, m_links.full_link({lang = lang, alt = "*" .. subform}))
end
return table.concat(ret, ", ")
end
local pns = {"1sg", "2sg", "3sg", "1pl", "2pl", "3pl"}
local rows = {
{"pres_indc", "impf_indc", "futr_indc", "pret_indc"},
{"pres_subj", "past_subj", "impr"}}
local voices = {}
if data.actv then
table.insert(voices, "actv")
end
if data.pasv then
table.insert(voices, "pasv")
end
local colnum = 0
for _, row in ipairs(rows) do
colnum = math.max(colnum, #row)
end
local wikicode = {}
table.insert(wikicode, "{| class=\"inflection-table vsSwitcher\" data-toggle-category=\"inflection\" style=\"background: #FAFAFA; border: 1px solid #d0d0d0; text-align: left;\" cellspacing=\"1\" cellpadding=\"2\"")
table.insert(wikicode, "|- style=\"background: #CCCCFF;\"\n! class=\"vsToggleElement\" colspan=\"" .. (colnum + 1) .. "\" | {{{info}}}")
for _, voice in ipairs(voices) do
table.insert(wikicode, "|- class=\"vsHide\" style=\"background: #CCCCFF;\"")
table.insert(wikicode, "! colspan=\"" .. (colnum + 1) .. "\" style=\"text-align: center;\" | " .. names)
for _, row in ipairs(rows) do
table.insert(wikicode, "|- class=\"vsHide\" style=\"background: #CCCCFF;\"")
table.insert(wikicode, "!")
local i = 0
for _, tm in ipairs(row) do
table.insert(wikicode, "! style=\"min-width: 11em; background: #CCCCFF;\" | " .. names)
i = i + 1
end
if i < colnum then
table.insert(wikicode, "! style=\"min-width: 11em; background: #CCCCFF;\" rowspan=\"" .. (#pns + 1) .. "\" colspan=\"" .. (colnum - i) .. "\" |")
end
for _, pn in ipairs(pns) do
table.insert(wikicode, "|- class=\"vsHide\" style=\"background-color: #F2F2FF;\"")
table.insert(wikicode, "! style=\"min-width: 8em; background-color: #E6E6FF;\" | " .. names)
for _, tm in ipairs(row) do
table.insert(wikicode, "| {{{" .. voice .. "_" .. tm .. "_" .. pn .. "}}}")
end
end
end
end
table.insert(wikicode, "|}")
wikicode = table.concat(wikicode, "\n")
return (mw.ustring.gsub(wikicode, "{{{(+)}}}", repl))
end
return export