diff --git a/chiangxhua.js b/chiangxhua.js index cbd4a00..a1343a5 100644 --- a/chiangxhua.js +++ b/chiangxhua.js @@ -3,8 +3,6 @@ * https://zhuanlan.zhihu.com/p/498778513 * * 默認顯示音值,採用北宋早期音系通常拼寫風格 - * 默認入聲尾音位用 /-p -t -k/,音值用 [-β -ɾ -ɣ] - * 如需顯示原圖的音位轉寫,請在「顯示」選擇「音位,入聲用陰聲尾」 * * 代碼注釋中的等均指韻圖等(聲音唱和圖等),而不是切韻等 * @@ -13,36 +11,42 @@ const is = (...x) => 音韻地位.屬於(...x); const when = (...x) => 音韻地位.判斷(...x); -const 顯示高級選項 = 選項.顯示高級選項 ?? false; +const is音值 = 選項.顯示 !== '音位'; + +const 知照組符號字典 = { + 'tɹ tʃ': 'ʃʒɹ', + 'tɹ tɕ': 'ɕʑɹ', + 'tɻ tʂ': 'ʂʐɻ', + // '二等 tɻ tʂ,三等 tɹ tɕ': 'ʂʐɻ|ɕʑɹ', +}; if (!音韻地位) return [ - ['顯示', [4, - '音位,入聲用陰聲尾(僅作爲原圖轉寫,不推薦)', - '音位,入聲用入聲尾', - '音值,保留二等介音,知照組用齦腭音', - '音值,省略二等介音,知照組用齦腭音', - '音值,省略二等介音,知照組用捲舌音', - '音值,省略二等介音,知照組二等捲舌、三等齦腭', + ['顯示', [2, + '音位', + '音值', ]], - ['入聲尾', [1, - '默認', - 'ʋ ɹ ɣ', + '標音風格', + ['知照組', [1].concat(Object.keys(知照組符號字典))], + ['入聲尾', is音值 ? [1, + // 'ʋ ɹ ɣ', 'β ɾ ɣ', 'b d ɡ', 'p t k', + ] : [2, + 'ˀ ʋˀ jˀ wˀ', // 僅作爲原圖的音位轉寫,不推薦 + 'p t k ', ]], - ['聲調', [1, '附加符號', '調類數字']], + ['聲調', [1, '附加符號', '調類數字', '省略']], + ['省略二等介音', is音值 ? true : null], + ['全濁平省略送氣', false], + ['次濁上省略喉化', false], + // ['山攝二等脣音歸合口', false], // (僅作爲原圖轉寫)圖中“八”在合口,但二等不應該在合口。《韻鏡》《七音略》脣音刪舒、山入在合口,刪入、山舒在開口 + '演變規則', + ['部分蟹攝二等入假攝', true], + ['部分流攝脣音入遇攝', true], ['全濁上歸去', true], // 圖中未體現全濁上字的聲調,按口語則已歸去聲,按《蒙古字韻》風格則仍算上聲 ['影喻上聲合併', false], // 圖中無影喻上聲對立的空間,可能口語已合併,但同期反切沒有相混的情況 - ['顯示高級選項', 顯示高級選項], -].concat(顯示高級選項 ? [ - '高級選項', - ['部分蟹攝二等入假攝', false], - ['部分流攝脣音入遇攝', false], - ['次濁上省略喉化', false], - ['全濁平省略送氣', false], - ['山攝二等脣音歸合口', false], // (僅作爲原圖轉寫)圖中“八”在合口,但二等不應該在合口。《韻鏡》《七音略》脣音刪舒、山入在合口,刪入、山舒在開口 -] : []); +]; function 調整音韻地位() { function 調整(表達式, 調整屬性) { if (is(表達式)) 音韻地位 = 音韻地位.調整(調整屬性); } @@ -51,8 +55,8 @@ function 調整音韻地位() { 調整('明母 東韻', { 等: '一' }); // [慧琳反切體現的, 唐代用韻體現的, 據今音推測的] - const 蟹攝二等入假攝字 = ['崖咼(呙)扠涯搋派差絓畫(画)罣罷(罢)', '佳鼃娃解釵(钗)卦柴', '哇洼蛙灑蝸話(话)掛挂查叉杈衩'].join(''); - const 流攝脣音入遇攝字 = ['浮戊母罦罘蜉矛茂覆懋拇某負(负)阜', '謀(谋)部畝(亩)畮婦(妇)不否桴富牟缶', '復複(复)副牡'].join(''); + const 蟹攝二等入假攝字 = ['崖咼(呙)扠涯派差絓畫(画)罣罷(罢)', '佳鼃娃解卦', '灑蝸話(话)掛挂查叉杈衩'].join(''); + const 流攝脣音入遇攝字 = ['浮戊母罦罘蜉覆拇負(负)阜', '部畝(亩)畮婦(妇)不否桴富', '復複(复)副牡'].join(''); if (選項.部分蟹攝二等入假攝 && 蟹攝二等入假攝字.includes(字頭)) 調整('蟹攝 二等', { 韻: '麻' }); if (選項.部分流攝脣音入遇攝 && 流攝脣音入遇攝字.includes(字頭)) 調整('幫組 尤侯韻', { 韻: is`尤韻` ? '虞' : '模' }); } @@ -152,6 +156,7 @@ function get韻基() { } function get聲調() { + if (選項.聲調 === '省略') return ''; return { 平: { 附加符號: '̀', 調類數字: '¹' }, 上: { 附加符號: '́', 調類數字: '²' }, @@ -191,15 +196,6 @@ function 音位to音值(音節) { // 噝音後的開音節 /ə/ 變 [ɹ̩](實際僅精組開口和莊組有字) 音節.介音.includes('u') ? 音節.韻尾 = 'ɹ' : 音節.韻核 = 'ɹ̩'; } - if (選項.顯示.includes('知照組用捲舌音') || - 選項.顯示.includes('知照組二等捲舌') && 音節.介音.includes('ʕ')) { - [...'ɕʑɹ'].forEach((e, i) => { 音節.聲母 = 音節.聲母.replace(e, 'ʂʐɻ'[i]); }); - if (音節.介音.includes('ʕ')) { - 音節.韻核 = 音節.韻核.replace('ɹ̩', 'ɻ̍'); - 音節.韻尾 = 音節.韻尾.replace('ɹ', 'ɻ'); - } - } - if (選項.顯示.includes('省略二等介音')) 音節.介音 = 音節.介音.replace('ʕ', ''); 音節.介音 = 音節.介音.replace('iu', 'ʉ'); if (!音節.韻核) 音節.韻尾 = 音節.韻尾.replace('j', 'i'); // /iuəj/ 實際上是 [i] 的合口 音節.韻尾 = 音節.韻尾.replace('wŋ', 'uŋ'); @@ -207,6 +203,15 @@ function 音位to音值(音節) { } function 後處理(音節) { + let 知照組符號 = 知照組符號字典[選項.知照組]; + if (!音節.介音.includes('ʕ')) 知照組符號 = 知照組符號.slice(-3); // 二等取開頭 3 個符號,三等取最後 3 個符號 + [...'ɕʑɹ'].forEach((e, i) => { 音節.聲母 = 音節.聲母.replace(e, 知照組符號[i]); }); + if (知照組符號.includes('ɻ')) { + 音節.韻核 = 音節.韻核.replace('ɹ̩', 'ɻ̍'); + 音節.韻尾 = 音節.韻尾.replace('ɹ', 'ɻ'); + } + if (選項.省略二等介音) 音節.介音 = 音節.介音.replace('ʕ', ''); + if (音節.介音.includes('ʲ')) { 音節.聲母 += ['', 'ˀ'].includes(音節.聲母) ? 'j' : 'ʲ'; 音節.聲母 = 音節.聲母.replace('ʰʲ', 'ʲʰ'); @@ -216,9 +221,7 @@ function 後處理(音節) { if (選項.全濁平省略送氣 && is`全濁`) 音節.聲母 = 音節.聲母.replace('ʰ', ''); if (is`入聲`) { let 入聲尾 = 選項.入聲尾; - if (入聲尾 === '默認') 入聲尾 = 選項.顯示.includes('音值') ? 'β ɾ ɣ' : 'p t k'; - if (選項.顯示.includes('入聲用陰聲尾')) 入聲尾 = 'ˀ ʋˀ jˀ wˀ'; - const 韻尾to = 入聲尾.split(' '); + const 韻尾to = 入聲尾.trim().split(' '); const 韻尾from = 韻尾to.length === 3 ? [...'βɾɣ'] : ['ɾ', 'β', is`曾梗攝` && 'ɣ', /.?ɣ/]; 韻尾from.forEach((e, i) => { 音節.韻尾 = 音節.韻尾.replace(e, 韻尾to[i]); }); } @@ -233,7 +236,7 @@ function get音節() { 韻尾: 韻基.substring(1), 聲調: get聲調(), }; - if (選項.顯示.includes('音值')) 音位to音值(音節); + if (is音值) 音位to音值(音節); 後處理(音節); 音節.韻母 = 音節.介音 + 音節.韻核 + 音節.韻尾; 音節.帶調韻母 = 音節.介音 + 音節.韻核 + (選項.聲調 === '調類數字' ? 音節.韻尾 + 音節.聲調 : 音節.聲調 + 音節.韻尾); diff --git a/test/main.js b/test/main.js index 61b5e78..9f3affd 100644 --- a/test/main.js +++ b/test/main.js @@ -45,7 +45,7 @@ assert_equal(panwuyun(音韻地位), "ɕiᴇu˧˥"); assert_equal(unt(音韻地位), "ɕéw"); assert_equal(msoeg_v8(音韻地位), "çiɛuˀ"); assert_equal(mid_tang(音韻地位), "ɕiɛw˦˥"); -assert_equal(chiangxhua(音韻地位), "ɕiɛ́w"); +assert_equal(chiangxhua(音韻地位), "ʃiɛ́w"); assert_equal(zhongyuan(音韻地位), "ʂjɛw³"); assert_equal(fanwan(音韻地位), "shiu2"); assert_equal(putonghua(音韻地位), "shǎo");