-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathblankego.js
executable file
·214 lines (192 loc) · 7.48 KB
/
blankego.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
/* 有女羅馬字(TshetUinh.js v0.15 對應)
*
* https://github.com/syimyuzya/guangyun0704/
* https://zhuanlan.zhihu.com/p/385113829
*
* 本版說明:
*
* - 參照有女同車原版《〈廣韻〉全字表》(下稱「原表」),依現今之構擬體系有所修訂
* - 原表有若干小韻的音韻地位及拼法不規整:
* - 旨韻(脂韻上聲)若干精、章組小韻,韻母寫為B類,蓋依反切下字硬切所致,與他處(包括脂韻平、去聲)精章組均用A類不合,現修正
* - 真韻上去聲莊組開口,原表及拼寫均析為臻韻上去聲,惟軫韻(真韻上聲)崇母開口「濜」小韻遺漏,現修正
* - 術韻莊母合口「𠭴」小韻,韻母寫為A類,與他處莊組均用B類不合,現修正
* (此蓋因該小韻列於術韻而非質韻,但術韻亦有「率」小韻用B類拼作 shwyt,故當以B類為正)
* - 原表有若干種邊緣音韻地位,於目前資料中已不存在:
* - 「碧」小韻原表處理為清韻合口作 pvek,與「辟」小韻開合對立。今修正為庚韻
* - 原表有若干精組拼二等、莊組拼一四等、章組拼非三等之音韻地位。大部分都是訛字、訛切,今均校正(另有蟹攝部分小韻須特別處置,見下述)
* - 現今構擬之部分音韻地位,為原表當時所無,需擴展原系統方可表示。各項擴展預設均不啟用,可自行設定啟用:
* - 祭、廢韻平上聲:均為章組或云以日母,《廣韻》寄於齊、灰、咍韻,原表亦按齊灰咍韻拼寫,但亦可選擇按祭、廢韻拼寫
* (實際上祭、齊韻開口拼這些聲母時拼寫並無差別,僅合口與咍、廢韻有差別)
* - 並母陽韻A類(「𩦠」小韻),原表視作普通並母陽韻拼作 bvank,但亦可按開口拼作 biank 以作區分
* - 此外,尚有部分音韻地位及相關對立無法表示,且並無簡易的擴展方式可用:
* - 蒸、幽韻重紐,見於《王三》及《毛詩音》反切等,《廣韻》不分,原表亦不分。該對立無法表示
* (原因是幽韻拼寫為 yu(-u 尾)但元音並不能換用 i,因為 iu、iv 分別被虞、魚韻佔據)
*
* @author SyiMyuZya
*/
const { 啟用擴展 } = 選項;
// 可調整參數
if (!音韻地位) {
return [
// 注意:從 JS API 調用該方案時,該項須為 true,否則擴展選項均會忽略
['啟用擴展', false],
啟用擴展 ? '擴展' : undefined,
// prettier-ignore
['祭廢韻平上聲', false, {
hidden: !啟用擴展,
description: '- 停用(預設):依原表,按齊灰咍韻拼寫\n- 啟用:依祭廢韻拼寫',
}],
// prettier-ignore
['陽韻脣音A類', false, {
hidden: !啟用擴展,
description: '- 停用(預設):依原表,按普通陽韻拼寫\n- 啟用:拼為開口',
}],
];
}
const is = (...x) => 音韻地位.屬於(...x);
// 擴展:陽韻脣音A類
if (!啟用擴展 || !選項.陽韻脣音A類) {
if (is`陽韻 脣音 A類`) {
音韻地位 = 音韻地位.調整('C類');
}
}
// 聲母
// prettier-ignore
let 母 = {
幫: 'p', 滂: 'ph', 並: 'b', 明: 'm',
端: 't', 透: 'th', 定: 'd', 泥: 'n',
知: 't', 徹: 'th', 澄: 'd', 孃: 'n',
精: 'z', 清: 'c', 從: 'dz', 心: 's', 邪: 'sz',
莊: 'tr', 初: 'ch', 崇: 'dr', 生: 'sh', 俟: 'zh',
章: 'tj', 昌: 'tc', 船: 'dj', 日: 'r', 書: 'sj', 常: 'zj',
見: 'k', 溪: 'q', 羣: 'g', 疑: 'ng',
影: '', 曉: 'x', 匣: 'h', 云: 'h',
以: 'j',
來: 'l',
}[音韻地位.母];
if (母 === undefined) {
throw new Error(`無聲母規則: ${音韻地位.描述}`);
}
// 韻尾
let 尾 = 音韻地位.判斷(
[
['遇果假攝 或 支脂之佳韻', ''],
['通江宕梗曾攝', 'ng'],
['蟹攝 或 微韻', 'i'], // 已排除佳韻
['臻山攝', 'n'],
['效流攝', 'u'],
['深咸攝', 'm'],
],
`無韻尾規則: ${音韻地位.描述}`,
);
// 主元音
let 元 = 音韻地位.判斷(
[
['歌麻 唐庚陽 泰夬廢 寒刪元 豪肴 談銜嚴凡韻', 'a'],
['佳支 青耕清 齊皆祭 先山仙 蕭宵 添咸鹽 韻', 'e'],
[' 脂 真 幽 侵 韻', 'i'],
[' 臻 韻', 'yi'],
[' 登江蒸 咍灰微 痕魂殷 侯尤 覃 韻', 'o'],
[' 之 韻', 'io'], // 之韻 io 的 i 視為主元音
['模虞 東 文 韻', 'u'],
[' 魚 冬 鍾 韻', 'v'],
].map(([cond, ...rest]) => [cond.replace(/ /g, ''), ...rest]),
`無主元音規則: ${音韻地位.描述}`,
);
if (!啟用擴展 || !選項.祭廢韻平上聲) {
if (is`廢韻 平上聲`) {
元 = 'o';
}
}
// 介音
// 拼寫上使用合口介音的場合
const 合口 = is`脣音`
? is`C類 ${元 === 'a'} 或 微韻 或 歌寒灰魂韻`
: is`合口 非 虞文韻`;
let 介音等 = is`端組 四等 非 ${TshetUinh.表達式.四等韻}` ? '三' : 音韻地位.等;
if (!啟用擴展 || !選項.祭廢韻平上聲) {
if (is`祭廢韻 平上聲`) {
介音等 = '一'; // 一、四等介音拼寫相同
}
}
let 介 = {
一: ['', 'u'],
二: ['e', 'o'],
三: ['i', 'v'],
四: ['', 'u'],
}[介音等][+合口];
if (介 === 'i' && (元.startsWith('i') || 元.startsWith('y'))) {
介 = '';
} else if (介 === 'e' && 元 === 'e') {
// 二等開口 e 元音寫作 ae
介 = '';
元 = 'ae';
} else if (介 === 'o' && 元 === 'e') {
// oe 上聲要雙寫 o,亦視作整體
介 = '';
元 = 'oe';
}
// 三等重紐、重韻
if (
is('麻庚幽韻 三四等') || // 重韻
is('B類 非 蒸韻') || // 重紐
(['i', 'e'].includes(元) && is`三等 知莊組 非 (知組 (清韻 或 真韻 合口))`) // 清、諄韻知組視作A類
) {
介 = {
i: 'y',
v: 'w',
'': '', // 主元音為 i 時
}[介];
if (介 === undefined) {
throw new Error(`無重紐重韻規則: ${音韻地位.描述}`);
}
if (元 === 'i') {
元 = 'y';
}
}
// 拼寫規則
if (is('章組 或 日以母')) {
// 章組、日以母省略 i 介音,麻三亦省略 y 介音
if (介.startsWith('i')) {
介 = 介.slice(1);
} else if (is('麻韻 三等') && !合口) {
介 = '';
}
} else if (is('莊組')) {
// 莊組拼 ea 省 e,拼 io, iu, iv 省 i(不含之韻),拼 ye 省 y(支韻除外)
if (
(介 === 'e' && 元 === 'a') ||
(介 === 'i' && ['o', 'u', 'v'].includes(元)) ||
(介 === 'y' && 元 === 'e' && 尾 !== '')
) {
介 = '';
}
}
// 聲調
if (音韻地位.聲 === '入') {
尾 = {
m: 'p',
n: 't',
ng: 'k',
}[尾];
} else if (音韻地位.聲 !== '平') {
if (['i', 'u', 'ng'].includes(尾)) {
尾 = {
i: ['j', 'y'],
u: ['v', 'w'],
ng: ['nk', 'nq'],
}[尾][Number(音韻地位.聲 === '去')];
} else if (音韻地位.聲 === '上') {
元 = ['io', 'ae', 'oe'].includes(元) ? 元[0] + 元 : 元 + 元.slice(-1);
} else if (音韻地位.聲 === '去' && ['m', 'n'].includes(尾)) {
尾 = 尾 + 尾;
} else if (音韻地位.聲 === '去' && 尾 === '') {
元 = 元 + 'h';
} else {
throw new Error(`無聲調規則: ${音韻地位.描述}`);
}
}
if (尾 === undefined || 元 === undefined) {
throw new Error(`無聲調規則: ${音韻地位.描述}`);
}
return `${母}${介}${元}${尾}`;