Skip to content

Commit

Permalink
Update mid_tang: add 等類記法
Browse files Browse the repository at this point in the history
  • Loading branch information
untunt committed Dec 25, 2023
1 parent 4d0a4e3 commit 2e9950e
Showing 1 changed file with 33 additions and 15 deletions.
48 changes: 33 additions & 15 deletions mid_tang.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,16 @@ if (!音韻地位) return [
'聲',
['非組', [1].concat(Object.keys(非組字典))],
['常船合併、崇俟合併' + 刷新, is慧琳],
選項.顯示更多選項 ? ['等類記法', [1,
'四\u2006Cj 三\u2006Cɣ 一二\u2006C',
'四\u2006Cʲ 三\u2006Cˠ 一二\u2006C',
'四\u2006Cʲ 三\u2006Cˠ 一二\u2006Cˤ',
'四\u2006Cʲ 三\u2006C 一二\u2006Cˤ',
]] : [],
選項.顯示更多選項 ? ['見組一二等簡寫作軟腭音', false] : [],

'韻',
['低元音', [2, '前æ 非前a', '前æ 非前ɑ', '前a 非前ɑ']],
['低元音', [2, '前\u2006æ 非前\u2006a', '前\u2006æ 非前\u2006ɑ', '前\u2006a 非前\u2006ɑ']],
['部分蟹攝二等入假攝' + 刷新, !is韻圖],
['部分流攝脣音入遇攝' + 刷新, !is韻圖],
['同攝BC韻合併(文韻除外)' + 刷新, !is盛唐],
Expand Down Expand Up @@ -59,6 +65,7 @@ Object.entries(選項).forEach(([k, v]) => { 選項[k.trim()] = v; });
選項.幽韻一律歸四等 = 選項.幽韻一律歸四等 ?? false;
選項.完全莊三化二 = 選項.完全莊三化二 ?? false;
選項.全濁上歸去 = 選項.全濁上歸去 ?? false;
選項.等類記法 = 選項.等類記法 ?? 'Cj Cɣ C';

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

if (選項.全濁上歸去) 調整('全濁 上聲', { : '去' });
}
Expand Down Expand Up @@ -111,9 +118,10 @@ function get聲母() {
[輕唇化條件, 非組字典[選項.非組][音韻地位.]],
[選項.崇俟合併 && '俟母', 'dʐ'],
[選項.常船合併 && '常母', 'ʑ'],
[!選項.見組一二等簡寫作軟腭音 && '見溪疑曉母 一二等', {
: 'q', : 'qʰ', : 'ɴ', : 'χ',
[!選項.見組一二等簡寫作軟腭音 && '見溪疑曉匣母 一二等', {
: 'q', : 'qʰ', : 'ɴ', : 'χ', : 'ʁ',
}[音韻地位.]],
[選項.等類記法.includes('ɣ') && '匣母', 'ʁ'], // 爲了避免和介音衝突,匣母一律寫 ʁ
['', {
: 'p', : 'pʰ', : 'b', : 'm',
: 't', : 'tʰ', : 'd', : 'n', : 'l',
Expand All @@ -122,22 +130,23 @@ function get聲母() {
: 'tʂ', : 'tʂʰ', : 'dʐ', : 'ʂ', : 'ʐ',
: 'tɕ', : 'tɕʰ', : 'dʑ', : 'ɕ', : 'ʑ', : 'ɲ', : 'j',
: 'k', : 'kʰ', : 'ɡ', : 'ŋ',
: 'ʔ', : 'x', : 'ʁ', : '',
: 'ʔ', : 'x', : 'ɣ', : '',
}[音韻地位.]],
]);
}

function get細介音() {
function get等類記法() {
let 等類記法 = 選項.等類記法.split(' ').map(e => e.split('C')[1]);
return when([
[輕唇化條件, ''],
['莊章組 或 日以母', ''],
[韻圖等 === '四', 'j'],
[韻圖等 === '三', 'ɣ'],
['', ''],
[韻圖等 === '四', 等類記法[0]],
[韻圖等 === '三', 等類記法[1]],
['', 等類記法[2]],
]);
}

function get合介音() {
function get合口介音() {
return is`合口 或 幫組 咍泰魂韻` ? 'w' : '';
}

Expand Down Expand Up @@ -208,9 +217,9 @@ function get韻基() {
]],
]);
if (is`入聲`) [...'mnŋɴ'].forEach((v, i) => { result = result.replace(v, 'ptkq'[i]); });
let 兩個低元音 = 選項.低元音.split(' ');
result = result.replace('æ', 兩個低元音[0].slice(-1));
result = result.replace('ɑ', 兩個低元音[1].slice(-1));
let 兩個低元音 = 選項.低元音.split(' ').map(e => e.slice(-1));
result = result.replace('æ', 兩個低元音[0]);
result = result.replace('ɑ', 兩個低元音[1]);
return result;
}

Expand All @@ -228,10 +237,19 @@ function get聲調() {
function get音節() {
const 音節 = {
聲母: get聲母(),
介音: get細介音() + get合介音(),
介音: get合口介音(),
韻基: get韻基(),
聲調: get聲調(),
};
if (選項.等類記法.includes('j')) { // 視作介音
音節.介音 = get等類記法() + 音節.介音;
} else { // 視作聲母
音節.聲母 += get等類記法();
音節.聲母 = 音節.聲母.replace(/ʰ([ʲˠˤ])/, '$1ʰ');
if (!選項.見組一二等簡寫作軟腭音 && is`見組 或 曉匣母`) 音節.聲母 = 音節.聲母.replace('ˤ', '');
if (音節.聲母 === 'ɣˠ') 音節.聲母 = 'ɣ';
if (音節.聲母 === 'ˠ') 音節.聲母 = 音節.介音 ? '' : 'ɰ';
}
if (音節.韻基[0] === 'u') 音節.介音 = 音節.介音.replace('w', '');
if (音節.韻基[0] === 'i') 音節.介音 = 音節.介音.replace('j', '');
音節.韻母 = 音節.介音 + 音節.韻基;
Expand Down

0 comments on commit 2e9950e

Please sign in to comment.