local export = {}
local m_IPA = require("Module:IPA")
local lang = require("Module:languages").getByCode("rsk")
local rsub = mw.ustring.gsub
local rlower = mw.ustring.lower
local rlast = require("Module:string/replace last").replace_last
local phon = {
["а"]="a", ["б"]="b", ["в"]="v", ["г"]="ɦ", ["ґ"]="ɡ",
["д"]="d", ["е"]="ɛ", ["є"]="jɛ", ["ж"]="ʒ", ["з"]="z",
["и"]="i", ["ї"]="ji", ["к"]="k", ["л"]="l", ["м"]="m",
["н"]="n", ["о"]="ɔ", ["п"]="p", ["р"]="r", ["с"]="s",
["т"]="t", ["у"]="u", ["ф"]="f", ["х"]="x", ["ц"]="ts",
["ч"]="tʃ", ["ш"]="ʃ", ["щ"]="ʃtʃ",["ю"]="ju", ["я"]="ja",
["ь"]="ʲ", ["й"]="j",
}
local function phonetic(text)
text = rlower(text)
-- general phonology
text = rsub(text, "тш", "чш")
text = rsub(text, "тс", "цс")
text = rsub(text, ".", phon)
-- palatalisation
text = rsub(text, "([dtln])j([aɛiɔu])", "%1ʲ%2")
-- voicing assimilation
local i = 0
text = rsub(text, "b$", "p")
text = rsub(text, "v$", "f")
text = rsub(text, "d(ʲ?)$", "t%1")
text = rsub(text, "z$", "s")
text = rsub(text, "ʒ$", "ʃ")
text = rsub(text, "ɡ$", "k")
text = rsub(text, "ɦ$", "x")
while i <= 5 do
text = rsub(text, "b([pftsʃkx])", "p%1")
text = rsub(text, "v([pftsʃkx])", "f%1")
text = rsub(text, "d([pftsʃkx])", "t%1")
text = rsub(text, "z([pftsʃkx])", "s%1")
text = rsub(text, "ʒ([pftsʃkx])", "ʃ%1")
text = rsub(text, "ɡ([pftsʃkx])", "k%1")
text = rsub(text, "ɦ([pftsʃkx])", "x%1")
text = rsub(text, "p([bdzʒɡ])", "b%1")
text = rsub(text, "f([bdzʒɡ])", "v%1")
text = rsub(text, "t([bdzʒɡ])", "d%1")
text = rsub(text, "s([bdzʒɡ])", "z%1")
text = rsub(text, "ʃ([bdzʒɡ])", "ʒ%1")
text = rsub(text, "k([bdzʒɡ])", "ɡ%1")
text = rsub(text, "x([bdzʒɡ])", "ɦ%1")
i = i + 1
end
-- palatalisation
text = rsub(text, "([dt])([ln])ʲ", "%1ʲ%2ʲ")
text = rsub(text, "lnʲ", "lʲnʲ")
text = rsub(text, "n([dt])ʲ", "nʲ%1ʲ")
text = rsub(text, "n([dt])([ʃʒ])", "nʲ%1%2")
text = rsub(text, "dʲ", "ɟ")
text = rsub(text, "tʲ", "c")
text = rsub(text, "lʲ", "ʎ")
text = rsub(text, "nʲ", "ɲ")
text = rsub(text, "ʲ", "")
-- stress
text = rlast(text, "([aɛiɔu])", "X%1", 1)
text = rsub(text, "Xa", "A")
text = rsub(text, "Xɛ", "E")
text = rsub(text, "Xi", "I")
text = rsub(text, "Xɔ", "O")
text = rsub(text, "Xu", "U")
text = rlast(text, "([aɛiɔu])", "ˈ%1", 1)
text = rsub(text, "A", "a")
text = rsub(text, "E", "ɛ")
text = rsub(text, "I", "i")
text = rsub(text, "O", "ɔ")
text = rsub(text, "U", "u")
text = rsub(text, "([bvɡdʒzjklmnprstfxɦʃɟcʎɲ])ˈ", "ˈ%1")
text = rsub(text, "tˈ([sʃ])", "ˈt%1")
text = rsub(text, "dˈ([zʒ])", "ˈd%1")
text = rsub(text, "([sʃ])ˈ([pktcfx])", "ˈ%1%2")
text = rsub(text, "([zʒ])ˈ([bɡdɟvɦ])", "ˈ%1%2")
text = rsub(text, "([ptckbdɟɡ])ˈ([mnɲlʎrj])", "ˈ%1%2")
text = rsub(text, "^([bvɡdʒzjklmnprstfxɦʃɟcʎɲ][bvɡdʒzjklmnprstfxɦʃɟcʎɲ]?[bvɡdʒzjklmnprstfxɦʃɟcʎɲ]?)ˈ", "ˈ%1")
-- affricates
text = rsub(text, "tʃ", "t͡ʃ")
text = rsub(text, "dʒ", "d͡ʒ")
text = rsub(text, "ts", "t͡s")
text = rsub(text, "dz", "d͡z")
-- final substitutions
text = rsub(text, "'", "")
text = rsub(text, "n([kɡ])", "ŋ%1")
return text
end
function export.IPA(frame)
local words = {}
for _, word in ipairs(frame:getParent().args) do
table.insert(words, word)
end
if #words == 0 then
words = {mw.title.getCurrentTitle().text}
end
local IPA_results = {}
for _, word in ipairs(words) do
table.insert(IPA_results, { pron = "[" .. phonetic(word) .. "]" })
end
return m_IPA.format_IPA_full(lang, IPA_results)
end
return export