forked from nk2028/tshet-uinh-examples
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpanwuyun.js
129 lines (120 loc) · 5.85 KB
/
panwuyun.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
/* 潘悟雲擬音
*
* 3 個版本:
*
* - 潘悟雲. 2000. 漢語歷史音韻學. 上海: 上海教育出版社.
* - 潘悟雲 & 張洪明. 2013. 漢語中古音. 語言研究 33(2), 1–7.
* - 潘悟雲. 2023. 漢語古音手冊. 上海: 中西書局.
*
* @author unt
*/
const is = (...x) => 音韻地位.屬於(...x);
const when = (...x) => 音韻地位.判斷(...x);
const is2000 = Boolean(選項.版本?.includes('2000'));
const is2013 = Boolean(選項.版本?.includes('2013'));
const is2023 = 選項.版本?.includes('2023') ?? true;
const 三C介音 = 選項.非前三等介音 ? 選項.非前三等介音.split('(')[0] : 'i';
if (!音韻地位) return [
['版本', [3,
'2000:漢語歷史音韻學',
'2013:漢語中古音',
'2023:漢語古音手冊',
], {
description:
is2000 && '《漢語歷史音韻學》勘誤\n生母作 ʃ,係誤植,應爲 ʂ。在推導方案中已更正' ||
is2013 && '《漢語中古音》勘誤\n(1)\u2002從母聲母表作 ʣ,係排版錯誤,此處依正文作 dz\n(2)\u2002俟母聲母表未列,此處補上,爲 ʐ' ||
is2023 && '《漢語古音手冊》(第一版)勘誤\n(1)\u2002莊組拼重紐三等韻未加 ɨ 介音,再版將加上\n(2)\u2002燭韻作 i̯ʊk,附加符號多餘,再版將去除\n(3)\u2002微韻作 ɤi,遺漏 i 介音,再版將加上\n以上在推導方案中已更正',
}],
['非前三等介音', [1, 'i(原書簡寫)', 'ɨ(實際音值)']],
['聲調記號', [2, '隱藏', '五度符號', '調值數字'], {
description:
is2000 && '《漢語歷史音韻學》未給具體調值,此處依《漢語中古音》(2013)調值' ||
is2023 && '《漢語古音手冊》未給出調值,此處依《漢語中古音》(2013)調值' || '',
}],
['送氣記號', [1, 'ʰ(通用)', 'h(原書)'], { hidden: !is2000 }],
['支韻', [1, 'iɛ(簡寫)', 'iᵉ(實際音值)'], { hidden: !is2000 }],
['虞韻', [2, 'io(簡寫)', 'iʊ(實際音值)'], { hidden: !is2000 }],
];
/* 韻典網與本方案 2000 擬音不同之處:
*
* - 歌一合誤作 uɑ,應爲 ʷɑ
* - 部分祭合、薛合誤作 iei、iet,應爲 iɛi、iɛt
* - 幫組陽韻歸合口。原書雖未指明,但暗示爲開口;本方案歸開口
* - 送氣記號改作 ʰ,原書作 h;本方案可自選
* - 支韻、虞韻作 iɛ、io,原書韻母擬音比較表作 iᵉ、iʊ;本方案可自選
*/
function get聲母() {
let 聲母 = {
幫: 'p', 滂: 'pʰ', 並: 'b', 明: 'm',
端: 't', 透: 'tʰ', 定: 'd', 泥: 'n', 來: 'l',
知: 'ʈ', 徹: 'ʈʰ', 澄: 'ɖ', 孃: 'ɳ',
見: 'k', 溪: 'kʰ', 羣: 'ɡ', 疑: 'ŋ',
影: 'ʔ', 曉: 'h', 匣: 'ɦ', 云: is2023 ? 'ɦᶤ' : 'ɦ',
精: 'ts', 清: 'tsʰ', 從: 'dz', 心: 's', 邪: 'z',
莊: 'tʂ', 初: 'tʂʰ', 崇: 'dʐ', 生: 'ʂ', 俟: 'ʐ',
章: 'tɕ', 昌: 'tɕʰ', 常: 'dʑ', 書: 'ɕ', 船: 'ʑ', 日: 'ȵ', 以: 'j',
}[音韻地位.母];
if (is2000) 聲母 = 聲母.replace('ʰ', 選項.送氣記號[0]);
return 聲母;
}
function get韻母() {
const 韻 = 音韻地位.韻.replace('凡', '嚴');
const 元音表 = {
ɪ: ' 臻 ',
i: '脂 侵真 幽', ɨ: '之蒸 殷微尤', u: '侯東 文 ',
e: ' 青添先齊蕭', ə: ' 登覃痕咍 ', o: '模冬 魂灰 ',
ᴇ: '支清鹽仙祭宵', ɤ: '魚 元 ', ʊ: '虞鍾 ',
ɛ: '佳耕咸山皆 ', a: ' 陽嚴 廢 ', ɔ: ' 江 ',
æ: '麻庚銜刪夬肴', ɑ: '歌唐談寒泰豪',
};
const 韻尾列表 = [''].concat(is`舒聲` ? [...'ŋmniu'] : [...'kpt']);
let 韻核 = Object.keys(元音表).find(e => 元音表[e].includes(韻));
let 韻尾 = 韻尾列表[元音表[韻核].indexOf(韻)];
let 介音 = '';
if (is`合口` && ![...'mpu'].includes(韻尾) && ![...'uoʊɔ'].includes(韻核))
介音 += 'ʷ';
if (is`幫組` && ![...'ŋkmpu'].includes(韻尾) && [...'ɨəɤaɑ'].includes(韻核) && !is`泰韻` || !is2023 && is`凡韻`)
介音 += is2013 ? 'u̯' : 'ʷ';
// 云母 B 類不寫介音
// 《漢語歷史音韻學》韻母擬音比較表庚三直接寫作 B 類,但此處拼銳音和云母時不加介音
// 《漢語中古音》《漢語古音手冊》庚三作無重紐三等,此處暫歸 C 類
if (!is2000 && is`庚韻 三等`) {
介音 += 三C介音;
} else {
if (is`二等 或 B類 非 蒸幽韻 非 云母` || is2023 && [...'ɪiᴇæ'].includes(韻核) && is`莊組 三等 非 庚韻`)
介音 += is2000 ? 'ɯ' : is2013 ? 'ɣ' : is`二等` ? 'ᵚ' : 'ɨ';
if (is`三等` && ![...'ɪiɨ'].includes(韻核) && !介音.includes('ɨ') || is`端組 麻庚清韻 四等`)
介音 += [...'ᴇæ'].includes(韻核) ? 'i' : 三C介音;
}
if ([...'oʊ'].includes(韻核))
介音 += is2013 ? 'u̯' :
介音 ? '' : is2000 ? 'u' : 'u̯';
if (is2023 && is`凡韻`)
介音 += 'u̯';
// 韻核相關調整
if (is2000) {
const 韻核鏈移列表 = [...'ᴇɛæaɐ']; // “鏈移”只是比喻
if (韻核鏈移列表.includes(韻核)) 韻核 = 韻核鏈移列表[韻核鏈移列表.indexOf(韻核) + 1];
韻核 = {
尤: 'i', 幽: 'ɨ', 侯: 'əu',
支: 選項.支韻[1], 魚: 'ɔ', 虞: 選項.虞韻[1],
元: 'ɐ', 鍾: 'o',
}[音韻地位.韻] ?? 韻核;
} else if (is2013) {
韻核 = 韻核.replace('ʊ', 'o̝');
} else { // is2023
韻核 = {
尤: 'i', 幽: 'ɨ', 微: 'ɤ',
支: 'e',
}[音韻地位.韻] ?? 韻核;
if (is`微韻`) 介音 += 三C介音;
}
return 介音 + 韻核 + 韻尾;
}
function get聲調() {
return 選項.聲調記號 === '隱藏' ? '' : {
'五度符號': ['˧', '˧˥', '˥˩', '꜊'],
'調值數字': ['³³', '³⁵', '⁵¹', '³'],
}[選項.聲調記號]['平上去入'.indexOf(音韻地位.聲)];
}
return get聲母() + get韻母() + get聲調();