local export = {}
local m_IPA = require("Module:IPA")
local lang = require("Module:languages").getByCode("yux")
local rsub = mw.ustring.gsub
local rlower = mw.ustring.lower
local rlast = require("Module:string/replace last").replace_last
local rfind = mw.ustring.find
local V = "ʲ?[aeiouøəɨɪ]"
local C = "[bvɡʁdʒzjklmnŋprstfqcʃɕɟʎɲyʔ]ʲ?"
local X = "ʲ?[aeiouøəɨɪbvɡʁdʒzjklmnŋprstfqcʃɕɟʎɲyʔ]ʲ?"
local U = "ʲ?[aeiouøɨɪ]"
local phon = {
["а"]="a", ["б"]="b", ["в"]="v", ["г"]="ɡ", ["ҕ"]="ʁ",
["д"]="d", ["е"]="ʲe", ["ж"]="ʒ", ["з"]="z", ["и"]="ɪ",
["й"]="j", ["к"]="k", ["л"]="l", ["м"]="m", ["н"]="n",
["ҥ"]="ŋ", ["о"]="o", ["ө"]="ø", ["п"]="p", ["р"]="r",
["с"]="s", ["т"]="t", ["у"]="u", ["ф"]="f", ["х"]="q",
["ц"]="y", ["ч"]="c", ["ш"]="ʃ", ["щ"]="ɕ", ["ы"]="ɨ",
["ь"]="ʲ", ["э"]="e", ["ю"]="ʲu", ["я"]="ʲa"
}
local function phonetic(text)
text = rlower(text)
text = rsub(text, "([сдлн])%1ь", "%1ь%1ь")
text = rsub(text, "сь", "ɕ")
text = rsub(text, "дь", "ɟ")
text = rsub(text, "ль", "ʎ")
text = rsub(text, "нь", "ɲ")
text = rsub(text, "ɕи", "ɕi")
text = rsub(text, "ɟи", "ɟi")
text = rsub(text, "ʎи", "ʎi")
text = rsub(text, "ɲи", "ɲi")
text = rsub(text, "чи", "чi")
-- general phonology
text = rsub(text, ".", phon)
-- initial glide (borrowings only)
text = rsub(text, "^ʲ", "j")
text = rsub(text, "(" .. V .. ")ʲ", "%1j")
-- stress (1)
text = rsub(text, "(" .. V .. ")(" .. X .. ")$", "ˈ%1%2")
if rfind(text, "ˈ") == nil then
text = rlast(text, "(" .. V .. ")(" .. X .. ")(" .. C .. ")", "ˈ%1%2%3", 1)
end
if rfind(text, "ˈ") == nil then
text = rlast(text, "(" .. U .. ")", "ˈ%1", 1)
end
-- schwa
text = rsub(text, "(" .. C .. ")([eo])$", "%1ə")
-- stress (2)
text = rsub(text, "(" .. V .. ")ˈ(" .. V .. ")", "ˈ%1%2")
text = rsub(text, "(" .. V .. ")(" .. C .. ")ˈ", "%1ˈ%2")
text = rsub(text, "(" .. V .. ")(" .. C .. ")(" .. C .. ")ˈ", "%1%2ˈ%3")
text = rsub(text, "(" .. V .. ")(" .. C .. C .. ")(" .. C .. ")ˈ", "%1%2ˈ%3")
text = rsub(text, "^(" .. C .. ")ˈ", "ˈ%1")
text = rsub(text, "^(" .. C .. C .. ")ˈ", "ˈ%1")
if rfind(text, "^-") ~= nil then
text = rsub(text, "ˈ", "")
end
-- allophones
text = rsub(text, "ŋʁ", "ɴɢ")
text = rsub(text, "(" .. V .. "ˈ?)b(" .. V .. ")", "%1w%2")
text = rsub(text, "(" .. V .. "ˈ?)c(" .. V .. ")", "%1(t)ɕ%2")
text = rsub(text, "(" .. V .. "ˈ?)c$", "%1(t)ɕ")
-- diphthongs
text = rsub(text, "ie", "ie̯")
text = rsub(text, "ɪe", "ie̯")
text = rsub(text, "uo", "uo̯")
text = rsub(text, "uø", "uø̯")
text = rsub(text, "([aeioø])u", "%1u̯")
text = rsub(text, "([aeouø])i", "%1i̯")
text = rsub(text, "(" .. V .. ")j$", "%1i̯")
text = rsub(text, "(" .. V .. ")j(ˈ?" .. C .. ")", "%1i̯%2")
text = rsub(text, "(" .. V .. ")%1", "%1ː")
text = rsub(text, "ɪː", "iː")
text = rsub(text, "iɪ", "iː")
-- affricates
text = rsub(text, "c", "t͡ɕ")
text = rsub(text, "ɟ", "d͡ʑ")
text = rsub(text, "y", "t͡s")
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 = lang, items = IPA_results }
end
return export