-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathpanwuyun.js
132 lines (122 loc) · 5.93 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
130
131
132
/* 潘悟雲擬音
*
* 3 個版本:
*
* - 潘悟雲. 2000. 漢語歷史音韻學. 上海: 上海教育出版社.
* - 潘悟雲 & 張洪明. 2013. 漢語中古音. 語言研究 33(2), 1–7.
* - 潘悟雲. 2023. 漢語古音手冊. 上海: 中西書局.
*
* @author unt
*/
/** @type { 音韻地位['屬於'] } */
const is = (...x) => 音韻地位.屬於(...x);
/** @type { 音韻地位['判斷'] } */
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聲調();