local export = {}
local langdata = {
consonant = {
"^(.-[aâeouyäáAÂEOUYÄÁ])([iI][^aâeiouyäáAÂEIOUÄÁ{}-]*)$",
"^(.-)([^aâeiouyäáAÂEIOUYÄÁ{}-]*)$",
},
vowel = {
"^(.-)(aa)$",
"^(.-)(ee)$",
"^(.-)(i[eiä])$",
"^(.-)(oo)$",
"^(.-)(u[ouá])$",
"^(.-)(ye)$",
"^(.-)(ää)$",
"^(.-)(áá)$",
"^(.-)([aâeiouyäá]?)$",
},
scons = {
[1] = {
},
[2] = {
{"^([đjlmnŋrv])" .. mw.ustring.char(0x0323) .. "$", "%1", "%1ˈ%1"},
{"^n" .. mw.ustring.char(0x0323) .. "j$", "nj", "nˈnj"},
{"^c$", "s", "cˈc"},
{"^č$", "j" .. mw.ustring.char(0x0323), "čˈč"},
{"^h$", "v" .. mw.ustring.char(0x0323), "kˈk"},
{"^p$", "v", "pˈp"},
{"^s$", "s", "sˈs"},
{"^š$", "š", "šˈš"},
{"^t$", "đ", "tˈt"},
},
[3] = {
{"^([bdgzž])ˈ%1$", "%1"},
{"^tˈk$", "đh"},
{"^([jlnr])ˈ(c)%2$", "%1%2"},
{"^([lr])ˈ(č)%2$", "%1%2"},
{"^([jlŋrv])ˈ(k)%2$", "%1h"},
{"^([lmrv])ˈ(p)%2$", "%1%2"},
--{"^([lnr])ˈ(s)%2$", "%1%2"},
--{"^([lr])ˈ(š)%2$", "%1%2"},
{"^([jlnr])ˈ(t)%2$", "%1%2"},
{"^hˈ([č])$", "v%1"},
{"^([^b])ˈ(b)$", "%1%2"},
{"^([^d])ˈ(d)$", "%1%2"},
{"^([^g])ˈ(g)$", "%1%2"},
{"^([^jn])ˈ(j)$", "%1%2"},
{"^([s])ˈ(k)$", "%1%2"},
{"^([^l])ˈ(l)$", "%1%2"},
{"^([^m])ˈ(m)$", "%1%2"},
{"^([^n])ˈ(n)$", "%1%2"},
{"^([^r])ˈ(r)$", "%1%2"},
--{"^([^š])ˈ(š)$", "%1%2"},
{"^([ps])ˈ(t)$", "%1%2"},
{"^([^v])ˈ(v)$", "%1%2"},
{"^([^z])ˈ(z)$", "%1%2"},
{"^([^ž])ˈ(ž)$", "%1%2"},
{"^(v)ˈ(sk)$", "%1%2"},
},
},
vowel_variants = {
normal = { ["e"] = {"e", "Q" }, ["o"] = {"o", "Q" }, },
per = {["â"] = {"â", "G" }, ["e"] = {"ee", "QG"}, ["i"] = {"i", "G" }, ["o"] = {"oo", "QG"}, ["u"] = {"u", "G" }, ["á"] = {"á", "G" }},
ill_sg = {["â"] = {"â", "D" }, ["e"] = {"á", "EAQD"}, ["i"] = {"á", "EAD" }, ["o"] = {"o", "QD"}, ["u"] = {"u", "D" }, ["á"] = {"á", "D" }},
loc_sg = { ["e"] = {"ee", "GS"}, ["o"] = {"oo", "GS"} },
com_sg = {["â"] = {"á", "GS" }, ["e"] = {"i", "EIGS"}, ["i"] = {"i", "EIGS"}, ["o"] = {"o", "QGS" }, ["u"] = {"o", "GS"}, ["á"] = {"á", "GS"}},
abe_sg = {["â"] = {"â", "S" }, ["e"] = {"e", "Q"}, ["i"] = {"i", "S" }, ["o"] = {"o", "Q" }, ["u"] = {"u", "S" }, ["á"] = {"á", "S" }},
nom_pl = {["â"] = {"a" }, ["e"] = {"e", "Q"}, ["o"] = {"o", "Q" }, },
acc_pl = { ["e"] = {"i", "EI"}, ["i"] = {"i", "EI" }, ["o"] = {"o", "Q" }, },
abe_pl = {["â"] = {"â", "S" }, ["e"] = {"i", "EIS"}, ["i"] = {"i", "EIS" }, ["o"] = {"o", "Q" }, ["u"] = {"u", "S" }, ["á"] = {"á", "S" }},
f3_s_pres_indc = {["â"] = {"á", "AO" } },
f3_p_pres_indc = {["â"] = {"i", "AE" } },
f12_s_past_indc = {["â"] = {"i", "G" } },
f3_p_past_indc = {["â"] = {"ii", "GS" } },
f3_s_impr = {["â"] = {"u", "AO" } },
f1_d_impr = {["â"] = {"oo", "AOGS"} },
f3_dp_impr = {["â"] = {"u", "AOG" } },
potn_conn = {["â"] = {"ii", "S3" } },
j_contr = {["â"] = {"ee", "AEGS"} },
},
preprocess = function(self)
self.scons = mw.ustring.gsub(self.scons, "ḷ", "l" .. mw.ustring.char(0x0323))
self.scons = mw.ustring.gsub(self.scons, "ṃ", "m" .. mw.ustring.char(0x0323))
self.scons = mw.ustring.gsub(self.scons, "ṇ", "n" .. mw.ustring.char(0x0323))
self.scons = mw.ustring.gsub(self.scons, "ṛ", "r" .. mw.ustring.char(0x0323))
self.scons = mw.ustring.gsub(self.scons, "ṿ", "v" .. mw.ustring.char(0x0323))
self.scons = mw.ustring.gsub(self.scons, "i", "j")
-- Add overlong mark after a short vowel
if mw.ustring.len(self.svowel) == 1 then
self.scons = mw.ustring.gsub(self.scons, "^(.)([^" .. mw.ustring.char(0x0323) .. "])", "%1ˈ%2")
end
-- Make all single vowels double
if mw.ustring.len(self.svowel) == 1 then
self.svowel = mw.ustring.gsub(self.svowel, "^(.)$", "%1%1")
end
end,
postprocess = function(self, vowel_effect)
if vowel_effect then
if vowel_effect:find("Q", nil, true) then
if not self.scons:find("ˈ", nil, true) then
self.scons = "ˈ" .. self.scons
end
end
if vowel_effect:find("AO", nil, true) then
if self.svowel == "aa" then
self.svowel = "áá"
elseif self.svowel == "ee" or self.svowel == "ie" then
self.svowel = "iä"
elseif self.svowel == "oo" or self.svowel == "uo" then
self.svowel = "uá"
end
elseif vowel_effect:find("AE", nil, true) then
if self.svowel == "aa" then
self.svowel = "ää"
elseif self.svowel == "oo" then
self.svowel = "uá"
elseif self.svowel == "uo" then
self.svowel = "ye"
elseif self.svowel == "uu" then
self.svowel = "oo"
end
elseif vowel_effect:find("EA", nil, true) then
if self.svowel == "ee" then
self.svowel = "iä"
elseif self.svowel == "ie" then
self.svowel = "iä"
elseif self.svowel == "ye" then
self.svowel = "uá"
elseif self.svowel == "ää" then
self.svowel = "áá"
end
elseif vowel_effect:find("EI", nil, true) then
if self.svowel == "aa" then
self.svowel = "oo"
elseif self.svowel == "oo" then
self.svowel = "uu"
elseif self.svowel == "uá" then
self.svowel = "oo"
elseif self.svowel == "ye" then
self.svowel = "uo"
elseif self.svowel == "ää" then
self.svowel = "aa"
end
end
if vowel_effect:find("D", nil, true) then
if self.quantity == 3 then
self.scons = mw.ustring.gsub(self.scons, "ˈ", "")
end
self.scons = mw.ustring.gsub(self.scons, "([đjlmnŋrv])%1", "%1" .. mw.ustring.char(0x0323))
self.scons = mw.ustring.gsub(self.scons, "(.)%1", "%1")
elseif vowel_effect:find("GS", nil, true) then
if mw.ustring.find(self.scons, "^ˈ?[đjlmnŋrv]" .. mw.ustring.char(0x0323) .. "$") then
self.scons = mw.ustring.gsub(self.scons, "^ˈ?([đjlmnŋrv])" .. mw.ustring.char(0x0323) .. "$", "%1ˈ%1")
elseif mw.ustring.len(self.scons) > 1 and not self.scons:find("ˈ", nil, true) or mw.ustring.find(self.scons, "^[bcčdghptzž]$") or (mw.ustring.find(self.scons, "^[sš]$") and self.quantity > 1) then
if mw.ustring.find(self.scons, "^[bcčdghpsštzž]$") or mw.ustring.find(self.scons, "^[^ps][cčpt]$") then
self.scons = mw.ustring.gsub(self.scons, "(.)$", "%1%1")
end
self.scons = mw.ustring.gsub(self.scons, "^(.)", "%1ˈ")
end
elseif vowel_effect:find("G", nil, true) then
if mw.ustring.find(self.scons, "^ˈ?[đjlmnŋrv]" .. mw.ustring.char(0x0323) .. "$") then
self.scons = mw.ustring.gsub(self.scons, "^(ˈ?)([đjlmnŋrv])" .. mw.ustring.char(0x0323) .. "$", "%2%1%2")
elseif mw.ustring.find(self.scons, "^ˈ?[cčpsšt]$") or self.scons == "ˈh" then
self.scons = mw.ustring.gsub(self.scons, "^(ˈ?)(.)$", "%2%1%2")
elseif self.scons == "h" then
self.scons = self.scons .. mw.ustring.char(0x0323)
end
elseif vowel_effect:find("S3", nil, true) then
if self.quantity > 1 and not self.scons:find("ˈ", nil, true) then
self.scons = "ˈ" .. self.scons
end
elseif vowel_effect:find("S", nil, true) then
if not self.scons:find("ˈ", nil, true) then
self.scons = "ˈ" .. self.scons
end
end
end
-- á > a after a
if self.svowel == "aa" then
self.uvowel = self.uvowel:gsub("á", "a")
end
-- Shorten e and o after quantity 3
if self.quantity == 3 then
self.uvowel = mw.ustring.gsub(self.uvowel, "^([eo])%1$", "%1")
end
-- Shorten the vowel if there is an overlong mark
if mw.ustring.find(self.scons, "ˈ") and mw.ustring.find(self.svowel, "^(.)%1$") then
self.svowel = mw.ustring.gsub(self.svowel, "^(.)%1$", "%1")
end
-- Remove the overlong mark after a non-diphthong
if mw.ustring.len(self.svowel) == 1 or mw.ustring.find(self.svowel, "^(.)%1$") then
self.scons = mw.ustring.gsub(self.scons, "ˈ", "")
end
-- Change j to i in ending after a vowel other than i
if self.ucons == "" and not self.uvowel:find("i$") then
self.ending = self.ending:gsub("^j", "i")
end
-- Change j to i in scons after a vowel other than i
if not self.svowel:find("i$") then
self.scons = mw.ustring.gsub(self.scons, "^(ˈ?)j([^" .. mw.ustring.char(0x0323) .. "])", "%1i%2")
end
end,
}
export.Stem = require("Module:smi-common").make_constructor(langdata)
return export