Module:shn-pron

local export = {} local PAGENAME = mw.title.getCurrentTitle.text local lang = require("Module:languages").getByCode("shn")

local initials = { ['ၵ'] = 'k', ['ၶ'] = 'kʰ', ['ၷ'] = 'ɡ', ['င'] = 'ŋ', ['ၸ'] = 't͡ɕ', ['ၹ'] = 'z', ['ၺ'] = 'ɲ', ['တ'] = 't', ['ထ'] = 'tʰ', ['ၻ'] = 'd', ['ၼ'] = 'n', ['ပ'] = 'p', ['ၽ'] = 'pʰ', ['ၾ'] = 'f', ['ၿ'] = 'b', ['မ'] = 'm', ['ယ'] = 'j', ['ရ'] = 'r', ['လ'] = 'l', ['ဝ'] = 'w', ['ႀ'] = 'θ', ['သ'] = 'sʰ', ['ႁ'] = 'h', ['ဢ'] = 'ʔ', ['သျ'] = 'ʃ', ['ၵျ'] = 'd͡ʑ', ['ၶျ'] = 't͡ɕʰ', }

local medials = { [] = , ['ျ'] = 'j', ['ြ'] = 'r', ['ႂ'] = 'w', }

local vowels = { [''] = 'a', ['ၢ'] = 'aː', ['ႃ'] = 'aː', ['ိ'] = 'i', ['ီ'] = 'iː', ['ု'] = 'u', ['ူ'] = 'uː', ['ူ*'] = 'o', ['ေ'] = 'eː', ['ဵ'] = 'e', ['ႄ'] = 'ɛː', ['ႅ'] = 'ɛ', ['ွ'] = 'ɔ', ['ဝ်'] = 'aw', ['ၢဝ်'] = 'aːw', ['ိဝ်'] = 'iw', ['ဵဝ်'] = 'ew', ['ႅဝ်'] = 'ɛw', ['ို'] = 'ɯ', ['ိုဝ်'] = 'ɯː', ['ိူ'] = 'ɤ', ['ိူဝ်'] = 'ɤː', ['ူဝ်'] = 'oː', ['ေႃ'] = 'ɔː', ['ႂ်'] = 'aɰ', ['ွႃ'] = 'ɔ̯aː', -- rare e.g. ငွႃႉ / တွႃး / တွႃႇရႃႉ / တွႃႉ / ၵွႃႇ / ၸွႃ / ၸီးပွႃးယေး / except ၵျွႃး = ၵျႃး ['!'] = '', -- pure consonant sound }

local finals = { [] = , ['ၵ်'] = 'k̚', ['င်'] = 'ŋ', ['တ်'] = 't̚', ['ၼ်'] = 'n', ['ပ်'] = 'p̚', ['မ်'] = 'm', ['ၺ်'] = 'j', }

local tones = { [''] = '˨˦', ['ႇ'] = '˩', ['ႈ'] = '˧˧˨', ['း'] = '˥', ['ႉ'] = '˦˨ˀ', ['ႊ'] = '˧', ['x'] = '', -- no tone for ! }

function export.show(frame)

local args = frame:getParent.args local text = args[1] or PAGENAME -- supports only one pronunciation local debug = args['d'] or nil local qualifier = args['q'] or nil local audioFile = args['a'] or args['audio'] or nil -- not to use the expensive 'exists' property local ipa = {} local rhyme

for syl in mw.text.gsplit(text, '[ %.%-]') do		syl = mw.ustring.gsub(syl, 'ႆ', 'ၺ်') -- for easier detection local i, m, v, f, t = mw.ustring.match(syl,			'^([ၵၶၷငၸၹၺတထၻၼပၽၾၿမယရလဝႀသႁဢ])([ျြႂ]?)([ၢႃိီုူေဵႄႅွဝ်!]*)([ၵငတၼပမၺ်]*)([ႇႈးႉႊx]?)$') if not i then error("Pattern did not match the syllable " .. tostring(syl) .. ".") end if i == 'သ' and m == 'ျ' then i = 'သျ' m = '' end if i == 'ၵ' and m == 'ျ' then i = 'ၵျ' m = '' end if i == 'ၶ' and m == 'ျ' then i = 'ၶျ' m = '' end if m == 'ႂ' and v == '်' then m = '' v = 'ႂ်' end if v == 'ူ' and f ~= '' then v = 'ူ*' end if v == '!' then t = 'x'		end if debug then table.insert(ipa, '['..(i or '-')..']['..(m or '-')..']['..(v or '-')..']['..(f or '-')..']['..(t or '-')..']') else local missing for _, part in pairs { { 'initial', initials, i }, { 'medial', medials, m }, { 'vowel', vowels, v }, { 'final', finals, f }, { 'tone', tones, t }, } do				if not part[2][part[3]] then missing = missing or require 'Module:array' table.insert(missing, part) end end if missing then error('Data for '					.. missing						:map( function (part) return part[1] .. ' (' .. tostring(part[3]) .. ')' end)						:concat(', ') .. (missing[2] and ' are' or ' is')					.. ' missing.') end table.insert(ipa, initials[i] .. medials[m] .. vowels[v] .. finals[f] .. tones[t]) rhyme = vowels[v] .. finals[f] -- This is meant to overwrite previous syllable. end end

return "* " .. (qualifier and require("Module:qualifier").format_qualifier({qualifier}) .. " " or "") .. require("Module:IPA").format_IPA_full { lang = lang, items = } .. "\n" .. (audioFile and "*" .. require("Module:audio").format_audio { lang = lang, file = audioFile } .. "\n" or "") .. (rhyme and "*" .. require("Module:rhymes").format_rhymes { lang = lang, rhymes = } or "") .. (#ipa > 0 and require("Module:utilities").format_categories({"Shan " .. #ipa .. "-syllable words"}, lang) or "") end

return export