local export = {}
local lang = require("Module:languages").getByCode("sle")
local consonants = {
["ಕ"] = "k",
["ಖ"] = "kʰ",
["ಗ"] = "ɡ",
["ಘ"] = "ɡʱ",
["ಙ"] = "ŋ",
["ಚ"] = "t͡ʃ",
["ಛ"] = "t͡ʃʰ",
["ಜ"] = "d͡ʒ",
["ಝ"] = "d͡ʒʱ",
["ಞ"] = "ɲ",
["ಟ"] = "ʈ",
["ಠ"] = "ʈʰ",
["ಡ"] = "ɖ",
["ಢ"] = "ɖʱ",
["ಣ"] = "ɳ",
["ತ"] = "t̪",
["ಥ"] = "t̪ʰ",
["ದ"] = "d̪",
["ಧ"] = "d̪ʱ",
["ನ"] = "n̪",
["ಪ"] = "p",
["ಫ"] = "pʰ",
["ಬ"] = "b",
["ಭ"] = "bʱ",
["ಮ"] = "m",
["ಯ"] = "j",
["ರ"] = "ɾ",
["ಲ"] = "l",
["ವ"] = "ʋ",
["ಶ"] = "ʃ",
["ಷ"] = "ʂ",
["ಸ"] = "s",
["ಹ"] = "h",
["ಳ"] = "ɭ",
["ೞ"] = "ɻ",
["ಱ"] = "r",
}
local vowel_diacritics = {
["ಾ"] = "aː",
["ಿ"] = "i",
["ೀ"] = "iː",
["ು"] = "u",
["ೂ"] = "uː",
["ೃ"] = "ɾi",
["ೄ"] = "ɾiː",
["ೢ"] = "li",
["ೣ"] = "liː",
["ೆ"] = "e",
["ೇ"] = "eː",
["ೈ"] = "ɐi̯",
["ೊ"] = "o",
["ೋ"] = "oː",
["ೌ"] = "ɐu̯",
["್"] = "", -- Virama - suppresses the inherent vowel "a"
[""] = "ɐ", -- No diacritic; inherent vowel
}
local other = {
-- independent vowels
["ಅ"] = "ɐ",
["ಆ"] = "aː",
["ಇ"] = "i",
["ಈ"] = "iː",
["ಉ"] = "u",
["ಊ"] = "uː",
["ಋ"] = "ɾi",
["ೠ"] = "ɾiː",
["ಌ"] = "li",
["ೡ"] = "liː",
["ಎ"] = "e",
["ಏ"] = "eː",
["ಐ"] = "ɐi̯",
["ಒ"] = "o",
["ಓ"] = "oː",
["ಔ"] = "ɐu̯",
-- Other symbols
["ಂ"] = "m̃",
["ಃ"] = "h",
["ೝ"] = "n",
["ಽ"] = "",
}
local adjust1 = {
-- Assimilate the anusvara
["m̃([kɡŋ])"] = "ŋ%1",
["m̃([td]͡[ʃʒ])"] = "ɲ%1",
["m̃(ɲ)"] = "ɲ%1",
["m̃([ʈɖɳ])"] = "ɳ%1",
["m̃([td]̪)"] = "n̪%1",
["m̃([td]͡[sz])"] = "n̪%1",
["m̃(n̪)"] = "n̪%1",
["m̃([pbmjɾlʋʃʂshɭ])"] = "m%1",
["m̃([%s%p])"] = "m%1",
["m̃$"] = "m",
}
local adjust2 = {
-- Account for differences in phonemes vs. phones
}
function export.to_IPA(text)
text = mw.ustring.gsub(text, "([ಕ-ಹ])(಼?)([ಾ-್]?)", function(c, n, d)
return ((consonants[c .. n] or consonants[c]) or c) .. vowel_diacritics[d]
end)
text = mw.ustring.gsub(text, "[ಂ-ೡ]", other)
for k, v in pairs(adjust1) do
text = mw.ustring.gsub(text, k, v)
end
-- If an independent vowel is after another vowel, assume diphthong
text = mw.ustring.gsub(text, "([ɐaeiou]ː?)•", "%1")
-- Phonetic transcription
text2 = text
for k, v in pairs(adjust2) do
text2 = mw.ustring.gsub(text2, k, v)
end
return (text == text2 and { text } or { text, text2 })
end
function export.show(frame)
local args = frame:getParent().args
local page_title = mw.title.getCurrentTitle().text
local text = args[1] or page_title
local qualifier = args["q"] or nil
local transcriptions = export.to_IPA(text)
local IPA_text
if not transcriptions[2] then
IPA_text = require("Module:IPA").format_IPA_full({
lang = lang,
items = { { pron = "/" .. transcriptions[1] .. "/" } },
})
else
IPA_text = require("Module:IPA").format_IPA_full({
lang = lang,
items = { { pron = "/" .. transcriptions[1] .. "/" }, { pron = "[" .. transcriptions[2] .. "]" } },
})
end
return "* " .. (qualifier and require("Module:qualifier").format_qualifier({ qualifier }) .. " " or "") .. IPA_text
end
return export