Module:csp-pron

From Wiktionary, the free dictionary
Jump to navigation Jump to search

Module handling Nanning Pinghua romanisation and IPA for {{zh-pron}}. See Cat:Nanning Pinghua

Testcases

[edit]

-- This module is for 南寧平話 (Nanning Pinghua)
-- Not to be confused with 南寧白話, which is more like Cantonese
-- Representative variety: 亭子
-- Romanisation: Jyutping++ (referred to as jpp below)
-- References:
-- 1. 南宁平话词典 by 覃远雄 et al. (1997)
-- 2. https://leimaau.github.io/book/PHONETICIZE_bingwaa.html
-- 3. 广西通志·汉语方言志 (1998)
-- Also see [[Category:Nanning Pinghua]]

local export = {}

local initials = {
	b = "p",  p = "pʰ",  m = "m",  f = "f",           w = "β",
	d = "t",  t = "tʰ",  n = "n",  l = "l",
	z = "t͡s", c = "t͡sʰ", nj = "ɲ", s = "s", sl = "ɬ", j = "j",
	g = "k",  k = "kʰ",  ng = "ŋ", h = "h",
	gw = "kʷ", kw = "kʰʷ",
	[""] = "", -- glottal stop?
}

-- Notes:
-- iang="iɐŋ", iak="iɐk̚" in the same row as <e>
-- ing="ɪŋ", ik="ɪk̚" in the same row as <i>
-- ung="ʊŋ", uk="ʊk̚" in the same row as <u>
local finals = {
	aa="a", aai="ai", aau="au", aam="am", aan="an", aang="aŋ", aap="ap̚", aat="at̚", aak="ak̚",
	         ai="əi",  au="əu",  am="əm",  an="ən",  ang="əŋ",  ap="əp̚",  at="ət̚",  ak="ək̚",
	 e="e",            eu="eu",  em="em",  en="en", iang="iɐŋ", ep="ep̚",  et="et̚", iak="iɐk̚",
	 o="o",                                on="on",                       ot="ot̚",
	 i="i",            iu="iu",im="im",["in"]="in",  ing="ɪŋ",  ip="ip̚",  it="it̚",  ik="ɪk̚",
	 u="u",  ui="ui",                      un="un",  ung="ʊŋ",            ut="ut̚",  uk="ʊk̚",
	yu="y",                               yun="yun",                     yut="yut̚",
	oe="ø",                                         oeng="øŋ",                     oek="øk̚",
}

local syllabics = {
	ng = "ŋ̍"
}

local tones = {
	["1"] = "⁵³", -- 陰平(詩)
	["2"] = "³³", -- 陰上(屎) / 下陰入(得)
	["3"] = "⁵⁵", -- 陰去(世) / 上陰入(粒)
	["4"] = "²¹", -- 陽平(時)
	["5"] = "²⁴", -- 陽上(市) / 上陽入(劣)
	["6"] = "²²", -- 陽去(是) / 下陽入(絕)
}

function export.jpp_to_ipa(text)
	text = text:gsub(", "," ")
	if text:find("^ ") or text:find(" $") or text:find(" ,") or text:find(",,") or text:find("  ") then
		error("Empty syllable detected.")
	end
	return "/" .. text:gsub("[^ ,]+", function(syllable_tone)
		syl, tone = syllable_tone:match("^(%w+)([1-6])$")
		if not syl then
			error("Invalid syllable: " .. syllable_tone)
		end
		tone = tones[tone]
		if syllabics[syl] then
			return syllabics[syl] .. tone
		end
		initial, final = syl:match("^([bpmfwdtnlzcjsgkh]*)([aeiouy]+[mnptk]?g?)$")
		if not initial then
			error("Invalid syllable: " .. syllable_tone)
		end
		return (initials[initial] or error("Invalid initial: " .. syllable_tone))
			.. (finals[final] or error("Invalid final: " .. syllable_tone))
			.. tone
	end):gsub(",","/, /") .. "/"
end

return export