-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpolyhedron.js
161 lines (146 loc) · 6.03 KB
/
polyhedron.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
/* 古韻羅馬字
*
* https://zh.wikipedia.org/wiki/User:Polyhedron/中古漢語拼音
*
* @author Ayaka & unt
*/
const is = (...x) => 音韻地位.屬於(...x);
const when = (...x) => 音韻地位.判斷(...x);
if (!音韻地位) return [
'保留舊資料中的以下音韻地位\n選項只對小韻首字有效!此外,舊資料由反切訛誤帶來的錯誤音韻地位,本方案不考慮',
['幫組咍韻\n新資料調整爲灰韻', true],
['幫組以外聲母拼凡韻\n新資料僅幫組拼凡韻,其他聲母拼嚴韻', true],
['爸同開口|「爸」同開口\n古韻羅馬字其餘幫組歌韻按合口拼', true],
['爹歸知母|「爹」歸知母\n爹 tria 知母,新資料調整爲端母 tia', false],
[['端知精莊類隔切|端知、精莊類隔切',
"新資料調整爲音和切:",
"𩬳 tr'uaix 知母一等 → 端母 tuaix",
"鯫 zr'ux 崇母一等 → 從母 zux",
"啐 ch'ruad 清母二等 → 初母 chruad",
"𣤩 thr'ek 徹母四等 → 透母 thek",
"另舊資料有虥 z'ren 從母二等、虥 zren 兩小韻,字頭重複,此處只保留崇母 zren 一音",
].join('\n'), false],
[['特殊類隔切',
"新資料調整爲音和切:",
"㺗 chj'ren 昌母二等 → 初母 chren",
"疓 nj'aix 日母一等 → 泥母 naix",
"𩭿 nj'rat 日母二等 → 孃母 nrat",
"䔾 j'at 以母一等 → 匣母 ghat",
].join('\n'), true],
[['其他邊緣音節',
"新資料調整爲普通音節:",
"㶒 sj'amx 書母一等 → 三等 sjemx",
"譫 cj'ap 章母一等 → 三等 cjep",
"𡰝 gruen 羣母二等 → 三等 gyen",
"𧾛 gruek 羣母二等 → 三等 gyek",
"唻 lrai 來母二等 → 一等 lai",
].join('\n'), true],
];
function 聲母規則() {
let 聲母 = when([
[選項.爹歸知母 && '端母 麻韻 四等', 'tr'], // 802
[選項.端知精莊類隔切, [
// 574 虥 z'ren 字頭與 559 虥 zren 重複,無法區別,跳過
[字頭 === '𩬳' && '端母', "tr'"], // 1439
[字頭 === '鯫' && '從母 上聲', "zr'"], // 1972
[字頭 === '啐' && '初母', "ch'"], // 2506
[字頭 === '𣤩' && '透母', "thr'"], // 3693
]],
[選項.特殊類隔切 ?? true, [
[字頭 === '㺗' && '初母', "chj'"], // 566
[字頭 === '疓' && '泥母', "nj'"], // 1462
[字頭 === '䔾' && '匣母', "j'"], // 3406
[字頭 === '𩭿' && '孃母', "nj'"], // 3466
]],
['云母 蟹攝 非 去聲', 'i'], // 1444(倄)
['', {
'幫': 'p', '滂': 'ph', '並': 'b', '明': 'm',
'端': 't', '透': 'th', '定': 'd', '泥': 'n', '來': 'l',
'知': 'tr', '徹': 'thr', '澄': 'dr', '孃': 'nr',
'見': 'k', '溪': 'kh', '羣': 'g', '疑': 'ng',
'影': 'q', '曉': 'h', '匣': 'gh', '云': '',
'精': 'c', '清': 'ch', '從': 'z', '心': 's', '邪': 'zs',
'莊': 'cr', '初': 'chr', '崇': 'zr', '生': 'sr', '俟': 'zsr',
'章': 'cj', '昌': 'chj', '常': 'zj', '書': 'sj', '船': 'zsj', '日': 'nj', '以': 'j',
}[音韻地位.母]],
], '無聲母規則', true);
if (is`端組 二三等`) 聲母 += "'";
return 聲母;
}
function 韻母規則() {
let 韻母 = when([
[選項.其他邊緣音節 ?? true, [
[字頭 === '㶒' && '鹽韻', "'am"], // 2021
[字頭 === '譫' && '鹽韻', "'am"], // 3808
[字頭 === '𡰝' && '仙韻', 'ren'], // 570
[字頭 === '𧾛' && '庚韻', 'reng'], // 3647
[字頭 === '唻' && '咍韻', 'rai'], // 355
]],
['祭韻 非 去聲', "'e"],
['廢韻 非 去聲', "'ai"],
['脂韻', 'ii'], ['微韻', 'ioi'],
['齊韻', 'e'], ['咍灰韻', 'ai'],
['祭韻', 'ied'], ['廢韻', 'iad'],
['皆韻', 'rai'],
['夬韻', 'rad'], ['泰韻', 'ad'],
['真臻韻', 'in'], ['殷文韻', 'ion'],
['先韻', 'en'], ['痕魂韻', 'on'],
['仙韻', 'ien'], ['元韻', 'ian'],
['山韻', 'ren'],
['刪韻', 'ran'], ['寒韻', 'an'],
['幽韻', 'y'], ['尤韻', 'iu'], ['侯韻', 'u'],
['蕭韻', 'eu'],
['宵韻', 'ieu'],
['肴韻', 'rau'], ['豪韻', 'au'],
['侵韻', 'im'],
['添韻', 'em'], ['覃韻', 'om'],
['鹽韻', 'iem'], ['嚴凡韻', 'iam'],
['咸韻', 'rem'],
['銜韻', 'ram'], ['談韻', 'am'],
['之韻', 'i'],
['模韻', 'o'],
['支韻', 'ie'], ['魚虞韻', 'io'],
['佳韻', 're'], ['麻歌韻 三四等', 'ia'],
['麻韻', 'ra'], ['歌韻', 'a'],
['蒸韻', 'ing'],
['青韻', 'eng'], ['登韻', 'ong'],
['耕韻', 'reng'], ['庚清韻 三四等', 'ieng'],
['庚韻', 'rang'],
['東韻 三等', 'iung'], ['東韻', 'ung'],
['冬韻', 'uung'],
['鍾韻', 'yung'],
['江韻', 'rung'], ['陽韻', 'iang'],
['唐韻', 'ang'],
], '無韻母規則', true);
if (is`合口`
|| is`幫組 C類` && (韻母.startsWith('io') || 韻母.startsWith('ia')) // 微廢元歌陽韻
|| is`幫組 灰魂寒歌凡韻`
|| (選項.幫組以外聲母拼凡韻 ?? true) && is`嚴韻` && [...'凵𠑆猲䎎𦑣'].includes(字頭) // 2089, 2091, 3872, 3873, 3874
) {
if (韻母.startsWith('i')) {
韻母 = 'y' + 韻母.slice(1);
} else if ((選項.幫組咍韻 ?? true) && is`幫組 灰韻` && [...'𤗏啡䆀俖倍䆀'].includes(字頭)) { // 392, 1452, 1456, 1458, 1465, 2530
// Do nothing
} else if ((選項.爸同開口 ?? true) && is`並母 歌韻` && 字頭 === '爸') { // 1761
// Do nothing
} else {
韻母 = 'u' + 韻母;
}
韻母 = 韻母.replace(/u([r']*)/, '$1u');
}
if (is`支脂祭真仙宵清侵鹽韻 A類`) 韻母 = 'j' + 韻母; // 即三 AB 韻除去幽麻韻
if (is`入聲`) 韻母 = 韻母.replace('ng', 'k').replace('n', 't').replace('m', 'p');
return 韻母;
}
function 聲調規則() {
return when([
['上聲', 'x'],
['去聲', 'h'],
['', ''],
]);
}
let 音節 = 聲母規則() + 韻母規則() + 聲調規則();
音節 = 音節.replace('rr', 'r');
音節 = 音節.replace(/ji(?=[aeou])/, 'j');
音節 = 音節.replace('dh', 'd'); // 「次入韻」
return 音節;