Module:yue-pron/Kaiping

-- This module is for 開平話 (Kaiping Yue), a lect of Yue Chinese -- Representative locality: 赤坎 -- Romanisation: Jyutping++ (referred to as jpp below) -- References: -- 1. 开平方言 (2000) by 邓钧

local export = {}

local initials = { b = "p", p = "pʰ",  m = "m",  f = "f", d = "t", t = "tʰ",  n = "n",  sl = "ɬ", l = "l", z = "t͡s", c = "t͡sʰ", s = "s", g = "k", k = "kʰ",  ng = "ŋ", h = "h", j = "j", w = "v", [""] = "", }

local finals = { a="a",ai="ai",au="au",am="am",an="an",ang="aŋ",ap="ap̚",at="at̚",ak="ak̚", e="e",ei="ei",eu="eu",em="em",en="en",        ep="ep̚",et="et̚", ie="iɛ",                           ieng="iɛŋ",               iek="iɛk̚", o="ɔ",oi="ɔi",               on="ɔn",ong="ɔŋ",        ot="ɔt̚",ok="ɔk̚", uo="uɔ", i="i",       iu="iu",im="im",["in"]="in",     ip="ip̚",it="it̚", u="u", ui="ui",              un="un", ung="ʊŋ",       ut="ut̚", uk="ʊk̚", m="m̩", ng="ŋ̍", }

-- "3" merges into "1" local tones = { ["1"] = "33", --陰平/陰去/下陰入 ["2"] = "55", --陰上/上陰入 ["4"] = "22", --陽平 ["5"] = "21", --陽上 ["6"] = "32", --陽去/陽入 }

local sandhi = { ["1*"]="35", ["4*"]="15", ["5*"]="215", ["6*"]="325",	["1-2"]="55", ["4-2"]="55", ["5-2"]="55", ["6-2"]="55",	["1-5"]="21", ["2-5"]="21", ["4-5"]="21", ["6-5"]="21",	["1-5*"]="215", ["2-5*"]="215", ["4-5*"]="215", ["6-5*"]="215", }

local function tone_superscript(text) return text:gsub("[1235]",{["1"]="¹",["2"]="²",["3"]="³",["5"]="⁵"}) end

local function validate(text) text = text:gsub(","," ") if text:sub(1,1) == " " or text:sub(-1,-1) == " " or text:match(" ") then error("Kaiping: Empty syllable detected.") end end

function export.jpp_to_ipa(text) validate(text) text = text:gsub("[^ ,]+",function(syllable)		local a,b,c,d = syllable:match("^([bpmfdtnlzcsgknhjw]?[lg]?)([aeioumn]%l*)([12456])(%-?[25]?%*?)$")		if not a then			error("Kaiping: Invalid syllable: " .. syllable)		end		return (initials[a] or error("Kaiping: Unrecognised initial: " .. a))			.. (finals[b] or error("Kaiping: Unrecognised final: " .. b))			.. tones[c]			.. (d~="" and ("⁻"..(sandhi[c..d] or error("Kaiping: Unrecognised tone sandhi: " .. (c..d)))) or "")	end) :gsub(",", "/, /") return "/" .. tone_superscript(text) .. "/" end

return export