Skip to content

Commit

Permalink
Improve options in chiangxhua.js
Browse files Browse the repository at this point in the history
  • Loading branch information
untunt committed May 12, 2023
1 parent 11687b6 commit 62b1074
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 39 deletions.
79 changes: 41 additions & 38 deletions chiangxhua.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
* https://zhuanlan.zhihu.com/p/498778513
*
* 默認顯示音值,採用北宋早期音系通常拼寫風格
* 默認入聲尾音位用 /-p -t -k/,音值用 [-β -ɾ -ɣ]
* 如需顯示原圖的音位轉寫,請在「顯示」選擇「音位,入聲用陰聲尾」
*
* 代碼注釋中的等均指韻圖等(聲音唱和圖等),而不是切韻等
*
Expand All @@ -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(表達式)) 音韻地位 = 音韻地位.調整(調整屬性); }
Expand All @@ -51,8 +55,8 @@ function 調整音韻地位() {
調整('明母 東韻', { : '一' });

// [慧琳反切體現的, 唐代用韻體現的, 據今音推測的]
const 蟹攝二等入假攝字 = ['崖咼(呙)扠涯搋派差絓畫(画)罣罷(罢)', '佳鼃娃解釵(钗)卦柴', '哇洼蛙灑蝸話(话)掛挂查叉杈衩'].join('');
const 流攝脣音入遇攝字 = ['浮戊母罦罘蜉矛茂覆懋拇某負(负)阜', '謀(谋)部畝(亩)畮婦(妇)不否桴富牟缶', '復複(复)副牡'].join('');
const 蟹攝二等入假攝字 = ['崖咼(呙)扠涯派差絓畫(画)罣罷(罢)', '佳鼃娃解卦', '灑蝸話(话)掛挂查叉杈衩'].join('');
const 流攝脣音入遇攝字 = ['浮戊母罦罘蜉覆拇負(负)阜', '部畝(亩)畮婦(妇)不否桴富', '復複(复)副牡'].join('');
if (選項.部分蟹攝二等入假攝 && 蟹攝二等入假攝字.includes(字頭)) 調整('蟹攝 二等', { : '麻' });
if (選項.部分流攝脣音入遇攝 && 流攝脣音入遇攝字.includes(字頭)) 調整('幫組 尤侯韻', { : is`尤韻` ? '虞' : '模' });
}
Expand Down Expand Up @@ -152,6 +156,7 @@ function get韻基() {
}

function get聲調() {
if (選項.聲調 === '省略') return '';
return {
: { 附加符號: '̀', 調類數字: '¹' },
: { 附加符號: '́', 調類數字: '²' },
Expand Down Expand Up @@ -191,22 +196,22 @@ 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ŋ');
音節.韻尾 = 音節.韻尾.replace('wɣ', 'uɣ');
}

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('ʰʲ', 'ʲʰ');
Expand All @@ -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]); });
}
Expand All @@ -233,7 +236,7 @@ function get音節() {
韻尾: 韻基.substring(1),
聲調: get聲調(),
};
if (選項.顯示.includes('音值')) 音位to音值(音節);
if (is音值) 音位to音值(音節);
後處理(音節);
音節.韻母 = 音節.介音 + 音節.韻核 + 音節.韻尾;
音節.帶調韻母 = 音節.介音 + 音節.韻核 + (選項.聲調 === '調類數字' ? 音節.韻尾 + 音節.聲調 : 音節.聲調 + 音節.韻尾);
Expand Down
2 changes: 1 addition & 1 deletion test/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down

0 comments on commit 62b1074

Please sign in to comment.