-
Notifications
You must be signed in to change notification settings - Fork 14
/
mongol.js
499 lines (460 loc) · 22.2 KB
/
mongol.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
/* 推導《蒙古字韻》
*
* 由切韻音系音韻地位完美推導《蒙古字韻》八思巴字及各家轉寫、擬音
*
* 《蒙古字韻》聲韻母及其搭配反映金、南宋時官話發音,但各音節轄字係由《平水韻》系韻書直接填入,不反映實際字音。聲調方面《蒙古字韻》全濁聲母獨立、全濁上獨立、入聲韻拼作對應的陰聲韻,皆爲沿襲等韻學習慣,亦不反映實際字音。不過正因如此,本推導方案的推導準確率達 100%
*
* 參考文獻:
*
* - 元刊本. 禮部韻略七音三十六母通考. https://www.digital.archives.go.jp/item/3215715
* (載於《古今韻會舉要》書前,以下簡稱《通考》)
* - 照那斯圖, 楊耐思. 1987. 蒙古字韻校本.
* - 甯忌浮. 1997. 《古今韻會舉要》及相關韻書.
* - Coblin, W. South. 2007. A Handbook of 'Phags-pa Chinese. https://doi.org/10.1515/9780824861261
* - Shen, Zhongwei. 2008. Studies on the Menggu Ziyun.
* - 沈鍾偉. 2015. 《蒙古字韻》集校.
* - 宋洪民. 2017. 八思巴字資料與蒙古字韻.
* - 濱田武志. 2019. 論《蒙古字韻》所反映的漢語方言音系. https://doi.org/10.1163/2405478x-01101006
* - unt. 2023. 《蒙古字韻》音系. https://zhuanlan.zhihu.com/p/597563597
*
* 其他轉寫來源:
*
* - 照那斯圖. 1980. 論八思巴字.
* - 吉池孝一. 2005. パスパ文字の字母表.
*
* @author unt
*/
/** @type { 音韻地位['屬於'] } */
const is = (...x) => 音韻地位.屬於(...x);
/** @type { 音韻地位['判斷'] } */
const when = (...x) => 音韻地位.判斷(...x);
const 字母韻後綴 = 選項?.後綴 ?? '₂';
if (!音韻地位) return [...[
['顯示', [1,
'八思巴字',
'照那斯圖 1987 轉寫 ⭐',
'吉池孝一 2005 轉寫',
'Coblin 2007 轉寫',
'Coblin 2007 擬音',
'沈鐘偉 2008/2015 轉寫兼擬音',
// TODO: '濱田武志 2019 擬音',
'unt 2023 轉寫 ⭐',
'unt 2023 擬音 ⭐',
]],
['ꡠ、ꡦ 的轉寫', [1,
'ꡠe ꡦė(八思巴字漢語風格)',
'ꡠė ꡦe(八思巴字蒙古語風格)',
], { hidden: 選項.顯示 !== '照那斯圖 1987 轉寫 ⭐' }],
[['聲母附加數字|',
'非敷 ꡰ f2 ≠ 奉 ꡤ f1',
'審 ꡮ š2 ≠ 禪 ꡚ š1',
'曉 ꡜ h2 ≠ 匣 ꡯ h1',
'幺 ꡗ y2 ≠ 喻 ꡭ y1',
].join('\n')
.replace(/1/g, 選項?.聲母附加數字?.split(' ')[0] ?? '1')
.replace(/2/g, 選項?.聲母附加數字?.split(' ')[1] ?? '2'),
[1,
'₁ ₂',
{ value: '1 2', text: '1 2(原文)' },
], { hidden: 選項.顯示 !== '吉池孝一 2005 轉寫' }],
['零聲母陽調下加|\n原文零聲母陽調整個音節加下劃線,此處用首個字母下加橫線代替', [2,
{ value: '\u0331', text: '◌\u0331 長音符(U+0331)' },
{ value: '\u0332', text: '◌\u0332 橫線(U+0332)' },
{ value: '\u035F', text: '◌\u035F 雙長音符(U+035F)' },
], { hidden: 選項.顯示 !== '沈鐘偉 2008/2015 轉寫兼擬音' }],
], ...(選項?.顯示?.includes(' 擬音') ? [] : [
'',
['兩字母韻拼寫相同時加後綴區分', true, {
description: [
'經韻 ꡦꡞꡃ ≠ 行韻 ꡦꡞꡃ',
'弓韻 ꡦꡟꡃ ≠ 雄韻 ꡦꡟꡃ',
'規韻 ꡦꡟꡠ ≠ 麾韻 ꡦꡟꡠ',
'杴韻 ꡦꡠꡏ ≠ 嫌韻 ꡦꡠꡏ',
].map(e => 選項.兩字母韻拼寫相同時加後綴區分 === false ? e : e + 字母韻後綴).join('\n'),
}],
['後綴', [1, '₂', '²', '2', '′'], { hidden: 選項.兩字母韻拼寫相同時加後綴區分 === false }],
['寶字採用特殊拼寫|寶字採用 ꡎꡖꡡ 拼寫\n「ꡎꡖꡡ 御寳上用此寳字」', false],
]), ...[
'音韻地位的選取',
'', ['推導器 ≠ 傳統等韻學 = 原書 時', [2, '依推導器', '依原書']],
'', ['推導器 = 傳統等韻學 ≠ 原書 時', [2, '依推導器', '依原書']],
'', ['保留《蒙古字韻》小韻歸併錯誤', false],
// 不保留《蒙古字韻》小韻拼寫錯誤
['不字讀重脣音', true],
]];
const use傳統 = 選項['推導器 ≠ 傳統等韻學 = 原書 時'] === '依原書';
const use創新 = 選項['推導器 = 傳統等韻學 ≠ 原書 時'] === '依原書';
function 調整音韻地位() {
function 調整(表達式, 調整屬性, 字頭串 = null, 邊緣地位種類 = []) {
if (typeof (字頭串) === 'string' && !字頭串.includes(字頭)) return;
if (is(表達式)) 音韻地位 = 音韻地位.調整(調整屬性, 邊緣地位種類);
}
[[true, [ // 《廣韻》特殊小韻的正常調整
['云母 通曾攝 舒聲 非 開口', { 母: '匣' }, null, ['匣母三等']], // 雄熊
['云匣母 真韻 開口', { 母: '匣', 類: 'A' }, null, ['匣母三等']], // 礥
]],
[use傳統, [
['從母 真韻 去聲', { 母: '邪' }], // 賮燼藎贐
['影母 青韻 去聲', { 呼: '開' }], // 鎣瑩瀅
['清母 歌韻 去聲', { 呼: '合' }, '磋'], // 磋
['見母 仙韻 A類 開口 入聲', { 類: 'B' }], // 孑
['並母 灰韻 上聲', { 韻: '咍' }, '倍菩蓓萯䔒培痱傰', ['咍韻脣音']], // 倍
['滂母 灰韻 上聲', { 韻: '咍' }, null, ['咍韻脣音']], // (仿照倍)
['昌母 廢韻 平上聲 開口', { 母: '初', 韻: '皆', 等: '二' }], // 茝
['以母 廢韻 平上聲 開口', { 母: '疑', 韻: '皆', 等: '二' }], // (仿照茝)
['匣母 先韻 開口 上聲', { 韻: '真', 等: '三', 類: 'A' }, '礥𧥺㘋', ['匣母三等']], // 礥
['以母 脂韻 上聲 合口', { 韻: '宵', 呼: '開' }, '鷕'], // 鷕。此爲 TshetUinh.js v0.15 新修正地位
]],
[use創新, [ // 《通考》也如此
['云母 咸攝 舒聲', { 母: '以', 類: null }], // 炎焱
['云母 蒸韻 合口 入聲', { 母: '影' }], // 域罭棫緎淢
['端母 庚韻 二等', { 韻: '麻' }, null, ['端組類隔']], // 打
['來母 歌韻 去聲', { 呼: '合' }], // 邏
['曉母 脂韻 A類 合口 去聲', { 韻: '灰', 等: '一' }, '䁤睢𥍋婎'], // 《通考》睢(《蒙古字韻》無字)
// ['曉母 青韻 合口 入聲', { 韻: '庚', 等: '三', 類: 'B' }], // 《通考》殈(《蒙古字韻》無字)
['曉母 梗攝 三四等 合口 去聲', { 韻: '庚', 等: '三', 類: 'B' }], // 夐
['曉母 青韻 開口 入聲', { 呼: '合' }], // 赥䦧𥍠
['溪母 仙韻 A類 開口 去聲', { 類: 'B' }], // 譴遣
['曉母 咸攝 三等 入聲', { 韻: '添', 等: '四', 類: null }], // 脅愶㢵嗋熁
]],
[選項['保留《蒙古字韻》小韻歸併錯誤'], [ // 《通考》不誤
['曉母 (止攝 或 臻攝 入聲) A類', { 母: '匣' }, null, ['匣母三等']], // 屎欯、隳墮獝
['曉母 陽韻 合口 入聲', { 母: '並' }], // 戄(ħwjaw 混入 vaw)
['澄母 仙韻 開口 入聲', { 母: '知' }], // 轍徹撤澈
['溪母 青韻 開口 上聲', { 呼: '合' }, '綮'], // 《廣韻》未收,《集韻》溪開四青上
]],
[選項.不字讀重脣音, [ // 《古今韻會舉要》也有此音
['幫母 文韻 入聲', { 韻: '魂', 等: '一', 類: null }, '不'],
]]].forEach(e => {
if (e[0]) e[1].forEach(args => 調整(...args));
});
}
調整音韻地位();
const 韻圖等 = when([
['幫組 C類', '輕'],
// 切韻一二四等到韻圖不變
['非 三等', 音韻地位.等],
// 按韻圖約定,幽韻一律歸四等
['幽韻', '四'],
// 切韻三等,聲母是銳音的情況
['莊組', '二'],
['知章組 或 來日母', '三'],
['端精組 或 以母', '四'],
// 切韻三等,聲母是鈍音的情況
['A類', '四'],
['', '三'],
]);
// 接下來先推導 unt 擬音,再反推八思巴字
function get聲母() {
const is創新的二四等併入三等 = is`見溪羣曉母 臻攝 舒聲 A類 合口` ||
is`曉母 ((曾梗攝 開口 二三四等) 或 (山咸攝 (四等 或 A類)) 或 幽韻) 舒聲` ||
is`羣母 山攝 三四等 合口 舒聲`;
let 聲母字典 = {};
if ((韻圖等 === '四' || 韻圖等 === '二' && !is`合口 或 江韻 舒聲`) && !(use創新 && is創新的二四等併入三等)) 聲母字典 = {
見: 'c', 溪: 'cʰ', 羣: 'ɟ', 曉: 'ç', 匣: 'ʝ',
影: 'ʔ', 疑: '', 云: '', 以: '',
};
else if (韻圖等 === '輕') 聲母字典 = {
幫: 'f', 滂: 'f', 並: 'v', 明: 'ʋ',
};
else if (韻圖等 === '三' || use創新 && is創新的二四等併入三等 || is`江韻 舒聲`) 聲母字典 = {
曉: 'x', 匣: use創新 ? 'ʝ' : 'ɣ', // 匣三(雄小韻)併入四等
};
if (!(音韻地位.母 in 聲母字典)) 聲母字典 = {
幫: 'p', 滂: 'pʰ', 並: 'b', 明: 'm',
端: 't', 透: 'tʰ', 定: 'd', 泥: 'n', 來: 'l',
精: 'ts', 清: 'tsʰ', 從: 'dz', 心: 's', 邪: 'z',
知: 'tʂ', 徹: 'tʂʰ', 澄: 'dʐ', 孃: 'n', // 泥孃合併
莊: 'tʂ', 初: 'tʂʰ', 崇: 'dʐ', 生: 'ʂ', 俟: 'dʐ', // 俟母併入崇母
章: 'tʂ', 昌: 'tʂʰ', 船: 'dʐ', 書: 'ʂ', 常: 'ʐ', 日: 'ɻ', // 常船顛倒
見: 'k', 溪: 'kʰ', 羣: 'ɡ', 曉: 'χ', 匣: 'ʁ',
影: 'ʡ', 疑: 'ŋ', 云: 'ŋ', 以: 'ŋ', // ŋ 稍後處理
};
return 聲母字典[音韻地位.母];
}
function get韻母() {
const is合口 = when([
['效深咸攝 舒聲', '開'], // 流攝唇音歸合口
['遇通攝 或 痕韻 入聲', '合'],
['江韻 銳音', '合'],
[use創新 && '明母 曾梗攝 一二等 舒聲', '合'],
['幫組', [
[韻圖等 === '三' && '止蟹攝 或 (臻深曾梗攝 入聲)', '合'],
[韻圖等 === '輕' && '臻流果攝', '合'],
['二三四等', '開'],
['曾攝 舒聲 或 宕攝', '開'],
[use創新 && '咍泰韻', '開'],
['', '合'],
]],
['', 音韻地位.呼 ?? '開'],
]) === '合';
const is三四等 = '三四'.includes(韻圖等) && !is`止攝 精組 開口` ||
is`見影組 江梗攝 二等 舒聲 非 合口` ||
韻圖等 === '輕' && is`止蟹攝`;
// 推導底層形式,僅 3 個元音:ɨ、ʌ、a
let 韻基 = when([
['臻深攝 入聲', [
[韻圖等 === '四' && '見影組 或 以母', 'ɨj'],
[韻圖等 === '三' && '幫組', 'ɨj'],
['', 'ɨ'],
]],
['止攝 精莊組 開口 或 遇攝 或 通攝 入聲', 'ɨ'],
['果假攝 或 山咸攝 入聲', [
[韻圖等 === '輕' && '果攝', 'ʌ'], // 《通考》縛(《蒙古字韻》無字)
[is三四等 || 韻圖等 === '一' && (is合口 || '非 (入聲 非 見影組)'), 'ʌ'],
['', 'a'],
]],
['通曾梗攝 舒聲', 'ɨŋ'],
['宕江攝 舒聲', 'aŋ'],
['止蟹攝 或 曾梗攝 入聲', [
[use創新 && 韻圖等 === '二' && '曾攝', 'ɨj'],
[use創新 && 韻圖等 === '二' && '蟹攝 三四等', 'ɨj'], // 㯔毳。另有《廣韻》𠻜小韻
[is三四等 || 韻圖等 === '一' && (is合口 || '入聲'), 'ɨj'],
['', 'aj'],
]],
['臻攝 舒聲', 'ɨn'],
['山攝 舒聲', [
[is三四等 || 韻圖等 === '一' && is合口, 'ʌn'],
['', 'an'],
]],
['流攝', 'ɨw'],
['效攝 或 宕江攝 入聲', [
[use創新 && '宕攝 莊組 三等', 'ʌw'], // 斮
[is三四等, 'ʌw'],
['', 'aw'],
]],
['深攝 舒聲', 'ɨm'],
['咸攝 舒聲', [
[is三四等, 'ʌm'],
['', 'am'],
]],
], '無韻母規則', true);
// 生成表層形式
const is細音 = is三四等 ||
韻圖等 === '二' && !is合口 && is`見影組 或 以母` ||
use創新 && is`莊組 蟹攝 三四等 開口` || // 《通考》殺(《集韻》生開三祭去,對應《廣韻》㡜小韻)(《蒙古字韻》無字)
use創新 && is`宕攝 莊組 三等 入聲`;
韻基 = {
ɨ: ['i', 'y', 'ɨ', 'u'],
ʌ: ['jɛ', 'ɥɛ', 'ʌ', 'wɔ'],
a: ['ja', 'wa', 'a', 'wa'], // 撮口呼併入合口呼
}[韻基[0]][!is細音 * 2 + (is合口)] + 韻基.slice(1);
if (韻基 === 'ij') 韻基 = 'i';
if (韻基 === 'y') 韻基 = 'ɥu';
if (韻基 === 'yj' && !(韻圖等 === '四' && is`見影組 或 以母`)) 韻基 = 'uj'; // 三等併入合口呼
if (韻基 === 'ɥɛn' && 韻圖等 === '三' && is`見影組 或 來母`) 韻基 = 'ɥɔn'; // 條件變體
if (韻基 === 'ɥɛn' && use創新 && is`羣曉母`) return 'ɥɔn'; // 四等併入三等
return 韻基;
}
function get擬音() {
let 擬音 = get聲母() + get韻母();
[
[/ŋ(?=ɥ|y|w|u)/, 'w'],
['jj', 'j'], ['ww', 'w'],
].forEach(e => 擬音 = 擬音.replace(...e));
return 擬音;
}
function 擬音to八思巴字(擬音) {
if (選項.寶字採用特殊拼寫 && 擬音 === 'paw' && '寶寳宝珤'.includes(字頭)) { // 只考慮推導器的廣韻資料,不增加更多字頭
return 'ꡎꡖꡡ';
}
const 聲母字典 = {
p: 'ꡎ', pʰ: 'ꡍ', b: 'ꡌ', m: 'ꡏ', f: 'ꡰ', v: 'ꡤ', ʋ: 'ꡓ',
t: 'ꡊ', tʰ: 'ꡉ', d: 'ꡈ', n: 'ꡋ', l: 'ꡙ', // ꡇ 稍後處理
ts: 'ꡒ', tsʰ: 'ꡑ', dz: 'ꡐ', s: 'ꡛ', z: 'ꡕ',
tʂ: 'ꡆ', tʂʰ: 'ꡅ', dʐ: 'ꡄ', ʂ: 'ꡮ', ʐ: 'ꡚ', ɻ: 'ꡔ',
c: 'ꡂꡦ', cʰ: 'ꡁꡦ', ɟ: 'ꡀꡦ', ç: 'ꡜꡦ', ʝ: 'ꡯꡦ', ɣ: 'ꡯꡦ', ʝjaŋ: 'ꡯjaŋ', ɣjaŋ: 'ꡯjaŋ',
k: 'ꡂ', kʰ: 'ꡁ', ɡ: 'ꡀ', x: 'ꡜ', χ: 'ꡜ', ʁ: 'ꡣ',
xwaŋ: 'ꡜɥaŋ', xuj: 'ꡜuj₂', // 怳、麾
ʔ: 'ꡗ', ʔja: 'ꡗa',
j: 'ꡭ', ɥ: 'ꡭɥ', i: 'ꡭi', y: 'ꡭy', jɛ: 'ꡭjɛ',
ʡ: 'ꡖ',
ŋ: 'ꡃ', wɥ: 'ꡝɥ', w: 'ꡝw', wy: 'ꡝy', wu: 'ꡝu',
};
const 後處理替換列表 = [
// 【韻母到八思巴字】
// 介音 + 韻核
['i', 'ꡞ'], ['ɨ', 'ꡜꡞ'],
[/y|ꡦy(?=j)|ɥu/, 'ꡦꡟ'], ['u', 'ꡟ'],
[/ꡦjɛ|(?<!ꡦ)ja/, 'ꡦ'], [/jɛ(?=m)/, 'ꡠ'], ['jɛ', is`見溪羣曉匣母` ? 'ꡠ' : 'ꡦ'],
[/ꡦɥɛ|ɥa/, 'ꡧꡦ'], ['ɥɛ', is`見溪羣曉匣母 非 (宕攝 入聲)` ? 'ꡧꡠ' : 'ꡧꡦ'],
['ɥɔ', 'ꡦꡡ'], [/ʌ|wɔ(?!$)/, 'ꡡ'], ['wɔ', 'ꡧꡡ'], // 閉音節 uo 作 o
[/ꡦja/, 'ꡨ'], ['wa', 'ꡧ'], ['a', ''],
// 韻尾
['ꡟj', 'ꡟꡠ'], ['j', 'ꡭ'], ['w', 'ꡓ'],
['m', 'ꡏ'], ['n', 'ꡋ'], ['ŋ', 'ꡃ'],
// 【後處理】
// 孃母
[/ꡋ(?=ꡦꡟ|ꡦꡃ|ꡞꡓ|ꡞꡏ)/, 'ꡇ'], // 袽醲娘紐賃
// 清濁分韻
[/(?<=[ꡌꡤꡈꡐꡕꡄꡚꡣ])ꡦ(?=$|ꡋ|ꡓ)/, 'ꡠ'], // (全濁)je(0|n|w) -> e
[/(?<=[ꡤ])ꡟꡓ/, 'ꡡꡓ'], // (v)uw -> ow
[/(?<=[ꡣ])ꡧꡃ/, 'ꡡꡃ'], // (ʁ)waŋ -> oŋ(可能代表 o̯aŋ)
// 照組(含孃母)後調整洪細
[/(?<=[ꡆꡅ ꡮꡚꡔꡇ])ꡦꡟꡃ/, 'ꡟꡃ'], // juŋ -> uŋ(崇母除外)
[/(?<=[ꡆꡅꡄꡮꡚꡔꡇ])ꡃ/, 'ꡜꡃ'], // aŋ -> ħaŋ
[/(?<=[ꡆꡅꡄꡮꡚꡔꡇ])ꡦꡃ/, 'ꡃ'], // jaŋ -> aŋ
[/(?<=[ꡔ])ꡟꡃ/, use創新 ? 'ꡦꡟꡃ' : 'ꡟꡃ'], // (ɻ)uŋ -> juŋ
// ħ、ɣ、ʁ 後調整洪細
[/(?<=^[ꡜꡯ])ꡞ(?!$)/, 'ꡦꡞ'], // (ħ|ɣ)i(C) -> ji
[/(?<=^[ꡜꡣ])ꡜ/, ''], // (ħ|ʁ)ħ -> 刪除
[/(?<=^[ꡜ])ꡦ(?=ꡋ)/, use創新 ? 'ꡠ' : 'ꡦ'], // (ħ)je(n) -> e
[/(?<=^[ꡜꡯ])ꡦ(?=ꡋ|ꡏ)/, 'ꡦꡠ'], // (ħ|ɣ)je(n|m) -> jee
[/(?<=^[ꡜꡯ])ꡠ(?=ꡋ|ꡏ)/, 'ꡦ'], // (ħ|ɣ)e(n|m) -> je
[/(?<=^[ꡜ])ꡦ(?=ꡏ)/, use創新 ? 'ꡦꡠ' : 'ꡦ'], // (ħ)je(m) -> jee
// 三四等的不規則分佈
[/(?<!ꡧ)ꡦ(?=ꡋ)/, is`端組 或 孃來母` ? 'ꡠ' : '$&'], // (T)je(n) -> e
[/(?<!ꡧ)ꡦ(?=ꡓ)/, is`幫知莊章組 非 孃母 或 日母` ? 'ꡠ' : '$&'], // (P|Tʂ)je(w) -> e
[/(?<=[ꡗ])ꡠ(?!ꡟ|ꡃ|ꡡ)/, 'ꡦ'], // (ʔ͡j)e -> je
[/(?<=[ꡖꡭꡃ])ꡦ(?!ꡟ|ꡃ|ꡡ)/, 'ꡠ'], // (ʔ|j|ŋ)je -> e
[/(?<=[ꡖ])ꡠ(?=$|ꡋ)/, use創新 ? 'ꡦ' : 'ꡠ'], // (ʔ)e(0|n) -> je
[/(?<=[ꡍꡐ])ꡠ(?=ꡓ|ꡏ)/, use創新 ? 'ꡦ' : 'ꡠ'], // (pʰ|dz)e(w|m) -> je
[/(?<=[ꡏꡔ])ꡦ(?=ꡋ)/, use創新 ? 'ꡠ' : 'ꡦ'], // (m|ɻ)je(n) -> e
[/(?<=[ꡙ])ꡦ(?=ꡓ)/, use創新 ? 'ꡠ' : 'ꡦ'], // (l)je(w) -> e
// 韻母特殊拼寫
[/(?<=[ꡗꡭ])ꡦꡟꡠ/, 'ꡧꡞ'], // (ʔ͡j|j)jue -> wi
[/(?<=[ꡖꡝ])ꡦꡟꡋ/, 'ꡧꡞꡋ'], // (ʔ|ɦ)jun -> win
[/(?<=[ꡖ])ꡧꡦ$/, use創新 ? 'ꡧꡠ' : 'ꡧꡦ'], // (ʔ)jwe -> we。《通考》噦(《蒙古字韻》無字)
[/(?<=[ꡀꡜꡣꡖꡝ])ꡦꡡꡋ/, 'ꡧꡦꡋ'], // (ɡ|ħ|ʁ|ʔ|ɦ)jon -> wjen
[/ꡦꡦꡟꡃ/, 'ꡦꡟꡃ' + (選項.兩字母韻拼寫相同時加後綴區分 ? 字母韻後綴 : '')],
[/(?<=ꡯ)ꡦꡞꡃ/, 'ꡦꡞꡃ' + (選項.兩字母韻拼寫相同時加後綴區分 ? 字母韻後綴 : '')],
[/ꡟꡠ₂/, 'ꡦꡟꡠ' + (選項.兩字母韻拼寫相同時加後綴區分 ? 字母韻後綴 : '')],
[/(?<=ꡯ)ꡦꡠꡏ/, 'ꡦꡠꡏ' + (選項.兩字母韻拼寫相同時加後綴區分 ? 字母韻後綴 : '')],
// 聲母特殊拼寫
[/ꡗ(?=ꡧꡞ|ꡧꡦ$)/, use創新 ? 'ꡖ' : 'ꡗ'], // 恚、抉 ʔ͡j > ʔ。《通考》也如此
[/ꡝꡧ?(?=ꡟ(?!ꡠ)|ꡡ)/, ''], // 主要元音是 u、o 時,省略 w 母(ue 中的 u 不被視爲主要元音)
[/ꡦ+/, 'ꡦ'], // 不use創新時的潛在情況
];
const 古代對立未合併列表 = [
[/ꡋ(?=ꡞ$|ꡟꡠ|ꡠꡏ)/, 'ꡇ', '孃母'], // 泥捼鮎 n > 尼諉黏 ɲ
[/(?<=[ꡭ])ꡠ$/, 'ꡦ', '疑母'], // 謁 je > 齧 jje
[/(?<=[ꡜ])ꡦꡟꡃ/, 'ꡧꡞꡃ', '梗攝 B類 平聲'], // 兄 ħwiŋ > 胷 ħjuŋ
[/(?<=[ꡖ])ꡟꡃ/, 'ꡧꡟꡃ', '梗攝'], // 翁 ʔuŋ > 泓 ʔwuŋ
[/(?<=[ꡆꡅ])ꡦꡋ/, 'ꡠꡋ', '知組 平去聲'], // 饘 tʂjen > 邅 tʂen
[/(?<=[ꡅ])ꡠꡓ/, 'ꡦꡓ', '徹母 開口'], // 弨 tʂʰew > 超 tʂʰjew
];
let 聲母 = '';
Object.keys(聲母字典).forEach(e => { if (擬音.startsWith(e) && e.length > 聲母.length) 聲母 = e; });
擬音 = 擬音.replace(聲母, 聲母字典[聲母]);
後處理替換列表.forEach(e => 擬音 = 擬音.replace(...e));
if (use創新) 古代對立未合併列表.forEach(e => { if (is(e[2])) 擬音 = 擬音.replace(e[0], e[1]); });
return 擬音;
}
function 八思巴字to轉寫(str) {
const 八思巴字轉寫列表 = {
'八思巴字': [
'ꡂ', 'ꡁ', 'ꡀ', 'ꡃ',
'ꡊ', 'ꡉ', 'ꡈ', 'ꡋ',
'ꡆ', 'ꡅ', 'ꡄ', 'ꡇ',
'ꡎ', 'ꡍ', 'ꡌ', 'ꡏ', 'ꡰ', 'ꡤ', 'ꡓ',
'ꡒ', 'ꡑ', 'ꡐ', 'ꡛ', 'ꡕ', 'ꡮ', 'ꡚ',
'ꡜ', 'ꡣ', 'ꡯ', 'ꡖ', 'ꡗ', 'ꡝ', 'ꡭ', 'ꡙ', 'ꡔ',
'ꡞ', 'ꡟ', 'ꡠ', 'ꡡ', 'ꡦ', 'ꡧ', 'ꡨ',
],
'照那斯圖 1987 轉寫 ⭐': [
'g', 'kʻ', 'k', 'ŋ',
'd', 'tʻ', 't', 'n',
'dž', 'tšʻ', 'tš', 'ň',
'b', 'pʻ', 'p', 'm', 'hu̯', 'ħu̯', 'w',
'dz', 'tsʻ', 'ts', 's', 'z', 'š₂', 'š₁',
'h', 'ɣ', 'ħ', 'ꞏ', 'j̊', 'ʼ', 'j', 'l', 'ž',
'i', 'u', 'e', 'o', 'ė', 'u̯', 'i̯',
],
'吉池孝一 2005 轉寫': [
'g', 'kʻ', 'k', 'ŋ',
'd', 'tʻ', 't', 'n',
'ǰ', 'čʻ', 'č', 'ň',
'b', 'pʻ', 'p', 'm', 'f2', 'f1', 'v',
'j', 'cʻ', 'c', 's', 'z', 'š2', 'š1',
'h2', 'γ', 'h1', 'ꞏ', 'y2', 'ʼ', 'y1', 'l', 'ž',
'i', 'u', 'ė', 'o', 'e', 'ŭ', 'ĭ',
],
'Coblin 2007 轉寫': [
'g', 'kh', 'k', 'ng',
'd', 'th', 't', 'n',
'j', 'ch', 'c', 'ñ',
'b', 'ph', 'p', 'm', 'Hw', 'hw', 'w',
'dz', 'tsh', 'ts', 's', 'z', 'sh', 'zh',
'ʰ', 'X', 'H', '\'', 'Y', 'x', 'y', 'l', 'Zh',
'i', 'u', 'e', 'o', 'ÿ', 'w', 'y',
],
'Coblin 2007 擬音': [
'k', 'kʼ', 'ɡ', 'ŋ',
't', 'tʼ', 'd', 'n',
'tʂ', 'tʂʼ', 'dʐ', 'ȵ',
'p', 'pʼ', 'b', 'm', 'f', 'v', 'ʋ',
'ts', 'tsʼ', 'dz', 's', 'z', 'ʂ', 'ʐ',
'ʰ', 'ɣ', 'ɣj', 'ʔ', 'ʔj', 'ɦ', 'j', 'l', 'r',
'i', 'u', 'ɛ', 'ɔ', 'ÿ', 'w', 'j',
],
'沈鐘偉 2008/2015 轉寫兼擬音': [
'k', 'kʰ', 'ɡ', 'ŋ',
't', 'tʰ', 'd', 'n',
'tʃ', 'tʃʰ', 'dʒ', 'ɲ',
'p', 'pʰ', 'b', 'm', 'f', 'v', 'ʋ',
'ts', 'tsʰ', 'dz', 's', 'z', 'ʃ', 'ʒ',
'h', 'ɦ', 'ɦj', '0', 'j', '0̲', 'j̲', 'l', 'r',
'i', 'u', 'e', 'o', 'ɛ', 'w', 'j',
],
'unt 2023 轉寫 ⭐': [
'k', 'kʰ', 'ɡ', 'ŋ',
't', 'tʰ', 'd', 'n',
'tʂ', 'tʂʰ', 'dʐ', 'ɲ',
'p', 'pʰ', 'b', 'm', 'f', 'v', 'w',
'ts', 'tsʰ', 'dz', 's', 'z', 'ʂ', 'ʐ',
'ħ', 'ʁ', 'ɣ', 'ʔ', 'ʔ͡j', 'ɦ', 'j', 'l', 'ɻ',
'i', 'u', 'e', 'o', 'jE', 'w', 'j',
],
};
const 後處理替換列表字典 = {
'照那斯圖 1987 轉寫 ⭐': [['ėa', 'ė'], ['bꞏo', 'boꞏo']].concat(
選項['ꡠ、ꡦ 的轉寫'] === 'ꡠė ꡦe(八思巴字蒙古語風格)' ? [['ė', 'E'], ['e', 'ė'], ['E', 'e'],] : []
),
'吉池孝一 2005 轉寫': [
[/(?<=[fšhy])1/g, 選項.聲母附加數字?.split(' ')[0]],
[/(?<=[fšhy])2/g, 選項.聲母附加數字?.split(' ')[1]],
],
'Coblin 2007 轉寫': [[/^ʰ/, 'h'], ["b'o", "ba'o"]],
'Coblin 2007 擬音': [
[/ʋ$/, 'w'],
[/^ʰ/, 'x'], ['ʰa', 'A'], ['ʰi', 'ə'], [/(?<=s|z)ə$/, 'ɿ'], [/ə$/, 'ʅ'],
['ÿaŋ', 'jaŋ'], ['ÿa', 'jɛ'], ['ÿ', 'j'], ['jj', 'j'],
['juŋ', 'yuŋ'], ['ju', 'y'], ['jɔ', 'yɔ'], [/jwj|jw|wj/, 'y'],
[/^y/, 'jy'],
['uɛ', 'uɛ̌'],
],
'沈鐘偉 2008/2015 轉寫兼擬音': [
[/ɦj(?=w?ɛ)/, 'ɦ'],
['ɛi', 'ji'], ['ɛe', 'je'],
['ɛu', 'y'], ['ɛo', 'ø'], ['ɛa', 'ɛ'],
[/(?<!^)hi/, 'ə'], [/ə$/, 'ɨ'],
[/(?<!^)ha/, 'ɑ'],
[/\u0332$/, ''], [/^(u|o)/, '$&\u0332'], // 下橫線表示陽調
[/ʋ$/, 'w'],
[/(?<=u|y)e/, 'j'],
['\u0332', 選項.零聲母陽調下加],
['p0o', 'pa0o'],
],
'unt 2023 轉寫 ⭐': [['Ea', 'e'], ['Ee', 'ee'], ['E', '']],
};
// 無元音字母時,補上一個 a
if (![...'ꡞꡟꡠꡡ'].some(元音 => (str.includes(元音)))) {
if (str.length > 1 && 'ꡏꡋꡃꡭꡓ'.includes(str.slice(-1))) {
// 有韻尾則 a 補在韻尾前
str = str.slice(0, -1) + 'a' + str.slice(-1);
} else {
// 否則 a 補在最後
str += 'a';
}
}
const 八思巴字轉寫字典 = Object.fromEntries(
八思巴字轉寫列表.八思巴字.map((e, i) => [e, 八思巴字轉寫列表[選項.顯示][i]])
);
str = [...str].map(e => 八思巴字轉寫字典[e] ?? e).join('');
後處理替換列表字典[選項.顯示].forEach(pair => str = str.replace(...pair));
return str;
}
const 擬音 = get擬音();
if (選項.顯示 === 'unt 2023 擬音 ⭐') return 擬音;
const 八思巴字 = 擬音to八思巴字(擬音);
return 選項.顯示 === '八思巴字' ? 八思巴字 : 八思巴字to轉寫(八思巴字);