Module:nan-pron-Leizhou

local export = {} local m_string_utils = require("Module:string utilities")

local find = m_string_utils.find local match = m_string_utils.match local split = mw.text.split local gsplit = mw.text.gsplit local gsub = m_string_utils.gsub

local initial_ipa = { ["b"] = "p", ["p"] = "pʰ", ["m"] = "m", ["bh"] = "b", ["d"] = "t", ["t"] = "tʰ", ["n"] = "n", ["l"] = "l", ["g"] = "k", ["k"] = "kʰ", ["ng"] = "ŋ", ["h"] = "h", ["j"] = "t͡s", ["q"] = "t͡sʰ", ["x"] = "s", ["y"] = "z", ["z"] = "t͡s", ["c"] = "t͡sʰ", ["s"] = "s", [""] = "" }

local final_ipa = { ["i"] = "i", ["u"] = "u", ["a"] = "a", ["ia"] = "ia", ["ua"] = "ua", ["o"] = "ɔ", ["io"] = "iɔ", ["e"] = "ɛ", ["ie"] = "iɛ", ["ue"] = "uɛ", ["ai"] = "ai", ["uai"] = "uai", ["ao"] = "au", ["iao"] = "iau", ["eu"] = "ɛu", ["iu"] = "iu", ["oi"] = "ɔi", ["ui"] = "ui", ["am"] = "am", ["iam"] = "iam", ["m"] = "m̩", ["em"] = "em", ["im"] = "im", ["ang"] = "aŋ", ["iang"] = "iaŋ", ["uang"] = "uaŋ", ["eng"] = "eŋ", ["ieng"] = "ieŋ", ["ng"] = "ŋ̍", ["ong"] = "ɔŋ", ["iong"] = "iɔŋ", ["ing"] = "iŋ", ["ung"] = "uŋ", ["ab"] = "ap̚", ["iab"] = "iap̚", ["eb"] = "ep̚", ["ib"] = "ip̚", ["ag"] = "ak̚", ["iag"] = "iak̚", ["uag"] = "uak̚", ["eg"] = "ek̚", ["ieg"] = "iek̚", ["ueg"] = "uek̚", ["ig"] = "ik̚", ["ug"] = "uk̚", ["og"] = "ɔk̚", ["iog"] = "iɔk̚", }

local tone_chao = { ["1"] = "³⁵", ["2"] = "³¹", ["3"] = "²¹", ["4"] = "⁵",	["5"] = "²²", ["6"] = "³³", ["7"] = "⁵⁵", ["8"] = "²" }

-- find the sandhied tone of the first syllable in a two-syllable word -- returns nil if the tone of the first syllable does not change local function tone_sandhi(tone1, tone2) if tone1 == "1" then return "6" elseif (tone1 == "2" and match(tone2, "[1256]")) or (tone1 == "3" and match(tone2, "[123568]")) then return "7" end end

-- convert Leizhounese Pinyin to IPA function export.ipa(text) if type(text) == "table" then text = text.args[1] end local result = {} for word in gsplit(text, "/") do		local syllables = split(word, " ") local initial, final, tone, block, sandhi, ipa = {}, {}, {}, {}, {}, {} for i, syllable in ipairs(syllables) do			initial[i], final[i], tone[i], block[i] = match(syllable, "^([bpmdtnlgkhjqxyzcs]?[hg]?)([aeiou][aeioumnbg]?[iomnbg]?g?)([1-8])(#?)$") -- check z/c/s vs. j/q/x if (find(initial[i], "^[zcs]$") and find(final[i], "^i")) or (find(initial[i], "^[jqx]$") and find(final[i], "^[aeou]")) then error("Invalid Leizhou pinyin input \"" .. syllable .. "\": initial " .. initial[i] .. " cannot go with final " .. final[i] .. ".") end -- check checked tones if (find(final[i], "[^n][bdg]$") and find(tone[i], "^[^48]$")) or ((find(final[i], "[^bdg]$") or find(final[i], "ng$")) and find(tone[i], "^[48]$")) then error("Invalid Leizhou pinyin input \"" .. syllable .. "\": final " .. final[i] .. " cannot go with tone " .. tone[i] .. ".") end end for i=1,#syllables,1 do			if i+1 <= #syllables and block[i] ~= "#" then sandhi[i] = tone_sandhi(tone[i], tone[i+1]) end end for i=1,#syllables,1 do actual_tone = tone_chao[tone[i]] .. (sandhi[i] and "⁻" .. tone_chao[sandhi[i]] or "") ipa[i] = initial_ipa[initial[i]] .. final_ipa[final[i]] .. actual_tone end table.insert(result, table.concat(ipa, " ")) end return "/" .. table.concat(result, "/, /") .. "/" end

function export.rom(text) text = gsub(text, "/", " / ") text = gsub(text, '([1-9-]+)', '%1') return text end

return export