@fe-free/tool 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # @fe-free/tool
2
+
3
+ ## 1.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - feat: first commit
package/package.json ADDED
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@fe-free/tool",
3
+ "version": "1.0.1",
4
+ "description": "",
5
+ "main": "./src/index.ts",
6
+ "author": "",
7
+ "license": "ISC",
8
+ "publishConfig": {
9
+ "access": "public",
10
+ "registry": "https://registry.npmjs.org/"
11
+ },
12
+ "dependencies": {
13
+ "lodash-es": "^4.17.21"
14
+ },
15
+ "peerDependencies": {},
16
+ "scripts": {
17
+ "test": "echo \"Error: no test specified\" && exit 1"
18
+ }
19
+ }
package/src/index.ts ADDED
@@ -0,0 +1 @@
1
+ export { pinyin, pinyinFilter, pinyinMatch } from './pinyin';
@@ -0,0 +1,37 @@
1
+ import { pinyin } from './pinyin';
2
+ import { filter, isString, map } from 'lodash-es';
3
+
4
+ const defaultWhat = (v) => v;
5
+ /** 字符串匹配,中文首字母拼音匹配,字母小写匹配 */
6
+ function pinyinFilter<T>(list: T[], filterText: string, what: (v: T) => string = defaultWhat) {
7
+ if (!filterText) {
8
+ return list || [];
9
+ }
10
+
11
+ filterText = filterText.toLowerCase();
12
+
13
+ return filter(list, (v) => {
14
+ return pinyinMatch(what(v), filterText);
15
+ });
16
+ }
17
+
18
+ function pinyinMatch(value: string, filterText: string) {
19
+ let w = value;
20
+ // 兼容
21
+ if (!isString(w)) {
22
+ w = '';
23
+ }
24
+ w = w.toLowerCase();
25
+ // 全拼集合
26
+ const normal = map(pinyin(w), (value) => value[0]).join('');
27
+ // 首字母集合
28
+ const firstLetter = map(pinyin(w, 'first_letter'), (value) => value[0]).join('');
29
+
30
+ return (
31
+ w.indexOf(filterText) > -1 ||
32
+ normal.indexOf(filterText) > -1 ||
33
+ firstLetter.indexOf(filterText) > -1
34
+ );
35
+ }
36
+
37
+ export { pinyinFilter, pinyinMatch };
@@ -0,0 +1,63 @@
1
+ ---
2
+ nav:
3
+ title: '组件'
4
+ order: 15
5
+ group: 'tool'
6
+ toc: content
7
+ ---
8
+
9
+ # pinyin
10
+
11
+ 将汉字转换为拼音
12
+
13
+ ## 场景
14
+
15
+ 输出拼音
16
+
17
+ ```tsx
18
+ import { pinyin } from '@fe-free/tool';
19
+
20
+ export default () => {
21
+ return <div>{pinyin('你好')}</div>;
22
+ };
23
+ ```
24
+
25
+ 输出首拼音
26
+
27
+ ```tsx
28
+ import { pinyin } from '@fe-free/tool';
29
+
30
+ export default () => {
31
+ return <div>{pinyin('你好', 'first_letter')} </div>;
32
+ };
33
+ ```
34
+
35
+ 匹配
36
+
37
+ ```tsx
38
+ import { pinyinMatch } from '@fe-free/tool';
39
+
40
+ export default () => {
41
+ return (
42
+ <>
43
+ <div>{pinyinMatch('你好', 'nh') + ''}</div>
44
+ <div>{pinyinMatch('你好', 'wo') + ''} </div>
45
+ </>
46
+ );
47
+ };
48
+ ```
49
+
50
+ 过滤
51
+
52
+ ```tsx
53
+ import { pinyinFilter } from '@fe-free/tool';
54
+
55
+ export default () => {
56
+ return (
57
+ <>
58
+ <div>{pinyinFilter(['你好', ' 我们'], 'nh')} </div>
59
+ <div>{pinyinFilter(['你好', ' 我们'], 'wo')} </div>
60
+ </>
61
+ );
62
+ };
63
+ ```
@@ -0,0 +1,2 @@
1
+ export { pinyin } from './pinyin';
2
+ export { pinyinFilter, pinyinMatch } from './filter';
@@ -0,0 +1,728 @@
1
+ import { forEach } from 'lodash-es';
2
+
3
+ let instance;
4
+ const pinyin = (source: string, style?: 'first_letter') => {
5
+ if (instance) {
6
+ return instance(source, style);
7
+ }
8
+
9
+ const HANZI_TO_PINYIN = {
10
+ 阿: 'a',
11
+ 哎: 'ai',
12
+ 安: 'an',
13
+ 肮: 'ang',
14
+ 凹: 'ao',
15
+ 丷: 'ba',
16
+ 挀: 'bai',
17
+ 扳: 'ban',
18
+ 邦: 'bang',
19
+ 勹: 'bao',
20
+ 陂: 'bei',
21
+ 奔: 'ben',
22
+ 伻: 'beng',
23
+ 屄: 'bi',
24
+ 边: 'bian',
25
+ 灬: 'biao',
26
+ 憋: 'bie',
27
+ 汃: 'bin',
28
+ 冫: 'bing',
29
+ 癶: 'bo',
30
+ 峬: 'bu',
31
+ 嚓: 'ca',
32
+ 偲: 'cai',
33
+ 参: 'can',
34
+ 仓: 'cang',
35
+ 撡: 'cao',
36
+ 冊: 'ce',
37
+ 嵾: 'cen',
38
+ 曽: 'ceng',
39
+ 叉: 'cha',
40
+ 芆: 'chai',
41
+ 辿: 'chan',
42
+ 伥: 'chang',
43
+ 抄: 'chao',
44
+ 车: 'che',
45
+ 抻: 'chen',
46
+ 阷: 'cheng',
47
+ 吃: 'chi',
48
+ 充: 'chong',
49
+ 抽: 'chou',
50
+ 出: 'chu',
51
+ 欻: 'chua',
52
+ 揣: 'chuai',
53
+ 巛: 'chuan',
54
+ 刅: 'chuang',
55
+ 吹: 'chui',
56
+ 旾: 'chun',
57
+ 逴: 'chuo',
58
+ 呲: 'ci',
59
+ 匆: 'cong',
60
+ 凑: 'cou',
61
+ 粗: 'cu',
62
+ 汆: 'cuan',
63
+ 崔: 'cui',
64
+ 邨: 'cun',
65
+ 搓: 'cuo',
66
+ 咑: 'da',
67
+ 呆: 'dai',
68
+ 丹: 'dan',
69
+ 当: 'dang',
70
+ 刀: 'dao',
71
+ 嘚: 'de',
72
+ 扥: 'dun',
73
+ 灯: 'deng',
74
+ 氐: 'di',
75
+ 甸: 'dian',
76
+ 刁: 'diao',
77
+ 爹: 'die',
78
+ 丁: 'ding',
79
+ 丟: 'diu',
80
+ 东: 'dong',
81
+ 吺: 'dou',
82
+ 厾: 'du',
83
+ 耑: 'duan',
84
+ 垖: 'dui',
85
+ 吨: 'dun',
86
+ 多: 'duo',
87
+ 妸: 'e',
88
+ 诶: 'ei',
89
+ 奀: 'en',
90
+ 鞥: 'eng',
91
+ 儿: 'er',
92
+ 发: 'fa',
93
+ 帆: 'fan',
94
+ 匚: 'fang',
95
+ 飞: 'fei',
96
+ 分: 'fen',
97
+ 丰: 'feng',
98
+ 覅: 'fiao',
99
+ 仏: 'fo',
100
+ 紑: 'fou',
101
+ 夫: 'fu',
102
+ 旮: 'ga',
103
+ 侅: 'gai',
104
+ 甘: 'gan',
105
+ 冈: 'gang',
106
+ 皋: 'gao',
107
+ 戈: 'ge',
108
+ 给: 'gei',
109
+ 根: 'gen',
110
+ 刯: 'geng',
111
+ 工: 'gong',
112
+ 勾: 'gou',
113
+ 估: 'gu',
114
+ 瓜: 'gua',
115
+ 乖: 'guai',
116
+ 关: 'guan',
117
+ 光: 'guang',
118
+ 归: 'gui',
119
+ 丨: 'gun',
120
+ 呙: 'guo',
121
+ 哈: 'ha',
122
+ 咍: 'hai',
123
+ 佄: 'han',
124
+ 夯: 'hang',
125
+ 茠: 'hao',
126
+ 诃: 'he',
127
+ 黒: 'hei',
128
+ 拫: 'hen',
129
+ 亨: 'heng',
130
+ 噷: 'hm',
131
+ 叿: 'hong',
132
+ 齁: 'hou',
133
+ 乎: 'hu',
134
+ 花: 'hua',
135
+ 怀: 'huai',
136
+ 欢: 'huan',
137
+ 巟: 'huang',
138
+ 灰: 'hui',
139
+ 昏: 'hun',
140
+ 吙: 'huo',
141
+ 丌: 'ji',
142
+ 加: 'jia',
143
+ 戋: 'jian',
144
+ 江: 'jiang',
145
+ 艽: 'jiao',
146
+ 阶: 'jie',
147
+ 巾: 'jin',
148
+ 坕: 'jing',
149
+ 冂: 'jiong',
150
+ 丩: 'jiu',
151
+ 凥: 'ju',
152
+ 姢: 'juan',
153
+ 噘: 'jue',
154
+ 军: 'jun',
155
+ 咔: 'ka',
156
+ 开: 'kai',
157
+ 刊: 'kan',
158
+ 忼: 'kang',
159
+ 尻: 'kao',
160
+ 匼: 'ke',
161
+ 肎: 'ken',
162
+ 劥: 'keng',
163
+ 空: 'kong',
164
+ 抠: 'kou',
165
+ 扝: 'ku',
166
+ 夸: 'kua',
167
+ 蒯: 'kuai',
168
+ 宽: 'kuan',
169
+ 匡: 'kuang',
170
+ 亏: 'kui',
171
+ 坤: 'kun',
172
+ 扩: 'kuo',
173
+ 垃: 'la',
174
+ 来: 'lai',
175
+ 兰: 'lan',
176
+ 啷: 'lang',
177
+ 捞: 'lao',
178
+ 肋: 'le',
179
+ 勒: 'lei',
180
+ 崚: 'leng',
181
+ 哩: 'li',
182
+ 俩: 'lia',
183
+ 奁: 'lian',
184
+ 良: 'liang',
185
+ 撩: 'liao',
186
+ 毟: 'lie',
187
+ 拎: 'lin',
188
+ 伶: 'ling',
189
+ 溜: 'liu',
190
+ 囖: 'lo',
191
+ 龙: 'long',
192
+ 瞜: 'lou',
193
+ 噜: 'lu',
194
+ 驴: 'lv',
195
+ 娈: 'luan',
196
+ 掠: 'lüe',
197
+ 抡: 'lun',
198
+ 罗: 'luo',
199
+ 呣: 'm',
200
+ 妈: 'ma',
201
+ 埋: 'mai',
202
+ 嫚: 'man',
203
+ 牤: 'mang',
204
+ 猫: 'mao',
205
+ 嚒: 'me',
206
+ 呅: 'mei',
207
+ 椚: 'men',
208
+ 擝: 'meng',
209
+ 咪: 'mi',
210
+ 宀: 'mian',
211
+ 喵: 'miao',
212
+ 乜: 'mie',
213
+ 民: 'min',
214
+ 名: 'ming',
215
+ 谬: 'miu',
216
+ 摸: 'mo',
217
+ 哞: 'mou',
218
+ 毪: 'mu',
219
+ 嗯: 'ńg',
220
+ 拏: 'na',
221
+ 腉: 'nai',
222
+ 囡: 'nan',
223
+ 囔: 'nang',
224
+ 孬: 'nao',
225
+ 疒: 'ne',
226
+ 娞: 'nei',
227
+ 恁: 'nen',
228
+ 能: 'neng',
229
+ 妮: 'ni',
230
+ 拈: 'nian',
231
+ 娘: 'niang',
232
+ 鸟: 'niao',
233
+ 捏: 'nie',
234
+ 囜: 'nin',
235
+ 宁: 'ning',
236
+ 妞: 'niu',
237
+ 农: 'nong',
238
+ 羺: 'nou',
239
+ 奴: 'nu',
240
+ 女: 'nv',
241
+ 奻: 'nuan',
242
+ 疟: 'nüe',
243
+ 黁: 'nun',
244
+ 挪: 'nuo',
245
+ 喔: 'o',
246
+ 讴: 'ou',
247
+ 妑: 'pa',
248
+ 拍: 'pai',
249
+ 眅: 'pan',
250
+ 乓: 'pang',
251
+ 抛: 'pao',
252
+ 呸: 'pei',
253
+ 喷: 'pen',
254
+ 匉: 'peng',
255
+ 丕: 'pi',
256
+ 囨: 'pian',
257
+ 剽: 'piao',
258
+ 氕: 'pie',
259
+ 姘: 'pin',
260
+ 乒: 'ping',
261
+ 钋: 'po',
262
+ 剖: 'pou',
263
+ 仆: 'pu',
264
+ 七: 'qi',
265
+ 掐: 'qia',
266
+ 千: 'qian',
267
+ 呛: 'qiang',
268
+ 悄: 'qiao',
269
+ 苆: 'qie',
270
+ 亲: 'qin',
271
+ 靑: 'qing',
272
+ 卭: 'qiong',
273
+ 丘: 'qiu',
274
+ 区: 'qu',
275
+ 奍: 'quan',
276
+ 缺: 'que',
277
+ 夋: 'qun',
278
+ 呥: 'ran',
279
+ 穣: 'rang',
280
+ 娆: 'rao',
281
+ 惹: 're',
282
+ 人: 'ren',
283
+ 扔: 'reng',
284
+ 日: 'ri',
285
+ 茸: 'rong',
286
+ 厹: 'rou',
287
+ 邚: 'ru',
288
+ 挼: 'rua',
289
+ 堧: 'ruan',
290
+ 婑: 'rui',
291
+ 瞤: 'run',
292
+ 捼: 'ruo',
293
+ 仨: 'sa',
294
+ 毢: 'sai',
295
+ 三: 'san',
296
+ 桒: 'sang',
297
+ 掻: 'sao',
298
+ 閪: 'se',
299
+ 森: 'sen',
300
+ 僧: 'seng',
301
+ 杀: 'sha',
302
+ 筛: 'shai',
303
+ 山: 'shan',
304
+ 伤: 'shang',
305
+ 弰: 'shao',
306
+ 奢: 'she',
307
+ 申: 'shen',
308
+ 升: 'sheng',
309
+ 尸: 'shi',
310
+ 収: 'shou',
311
+ 书: 'shu',
312
+ 刷: 'shua',
313
+ 衰: 'shuai',
314
+ 闩: 'shuan',
315
+ 双: 'shuang',
316
+ 脽: 'shui',
317
+ 吮: 'shun',
318
+ 说: 'shuo',
319
+ 厶: 'si',
320
+ 忪: 'song',
321
+ 凁: 'sou',
322
+ 苏: 'su',
323
+ 狻: 'suan',
324
+ 夊: 'sui',
325
+ 孙: 'sun',
326
+ 唆: 'suo',
327
+ 他: 'ta',
328
+ 囼: 'tai',
329
+ 坍: 'tan',
330
+ 汤: 'tang',
331
+ 夲: 'tao',
332
+ 忑: 'te',
333
+ 熥: 'teng',
334
+ 剔: 'ti',
335
+ 天: 'tian',
336
+ 旫: 'tiao',
337
+ 帖: 'tie',
338
+ 厅: 'ting',
339
+ 囲: 'tong',
340
+ 偷: 'tou',
341
+ 凸: 'tu',
342
+ 湍: 'tuan',
343
+ 推: 'tui',
344
+ 吞: 'tun',
345
+ 乇: 'tuo',
346
+ 屲: 'wa',
347
+ 歪: 'wai',
348
+ 弯: 'wan',
349
+ 尣: 'wang',
350
+ 危: 'wei',
351
+ 昷: 'wen',
352
+ 翁: 'weng',
353
+ 挝: 'wo',
354
+ 乌: 'wu',
355
+ 夕: 'xi',
356
+ 虲: 'xia',
357
+ 仙: 'xian',
358
+ 乡: 'xiang',
359
+ 灱: 'xiao',
360
+ 些: 'xie',
361
+ 心: 'xin',
362
+ 星: 'xing',
363
+ 凶: 'xiong',
364
+ 休: 'xiu',
365
+ 吁: 'xu',
366
+ 吅: 'xuan',
367
+ 削: 'xue',
368
+ 坃: 'xun',
369
+ 丫: 'ya',
370
+ 恹: 'yan',
371
+ 央: 'yang',
372
+ 幺: 'yao',
373
+ 倻: 'ye',
374
+ 一: 'yi',
375
+ 囙: 'yin',
376
+ 应: 'ying',
377
+ 哟: 'yo',
378
+ 佣: 'yong',
379
+ 优: 'you',
380
+ 込: 'yu',
381
+ 囦: 'yuan',
382
+ 曰: 'yue',
383
+ 晕: 'yun',
384
+ 帀: 'za',
385
+ 災: 'zai',
386
+ 兂: 'zan',
387
+ 匨: 'zang',
388
+ 傮: 'zao',
389
+ 则: 'ze',
390
+ 贼: 'zei',
391
+ 怎: 'zen',
392
+ 増: 'zeng',
393
+ 扎: 'zha',
394
+ 夈: 'zhai',
395
+ 枬: 'zhan',
396
+ 张: 'zhang',
397
+ 佋: 'zhao',
398
+ 蜇: 'zhe',
399
+ 贞: 'zhen',
400
+ 凧: 'zheng',
401
+ 之: 'zhi',
402
+ 中: 'zhong',
403
+ 州: 'zhou',
404
+ 朱: 'zhu',
405
+ 抓: 'zhua',
406
+ 拽: 'zhuai',
407
+ 专: 'zhuan',
408
+ 妆: 'zhuang',
409
+ 隹: 'zhui',
410
+ 宒: 'zhun',
411
+ 卓: 'zhuo',
412
+ 乲: 'zi',
413
+ 宗: 'zong',
414
+ 邹: 'zou',
415
+ 租: 'zu',
416
+ 钻: 'zuan',
417
+ 厜: 'zui',
418
+ 尊: 'zun',
419
+ 昨: 'zuo',
420
+ };
421
+ // 修正不正确的拼音
422
+ const fixedWrongPinyinHanzis = {
423
+ 沈: 'shen',
424
+ 嗲: 'dia',
425
+ 碡: 'zhou',
426
+ 聒: 'guo',
427
+ 炔: 'que',
428
+ 蚵: 'ke',
429
+ 砉: 'hua',
430
+ 嬤: 'mo',
431
+ 蹒: 'pan',
432
+ 丬: 'pan',
433
+ 霰: 'xian',
434
+ 豉: 'chi',
435
+ 饧: 'xing',
436
+ 帧: 'zhen',
437
+ 郍: 'na',
438
+ 芎: 'xiong',
439
+ 谁: 'shui',
440
+ };
441
+ const hanzis = Object.keys(HANZI_TO_PINYIN);
442
+ const pinyins = Object.values(HANZI_TO_PINYIN);
443
+ // 缓存
444
+ const cache = Object.assign({}, HANZI_TO_PINYIN, fixedWrongPinyinHanzis);
445
+ // safari 浏览器修正一些比较汉字
446
+ const isSafari = !!navigator.userAgent.match(/Version\/[\d.]+.*Safari/);
447
+ if (isSafari) {
448
+ // 修正 safari 中的比较汉字
449
+ const fixedComparedHanzisInSafari = {
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
+ Object.keys(fixedComparedHanzisInSafari).forEach(function (hanzi) {
481
+ hanzis[hanzis.indexOf(hanzi)] = fixedComparedHanzisInSafari[hanzi];
482
+ });
483
+ // 如果不需要在 safari 中修正以下汉字,则将以下汉字注释掉即可
484
+ const safariFixedHanzis = {
485
+ 凒: 'ai',
486
+ 貋: 'an',
487
+ 飹: 'bao',
488
+ 蛽: 'bei',
489
+ 榌: 'bi',
490
+ 畁: 'bi',
491
+ 禆: 'bi',
492
+ 獱: 'bian',
493
+ 溊: 'bo',
494
+ 淿: 'bo',
495
+ 鸔: 'bu',
496
+ 廍: 'bu',
497
+ 礸: 'ca',
498
+ 荝: 'ce',
499
+ 犲: 'chai',
500
+ 仩: 'chang',
501
+ 罉: 'cheng',
502
+ 鐣: 'cheng',
503
+ 粚: 'chi',
504
+ 鵄: 'chi',
505
+ 攡: 'chi',
506
+ 肔: 'chi',
507
+ 槆: 'chun',
508
+ 媨: 'cu',
509
+ 膥: 'cun',
510
+ 迏: 'da',
511
+ 迚: 'da',
512
+ 跶: 'da',
513
+ 亣: 'da',
514
+ 侢: 'dai',
515
+ 蚮: 'dai',
516
+ 艔: 'dao',
517
+ 悳: 'de',
518
+ 枤: 'di',
519
+ 刟: 'diao',
520
+ 鈟: 'diao',
521
+ 譵: 'dui',
522
+ 遻: 'e',
523
+ 笩: 'fa',
524
+ 匥: 'fan',
525
+ 仮: 'fan',
526
+ 胐: 'fei',
527
+ 襥: 'fu',
528
+ 焹: 'gang',
529
+ 稁: 'gao',
530
+ 峼: 'gao',
531
+ 搄: 'gen',
532
+ 匔: 'gong',
533
+ 簼: 'gou',
534
+ 躀: 'guan',
535
+ 褁: 'guo',
536
+ 駴: 'hai',
537
+ 呵: 'he',
538
+ 寉: 'he',
539
+ 燺: 'he',
540
+ 玜: 'hong',
541
+ 闀: 'hong',
542
+ 蘤: 'hua',
543
+ 諙: 'hua',
544
+ 鯶: 'huan',
545
+ 屶: 'hui',
546
+ 檅: 'hui',
547
+ 叝: 'ji',
548
+ 躤: 'ji',
549
+ 笅: 'jiao',
550
+ 鞂: 'jie',
551
+ 掶: 'jie',
552
+ 媫: 'jie',
553
+ 嶻: 'jie',
554
+ 擮: 'jie',
555
+ 礍: 'jie',
556
+ 矝: 'jin',
557
+ 煡: 'jin',
558
+ 璄: 'jing',
559
+ 燛: 'jiong',
560
+ 鼰: 'ju',
561
+ 烥: 'ju',
562
+ 灍: 'jue',
563
+ 鵕: 'jun',
564
+ 钶: 'ke',
565
+ 狅: 'kuang',
566
+ 軠: 'kuang',
567
+ 鋛: 'kuang',
568
+ 嗠: 'lao',
569
+ 矋: 'lei',
570
+ 竰: 'li',
571
+ 竂: 'liao',
572
+ 謢: 'lu',
573
+ 簵: 'lu',
574
+ 率: 'lv',
575
+ 绿: 'lv',
576
+ 嘸: 'm',
577
+ 袮: 'mi',
578
+ 粎: 'mi',
579
+ 杣: 'mian',
580
+ 嫹: 'miao',
581
+ 琝: 'min',
582
+ 吶: 'na',
583
+ 呐: 'na',
584
+ 抩: 'nan',
585
+ 煵: 'nan',
586
+ 踙: 'nie',
587
+ 倿: 'ning',
588
+ 挵: 'nong',
589
+ 衂: 'nv',
590
+ 渒: 'pai',
591
+ 萠: 'pan',
592
+ 蘕: 'peng',
593
+ 錃: 'pi',
594
+ 蠯: 'pi',
595
+ 酦: 'po',
596
+ 炇: 'pu',
597
+ 圑: 'pu',
598
+ 暜: 'pu',
599
+ 捿: 'qi',
600
+ 紪: 'qi',
601
+ 嵜: 'qi',
602
+ 褀: 'qi',
603
+ 騹: 'qi',
604
+ 峠: 'qia',
605
+ 偂: 'qian',
606
+ 嬱: 'qian',
607
+ 鞩: 'qiao',
608
+ 厒: 'qie',
609
+ 鈫: 'qin',
610
+ 儬: 'qing',
611
+ 濪: 'qing',
612
+ 峵: 'rong',
613
+ 钑: 'sa',
614
+ 炶: 'shan',
615
+ 椫: 'shan',
616
+ 罙: 'shen',
617
+ 鯓: 'shen',
618
+ 枡: 'sheng',
619
+ 鍟: 'sheng',
620
+ 縄: 'sheng',
621
+ 膄: 'shou',
622
+ 毺: 'shu',
623
+ 暺: 'tan',
624
+ 砙: 'wa',
625
+ 晥: 'wan',
626
+ 瞣: 'wan',
627
+ 榲: 'wen',
628
+ 饂: 'wen',
629
+ 攚: 'weng',
630
+ 邜: 'xi',
631
+ 湺: 'xian',
632
+ 鷍: 'xiao',
633
+ 炨: 'xie',
634
+ 匂: 'xiong',
635
+ 潃: 'xiu',
636
+ 燅: 'xun',
637
+ 訮: 'yan',
638
+ 滧: 'yao',
639
+ 摿: 'yao',
640
+ 磘: 'yao',
641
+ 洂: 'ye',
642
+ 捙: 'ye',
643
+ 璍: 'ye',
644
+ 渏: 'yi',
645
+ 頥: 'yi',
646
+ 鈘: 'yi',
647
+ 貖: 'yi',
648
+ 袬: 'yu',
649
+ 鴧: 'yu',
650
+ 伝: 'yun',
651
+ 齫: 'yun',
652
+ 沯: 'za',
653
+ 溨: 'zai',
654
+ 煰: 'zao',
655
+ 歵: 'ze',
656
+ 茋: 'zhi',
657
+ 隲: 'zhi',
658
+ 钃: 'zhu',
659
+ 赼: 'zi',
660
+ 荢: 'zi',
661
+ 燪: 'zong',
662
+ 唨: 'zu',
663
+ };
664
+ Object.assign(cache, safariFixedHanzis);
665
+ }
666
+
667
+ const firstHanziCharCode = 19968; // 0x4e00
668
+ const lastHanziCharCode = 40869; // 0x9FA5
669
+
670
+ const convert = (target, style) => {
671
+ const charCode = target.charCodeAt(0);
672
+ // 不在比对范围内
673
+ if (charCode < firstHanziCharCode || charCode > lastHanziCharCode) {
674
+ return target;
675
+ }
676
+ // 命中缓存,是修正的汉字,或者是之前已经查找过这个汉字
677
+ if (cache[target]) {
678
+ return style === 'first_letter' ? cache[target].charAt(0) : cache[target];
679
+ }
680
+ let start = 0;
681
+ let end = hanzis.length - 1;
682
+ let index = -1;
683
+ let hanzi;
684
+ let compareResult;
685
+ // 二分查找
686
+ while (start <= end) {
687
+ index = Math.floor((start + end) / 2);
688
+ hanzi = hanzis[index];
689
+ compareResult = target.localeCompare(hanzi, ['zh-CN']);
690
+ if (compareResult === 1) {
691
+ start = index + 1;
692
+ } else if (compareResult === -1) {
693
+ end = index - 1;
694
+ } else {
695
+ break;
696
+ }
697
+ }
698
+ if (compareResult < 0) {
699
+ index--;
700
+ }
701
+ cache[target] = pinyins[index];
702
+ return style === 'first_letter' ? pinyins[index].charAt(0) : pinyins[index];
703
+ };
704
+
705
+ const _pinyin = (source, style) => {
706
+ // 非字符
707
+ if (typeof source !== 'string') {
708
+ return source;
709
+ }
710
+
711
+ let foundPinyin = '';
712
+
713
+ forEach(source, (target) => {
714
+ foundPinyin += convert(target, style);
715
+ });
716
+
717
+ return foundPinyin;
718
+ };
719
+
720
+ return ((source, style) => {
721
+ if (!instance) {
722
+ instance = _pinyin;
723
+ }
724
+ return instance(source, style);
725
+ })(source, style);
726
+ };
727
+
728
+ export { pinyin };