diff --git a/langjin.js b/langjin.js index 8d09a0a..3d9b077 100644 --- a/langjin.js +++ b/langjin.js @@ -9,12 +9,11 @@ */ /** @type { 音韻地位['屬於'] } */ -const is = (x) => 音韻地位.屬於(x); +const is = (...x) => 音韻地位.屬於(...x); /** @type { 音韻地位['判斷'] } */ const when = (...x) => 音韻地位.判斷(...x); if (!音韻地位) return [ - //['$legacy', true], ['標調方式', [1, '數字', '附標']], ['書寫系統', [1, '拼音方案', '國際音標']], ]; @@ -46,26 +45,13 @@ const 附標標調 = { }; const 調值標調 = { - '陰平':'˧˩', - '陽平':'˩˧', - '上聲':'˨˩˨', - '去聲':'˦˦', - '入聲':'˥', + '陰平': '˧˩', + '陽平': '˩˧', + '上聲': '˨˩˨', + '去聲': '˦˦', + '入聲': '˥', }; -let 真韻 = '真'; -let 殷韻 = '殷'; -let 重紐 = ''; -let 丙類 = 'C類'; - -if (window.location.href.includes('qieyun')) -{//舊版 - 真韻 = '眞'; - 殷韻 = '欣'; - 重紐 = '重紐'; - 丙類 = '東韻 三等 或 鍾微虞廢文元陽尤凡韻'; -} - const 不顎化 = { // 見溪羣曉匣母不顎化條件 一: true, 二: '合口 或 庚耕韻', @@ -73,13 +59,13 @@ const 不顎化 = { // 見溪羣曉匣母不顎化條件 四: '合口 齊韻', }[音韻地位.等]; -const 南京型莊組變翹 = '宕假效江攝 或 止攝 合口 或 蟹咸山攝 二等' +const 南京型莊組變翹 = '宕假效江攝 或 止攝 合口 或 蟹咸山攝 二等'; const 聲母規則 = () => when([ - ['幫母', [[丙類, 'f'], ['', 'b']]], - ['滂母', [[丙類, 'f'], ['', 'p']]], - ['並母', [[丙類, 'f'], ['平聲', 'p'], ['', 'b']]], - ['明母', [['東尤韻', 'm'], [丙類, ''], ['', 'm']]], + ['幫母', [['C類', 'f'], ['', 'b']]], + ['滂母', [['C類', 'f'], ['', 'p']]], + ['並母', [['C類', 'f'], ['平聲', 'p'], ['', 'b']]], + ['明母', [['東尤韻', 'm'], ['C類', ''], ['', 'm']]], ['端母', 'd'], ['透母', 't'], ['定母', [['平聲', 't'], ['', 'd']]], @@ -104,15 +90,15 @@ const 聲母規則 = () => when([ ['俟母', [['平聲', 'c'], ['', 's']]], // 平送氣仄不送氣 ['章母', 'zh'], ['昌母', 'ch'], - ['常母', [['曾攝 入聲', 'zh'], [真韻 + '齊侵清仙鹽陽尤魚虞蒸支鍾韻 平聲 或 一等', 'ch'], ['', 'sh']]], + ['常母', [['曾攝 入聲', 'zh'], ['真齊侵清仙鹽陽尤魚虞蒸支鍾韻 平聲 或 一等', 'ch'], ['', 'sh']]], ['船書母', [['平聲 通攝 或 平聲 合口 山攝', 'ch'], ['', 'sh']]], // 章組擦音分化律 - ['日母', [['四等', 'l'], [真韻 + '侵韻 入聲 或 支之脂韻 開口', ''], ['', 'r']]], + ['日母', [['四等', 'l'], ['真侵韻 入聲 或 支之脂韻 開口', ''], ['', 'r']]], ['見母', [[不顎化, 'g'], ['', 'j']]], ['溪母', [[不顎化, 'k'], ['', 'q']]], ['羣母', [ - [重紐 + 'A類 宵韻', 'q'], - ['平聲 三等 合口 山陽脂韻','k'], - ['平聲','q'], [不顎化, 'g'], + ['A類 宵韻', 'q'], + ['平聲 三等 合口 山陽脂韻', 'k'], + ['平聲', 'q'], [不顎化, 'g'], ['', 'j'] ]], ['疑母', [['之韻 上聲', 'l'], ['一二等', ''], ['尤蒸齊韻 平聲 或 先仙陽庚韻 入聲', 'l'], ['', '']]], @@ -142,14 +128,11 @@ const 韻母規則 = () => when([ // 止攝 ['止攝', [ - [重紐 + 'B類 支韻 幫母 或 ' + - 重紐 + 'B類 支韻 並母 上去聲 或 ' + - 重紐 + 'B類 脂韻 並滂母 或 ' + - 重紐 + 'B類 脂韻 幫母 平聲', - 'ei'], + ['B類 支韻 (幫母 或 並母 上去聲)', 'ei'], + ['B類 脂韻 (幫母 平聲 或 並滂母)', 'ei'], ['日母 開口', 'er'], - ['崇初從精清生俟邪心莊母 開口', 'y'],//南京型平翹 - ['昌常徹澄船書章知母 開口', 'r'],//南京型平翹 + ['崇初從精清生俟邪心莊母 開口', 'y'], // 南京型平翹 + ['昌常徹澄船書章知母 開口', 'r'], // 南京型平翹 ['莊組 合口', 'uä'], ['幫並滂母 非 微韻 或 開口 或 支韻 明母', 'i'], ['脂韻 明母 或 微韻 幫並滂母', 'ei'], @@ -168,8 +151,8 @@ const 韻母規則 = () => when([ ['祭韻 幫組', 'i'], ['合口', 'uei'], ['廢祭韻 開口', [ - ['章知組', 'r'], //南京型平翹 - ['莊組', 'y'], //南京型平翹 + ['章知組', 'r'], // 南京型平翹 + ['莊組', 'y'], // 南京型平翹 ['', 'i'] ]], ['灰泰韻 開口 以母', 'iä'], @@ -185,16 +168,16 @@ const 韻母規則 = () => when([ ['咍韻', [['合口', 'uei'], ['以母', 'iä'], ['', 'ä']]], // 臻攝 - [殷韻 + 真韻 + '臻文韻', [ + ['殷真臻文韻', [ ['入聲', [ ['幫組', [['文韻', 'u'], ['', 'i']]], ['開口', [['莊組', 'ä'], ['章組 或 知徹澄日母', 'r'], ['', 'i']]], ['合口', [['莊組', 'o'], ['知章組', 'u'], ['', 'ü']]] ]], ['舒聲', [ - ['幫組', [[真韻 + '韻', 'in'], ['明母', 'uen'], ['', 'en']]], + ['幫組', [['真韻', 'in'], ['明母', 'uen'], ['', 'en']]], ['開口', [['莊章組 或 日知徹澄母', 'en'], ['', 'in']]], - ['合口',[['明母', 'uen'], ['來日書章知昌常徹澄船母 合口', 'uen'], ['', 'üin']]] + ['合口', [['明母', 'uen'], ['來日書章知昌常徹澄船母 合口', 'uen'], ['', 'üin']]] ]] ]], @@ -218,26 +201,26 @@ const 韻母規則 = () => when([ ['開口 或 幫組', [['崇母', 'uang'], ['見溪羣曉匣母', 'än'], ['', 'iän']]], ['合口', 'üän'] ]], - - ['元仙韻 舒聲',[ + + ['元仙韻 舒聲', [ ['開口', [['日知徹澄母 或 莊章組', 'ang'], ['見溪羣曉匣母', 'än'], ['', 'iän']]], ['合口', [['日來母 或 知莊章組', 'uang'], ['', 'üän']]], ['元韻', [['明母', 'uang'], ['', 'ang']]], ['仙韻', 'iän'] ]], - + ['刪山韻', [ ['入聲', [['合口', 'ua'], ['疑影母', 'ia'], ['', 'a']]], ['舒聲', [ ['幫組', 'ang'], ['開口', [['影疑母', 'iän'], ['見溪羣曉匣母', 'än'], ['', 'ang']]], - ['合口','uang'] + ['合口', 'uang'] ]] ]], ['寒韻', [ ['入聲', [ - ['幫組','o'], + ['幫組', 'o'], ['開口', [['見溪羣曉匣疑影母', 'o'], ['', 'a']]], ['合口', [['見組', 'uä'], ['', 'o']]] ]], @@ -264,14 +247,14 @@ const 韻母規則 = () => when([ ['唐韻 入聲', [['合口 見組', 'uä'], ['', 'o']]], ['宕攝 舒聲', [ - ['合口','uang'], - ['陽韻', [['明母 或 莊組','uang'], ['來孃疑以影母 或 精組', 'iang'], ['','ang']]], - ['','ang'] + ['合口', 'uang'], + ['陽韻', [['明母 或 莊組', 'uang'], ['來孃疑以影母 或 精組', 'iang'], ['', 'ang']]], + ['', 'ang'] ]], // 梗攝 ['庚韻 入聲', [ - ['二等',[['合口', 'uä'], ['', 'ä']]], + ['二等', [['合口', 'uä'], ['', 'ä']]], ['三等', [['莊組', 'ä'], ['合口', 'ü'], ['', 'i']]] ]], @@ -283,7 +266,7 @@ const 韻母規則 = () => when([ ['合口', [['心以影母', 'in'], ['云影母', 'iong'], ['', 'ong']]] ]] ]], - + ['清青韻 入聲', [ ['幫組', 'i'], ['開口', [['莊組', 'y'], ['知章組', 'r'], ['', 'i']]], @@ -297,7 +280,7 @@ const 韻母規則 = () => when([ ]], ['耕韻', [ - ['入聲', [['幫組 或 開口','ä'], ['合口','uä']]], + ['入聲', [['幫組 或 開口', 'ä'], ['合口', 'uä']]], ['舒聲', [ ['幫組', 'en'], ['開口', [['匣影母', 'in'], ['', 'en']]], @@ -375,19 +358,25 @@ const 聲母 = 聲母規則(); const 韻母 = 韻母規則(); const 聲調 = 聲調規則(); -function 字母轉音標(s) { - var res = ""; - for (var i = 0; i < s.length; i++) { - res += 音標表[s.charAt(i)]; - } - res = res.replace('ao','ɔ').replace('ou','əɯ').replace('eʐ','ɚ').replace('en','ən') - .replace('ei','əi').replace('nk','ŋ').replace('tsx','ʈʂ').replace('tsʰx','tʂʰ').replace('sx','ʂ'); - return res.endsWith('ʐ') ? res.replace('ʐ', 'ʅ'): res; -}; +const 替換列表字典 = [ + ['ao', 'ɔ'], + ['ou', 'əɯ'], + ['eʐ', 'ɚ'], + ['en', 'ən'], + ['ei', 'əi'], + ['nk', 'ŋ'], + ['tsx', 'ʈʂ'], + ['tsʰx', 'tʂʰ'], + ['sx', 'ʂ'], + [/ʐ$/, 'ʅ'], +]; -if (選項.書寫系統 !== '國際音標') { - if (選項.標調方式 === '數字') return 聲母 + 韻母 + 次序標調[聲調]; - return 聲母 + (聲調 ? 韻母.replace(/.*[aä]|.*[eo]|.*[iuüyr]/, '$&' + 附標標調[聲調]) : 韻母); -} else { - return 字母轉音標(聲母 + 韻母) + 調值標調[聲調]; +function 字母轉音標(s) { + let res = Array.from(s, c => 音標表[c]); + 替換列表字典.forEach(pair => res = res.replace(...pair)); + return res; } + +if (選項.書寫系統 === '國際音標') return 字母轉音標(聲母 + 韻母) + 調值標調[聲調]; +if (選項.標調方式 === '數字') return 聲母 + 韻母 + 次序標調[聲調]; +return 聲母 + (聲調 ? 韻母.replace(/.*[aä]|.*[eo]|.*[iuüyr]/, '$&' + 附標標調[聲調]) : 韻母);