Skip to content

Commit

Permalink
Update msoeg: add IPA
Browse files Browse the repository at this point in the history
  • Loading branch information
untunt committed Jul 25, 2024
1 parent 5c6de54 commit e082a08
Showing 1 changed file with 51 additions and 18 deletions.
69 changes: 51 additions & 18 deletions msoeg_v8.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,28 +8,54 @@
const is = (...x) => 音韻地位.屬於(...x);
const when = (...x) => 音韻地位.判斷(...x);
const 顯示高級選項 = 選項.顯示高級選項 ?? false;
let mpaConfirmed = 選項['音標體系\u200b'] === 'MPA';
let mpaRevoked = false; // 用於在用戶選擇放棄使用 MPA 時刷新選項列表的內容
if (選項.音標體系?.includes('MPA')) {
const message = '請注意 MPA(即 msoeg 音標)不是國際音標,其中諸多符號不可按國際音標理解,容易引起誤會。在公共場合使用 MPA 後果自負!\n\n確認使用 MPA?';
if (confirm(message)) {
mpaConfirmed = true;
} else {
mpaRevoked = true;
}
}

if (!音韻地位) return [
['章組', [2, '齦後噝音 tʃ', '齦腭噝音 tɕ', '齦腭非噝音 tç']],
['捲舌元音記號', [1, // 知乎文章用下加點,韻鑒用 r 音鉤
'r音鉤(帶空隙)◌˞ ',
'r音鉤(無空隙)◌˞',
'下加點 ◌̣',
]],
!mpaConfirmed ?
!mpaRevoked ?
['音標體系', [1, '國際音標', 'MPA']] :
['音標體系', [1, '國際音標', 選項.音標體系 === 'MPA' ? 'MPA\u200b' : 'MPA']] :
['音標體系\u200b', [2, '國際音標', 'MPA']],
// 其他未在選項中顯示的國際音標與 MPA 差異:
//
// - 齦腭噝音(章組)[tɕ] MPA 作 <tç>
// - [i ɯ̯ ɯ u ɛ ɔ a] 對應的 r 化元音 MPA 依次作
// <ị ɨ̣ ɯ̣ ụ ɜ̣ ɞ̣ ạ>
// - [o̯](實即 [ʁu̯])MPA 作 <ᵒ>
//
// 詳見 https://zhuanlan.zhihu.com/p/710982203
['r化元音記號', !mpaConfirmed ?
// 知乎文章用下加點,韻鑒用 r 音鉤(“r 化”原文稱“捲舌”)
[1, 'r音鉤(帶空隙)◌˞ ', 'r音鉤(無空隙)◌˞'] :
[3, ' r音鉤(帶空隙)◌˞ ', ' r音鉤(無空隙)◌˞', '下加點 ◌̣'],
],
['通江宕攝韻尾', [3, 'ŋ/k', 'ŋʷ/kʷ', 'ɴ/q']], // 知乎文章用 ŋʷ/kʷ,韻鑒用 ɴ/q
['聲調記號', !mpaConfirmed ?
[1, '上ʔ 去h', '上ˀ 去ʰ'] : // 上標的 ʔ Unicode 未收,以 ˀ 代替
[1, '上ˀ 去ʰ '],
],
['顯示高級選項', 顯示高級選項],
].concat(顯示高級選項 ? [
'高級選項',
['保留非三等ʶ記號', false],
['莊三介音', [1, '', '捲舌元音', 'ɻ']], // 知乎文章用捲舌元音,韻鑒用 ɻ
['莊三韻母起始', [1, '普通', 'r化元音', 'ɻ']], // 知乎文章用 r 化元音,韻鑒用 ɻ
['覺韻', [1, '中元音', '低元音']], // 知乎文章和韻鑒用低元音
['庚三清', [2, '中元音', '低元音']],
['宕攝入聲附加', [1, '無', '⁽ʷ⁾', 'ʷ']], // 知乎文章和韻鑒用 ⁽ʷ⁾
] : []);

if (!顯示高級選項) {
選項.保留非三等ʶ記號 = false;
選項.莊三介音 = '';
選項.莊三韻母起始 = '普通';
選項.覺韻 = '中元音';
選項.庚三清 = '低元音';
選項.宕攝入聲附加 = '無';
Expand Down Expand Up @@ -63,9 +89,7 @@ function get聲母_默認拼寫() {

function get聲母() {
let 聲母 = get聲母_默認拼寫();
if (選項.章組.includes('ʃ')) {
聲母 = 聲母.replace('ɕ', 'ʃ').replace('ʑ', 'ʒ');
} else if (選項.章組.includes('ç')) {
if (mpaConfirmed) {
聲母 = 聲母.replace('ɕ', 'ç').replace('ʑ', 'ʝ');
}
if (!選項.保留非三等ʶ記號) {
Expand Down Expand Up @@ -138,18 +162,18 @@ function get韻母() {
// 其中,支宵侵的重紐三等開口歸 C 類
元音 = 元音.replace('i', is('支宵韻 或 侵韻 見影組 非 云母') ? 'ɯ' : 'ị');
}
if (選項.莊三介音 === '' && is('莊組 三等')) {
// AB 類歸 B 類
元音 = 元音[0].replace('i', 'ị') + 元音.slice(1);
if (選項.莊三韻母起始 === '普通' && is('莊組 三等')) {
// AB 類歸 B 類
元音 = 元音[0].replace('i', 'ị') + 元音.slice(1);
} else if (is('莊組 三等')) {
元音 = 元音[0] + '̣' + 元音.slice(1);
if (!is('支魚韻')) {
// 介音變爲等同於二等的 ɨ̣(支魚的第一部分不是介音)
元音 = 元音[0].replace('ɯ', 'ɨ').replace('i', 'ɨ') + 元音.slice(1);
}
if (選項.莊三介音 !== '捲舌元音') {
if (選項.莊三韻母起始 !== 'r化元音') {
// 介音是 ɨ̣ 則改寫爲 ɻ,否則前加 ɻ。支韻的 ị 也改寫爲 ɻ
元音 = 選項.莊三介音 + 元音.replace('ị', '').replace('ɨ̣', '').replace('̣', '');
元音 = 選項.莊三韻母起始 + 元音.replace('ị', '').replace('ɨ̣', '').replace('̣', '');
}
}

Expand All @@ -163,13 +187,22 @@ function get韻母() {
元音 = 元音.replace('ʷɻ', 'ɻʷ');
}

元音 = 元音.replace('̣', 選項.捲舌元音記號.split('◌')[1]);
if (!mpaConfirmed) {
[
['ɨ', 'ɯ'],
['ɜ', 'ɛ'],
['ɞ', 'ɔ'],
].forEach(([a, b]) => { 元音 = 元音.replace(a + '̣', b + '̣'); });
元音 = 元音.replace('ᵒ', 'o̯');
}
元音 = 元音.replace('̣', 選項.r化元音記號.split('◌')[1]);
韻尾 = 韻尾.replace(元音.slice(-1), ''); // 刪去重複字母 ii、uu
return 元音 + 韻尾;
}

function get聲調() {
return { : 'ˀ', : 'ʰ' }[音韻地位.] || '';
if (is`平入聲`) return '';
return 選項.聲調記號.split(' ')[+is`去聲`].slice(1);
}

return get聲母() + get韻母() + get聲調();

0 comments on commit e082a08

Please sign in to comment.