pravapis 0.1.0

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.
@@ -0,0 +1,1698 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/translit.ts
21
+ var translit_exports = {};
22
+ __export(translit_exports, {
23
+ PAIRED: () => PAIRED,
24
+ REVERSIBLE: () => REVERSIBLE,
25
+ Transliterator: () => Transliterator,
26
+ transliterate: () => transliterate2,
27
+ transliterateResult: () => transliterateResult
28
+ });
29
+ module.exports = __toCommonJS(translit_exports);
30
+
31
+ // src/generated/translit.json
32
+ var translit_default = {
33
+ schema: "tag:pravapis,2026:schema:js-translit:1",
34
+ dataVersion: "1.3.0",
35
+ dataHash: "753d1d906418ea113bd7db543033b569926fca8701f701f619ddbad526a39efc",
36
+ schemes: {
37
+ lacinka: {
38
+ scheme: "lacinka",
39
+ description: "Classical Belarusian \u0141acinka, Cyrillic \u2192 Latin. Pairs with Tara\u0161kievica: both mark assimilative softness, so \u0441\u044C\u043D\u0435\u0433 \u2192 \u015Bnieh. Feed it Narkama\u016Dka and you get snieh, which is not what a \u0141acinka reader expects \u2014 hence the pairing in pravapis.translit.\n",
40
+ source: 'B. Tara\u0161kievi\u010D, Bie\u0142aruskaja hramatyka dla \u0161ko\u0142 (Vilnia, 1918), \u0142acinka edition \u2014 the same book \u0417\u0431\u043E\u0440 \u043F\u0440\u0430\u0432\u0456\u043B\u0430\u045E 2005 cites in endnote i. The 2005 rules themselves cover Cyrillic orthography only (\xA71\u201391) and merely assume \u0141acinka exists, noting the "\u043F\u0430\u0440\u0430\u043B\u0435\u043B\u0456\u0437\u043C \u043A\u0456\u0440\u044B\u043B\u0456\u0447\u043D\u0430\u0433\u0430 \u0439 \u043B\u0430\u0446\u0456\u043D\u043A\u0430\u0432\u0430\u0433\u0430" spelling.\n',
41
+ mappings: [
42
+ {
43
+ from: "\u0434\u0437\u044C",
44
+ to: "d\u017A",
45
+ when: "default",
46
+ lossy: false
47
+ },
48
+ {
49
+ from: "\u0434\u0437",
50
+ to: "dz",
51
+ when: "default",
52
+ lossy: false
53
+ },
54
+ {
55
+ from: "\u0434\u0436",
56
+ to: "d\u017E",
57
+ when: "default",
58
+ lossy: false
59
+ },
60
+ {
61
+ from: "\u0441\u044C",
62
+ to: "\u015B",
63
+ when: "default",
64
+ lossy: false
65
+ },
66
+ {
67
+ from: "\u0437\u044C",
68
+ to: "\u017A",
69
+ when: "default",
70
+ lossy: false
71
+ },
72
+ {
73
+ from: "\u0446\u044C",
74
+ to: "\u0107",
75
+ when: "default",
76
+ lossy: false
77
+ },
78
+ {
79
+ from: "\u043D\u044C",
80
+ to: "\u0144",
81
+ when: "default",
82
+ lossy: false
83
+ },
84
+ {
85
+ from: "\u043B\u044C",
86
+ to: "l",
87
+ when: "default",
88
+ lossy: false
89
+ },
90
+ {
91
+ from: "\u043B",
92
+ to: "l",
93
+ when: "before_soft_vowel",
94
+ lossy: false
95
+ },
96
+ {
97
+ from: "\u043B",
98
+ to: "\u0142",
99
+ when: "default",
100
+ lossy: false
101
+ },
102
+ {
103
+ from: "\u044F",
104
+ to: "a",
105
+ when: "after_l",
106
+ lossy: false
107
+ },
108
+ {
109
+ from: "\u044F",
110
+ to: "ia",
111
+ when: "after_consonant",
112
+ lossy: false
113
+ },
114
+ {
115
+ from: "\u044F",
116
+ to: "ja",
117
+ when: "default",
118
+ lossy: false
119
+ },
120
+ {
121
+ from: "\u0451",
122
+ to: "o",
123
+ when: "after_l",
124
+ lossy: false
125
+ },
126
+ {
127
+ from: "\u0451",
128
+ to: "io",
129
+ when: "after_consonant",
130
+ lossy: false
131
+ },
132
+ {
133
+ from: "\u0451",
134
+ to: "jo",
135
+ when: "default",
136
+ lossy: false
137
+ },
138
+ {
139
+ from: "\u044E",
140
+ to: "u",
141
+ when: "after_l",
142
+ lossy: false
143
+ },
144
+ {
145
+ from: "\u044E",
146
+ to: "iu",
147
+ when: "after_consonant",
148
+ lossy: false
149
+ },
150
+ {
151
+ from: "\u044E",
152
+ to: "ju",
153
+ when: "default",
154
+ lossy: false
155
+ },
156
+ {
157
+ from: "\u0435",
158
+ to: "e",
159
+ when: "after_l",
160
+ lossy: false
161
+ },
162
+ {
163
+ from: "\u0435",
164
+ to: "ie",
165
+ when: "after_consonant",
166
+ lossy: false
167
+ },
168
+ {
169
+ from: "\u0435",
170
+ to: "je",
171
+ when: "default",
172
+ lossy: false
173
+ },
174
+ {
175
+ from: "\u0456",
176
+ to: "ji",
177
+ when: "after_apostrophe|after_soft_sign",
178
+ lossy: false
179
+ },
180
+ {
181
+ from: "\u0456",
182
+ to: "i",
183
+ when: "default",
184
+ lossy: false
185
+ },
186
+ {
187
+ from: "\u2019",
188
+ to: "",
189
+ when: "default",
190
+ lossy: false
191
+ },
192
+ {
193
+ from: "\u044C",
194
+ to: "",
195
+ when: "default",
196
+ lossy: true
197
+ },
198
+ {
199
+ from: "\u0430",
200
+ to: "a",
201
+ when: "default",
202
+ lossy: false
203
+ },
204
+ {
205
+ from: "\u0431",
206
+ to: "b",
207
+ when: "default",
208
+ lossy: false
209
+ },
210
+ {
211
+ from: "\u0432",
212
+ to: "v",
213
+ when: "default",
214
+ lossy: false
215
+ },
216
+ {
217
+ from: "\u0433",
218
+ to: "h",
219
+ when: "default",
220
+ lossy: false
221
+ },
222
+ {
223
+ from: "\u0491",
224
+ to: "g",
225
+ when: "default",
226
+ lossy: false
227
+ },
228
+ {
229
+ from: "\u0434",
230
+ to: "d",
231
+ when: "default",
232
+ lossy: false
233
+ },
234
+ {
235
+ from: "\u0436",
236
+ to: "\u017E",
237
+ when: "default",
238
+ lossy: false
239
+ },
240
+ {
241
+ from: "\u0437",
242
+ to: "z",
243
+ when: "default",
244
+ lossy: false
245
+ },
246
+ {
247
+ from: "\u0439",
248
+ to: "j",
249
+ when: "default",
250
+ lossy: false
251
+ },
252
+ {
253
+ from: "\u043A",
254
+ to: "k",
255
+ when: "default",
256
+ lossy: false
257
+ },
258
+ {
259
+ from: "\u043C",
260
+ to: "m",
261
+ when: "default",
262
+ lossy: false
263
+ },
264
+ {
265
+ from: "\u043D",
266
+ to: "n",
267
+ when: "default",
268
+ lossy: false
269
+ },
270
+ {
271
+ from: "\u043E",
272
+ to: "o",
273
+ when: "default",
274
+ lossy: false
275
+ },
276
+ {
277
+ from: "\u043F",
278
+ to: "p",
279
+ when: "default",
280
+ lossy: false
281
+ },
282
+ {
283
+ from: "\u0440",
284
+ to: "r",
285
+ when: "default",
286
+ lossy: false
287
+ },
288
+ {
289
+ from: "\u0441",
290
+ to: "s",
291
+ when: "default",
292
+ lossy: false
293
+ },
294
+ {
295
+ from: "\u0442",
296
+ to: "t",
297
+ when: "default",
298
+ lossy: false
299
+ },
300
+ {
301
+ from: "\u0443",
302
+ to: "u",
303
+ when: "default",
304
+ lossy: false
305
+ },
306
+ {
307
+ from: "\u045E",
308
+ to: "\u016D",
309
+ when: "default",
310
+ lossy: false
311
+ },
312
+ {
313
+ from: "\u0444",
314
+ to: "f",
315
+ when: "default",
316
+ lossy: false
317
+ },
318
+ {
319
+ from: "\u0445",
320
+ to: "ch",
321
+ when: "default",
322
+ lossy: false
323
+ },
324
+ {
325
+ from: "\u0446",
326
+ to: "c",
327
+ when: "default",
328
+ lossy: false
329
+ },
330
+ {
331
+ from: "\u0447",
332
+ to: "\u010D",
333
+ when: "default",
334
+ lossy: false
335
+ },
336
+ {
337
+ from: "\u0448",
338
+ to: "\u0161",
339
+ when: "default",
340
+ lossy: false
341
+ },
342
+ {
343
+ from: "\u044B",
344
+ to: "y",
345
+ when: "default",
346
+ lossy: false
347
+ },
348
+ {
349
+ from: "\u044D",
350
+ to: "e",
351
+ when: "default",
352
+ lossy: false
353
+ }
354
+ ],
355
+ tests: [
356
+ {
357
+ input: "\u0441\u044C\u043D\u0435\u0433",
358
+ expected: "\u015Bnieh"
359
+ },
360
+ {
361
+ input: "\u0441\u044C\u0432\u0435\u0442",
362
+ expected: "\u015Bviet"
363
+ },
364
+ {
365
+ input: "\u044F\u0431\u043B\u044B\u043A",
366
+ expected: "jab\u0142yk"
367
+ },
368
+ {
369
+ input: "\u043C\u044F\u0441\u0430",
370
+ expected: "miasa"
371
+ },
372
+ {
373
+ input: "\u043C\u0430\u044F\u043A",
374
+ expected: "majak"
375
+ },
376
+ {
377
+ input: "\u043B\u0435\u0441",
378
+ expected: "les"
379
+ },
380
+ {
381
+ input: "\u043B\u044F\u043A",
382
+ expected: "lak"
383
+ },
384
+ {
385
+ input: "\u043B\u0451\u0434",
386
+ expected: "lod"
387
+ },
388
+ {
389
+ input: "\u043B\u044E\u0431\u044B",
390
+ expected: "luby"
391
+ },
392
+ {
393
+ input: "\u043A\u0430\u043D\u0442\u0440\u043E\u043B\u044C",
394
+ expected: "kantrol"
395
+ },
396
+ {
397
+ input: "\u0431\u0430\u043B\u044C\u043A\u043E\u043D",
398
+ expected: "balkon"
399
+ },
400
+ {
401
+ input: "\u0437\u044C\u044F\u0432\u0430",
402
+ expected: "\u017Ajava"
403
+ },
404
+ {
405
+ input: "\u0430\u0431\u2019\u044F\u0432\u0430",
406
+ expected: "abjava"
407
+ },
408
+ {
409
+ input: "\u0434\u0437\u0435\u043D\u044C",
410
+ expected: "dzie\u0144"
411
+ },
412
+ {
413
+ input: "\u0436\u044B\u0446\u044C\u0446\u0451",
414
+ expected: "\u017Ey\u0107cio"
415
+ },
416
+ {
417
+ input: "\u0447\u0430\u043B\u0430\u0432\u0435\u043A",
418
+ expected: "\u010Da\u0142aviek"
419
+ },
420
+ {
421
+ input: "\u044D\u045E\u0440\u043E\u043F\u0430",
422
+ expected: "e\u016Dropa"
423
+ },
424
+ {
425
+ input: "\u0491\u0430\u043D\u0430\u043A",
426
+ expected: "ganak"
427
+ },
428
+ {
429
+ input: "\u0445\u043B\u0435\u0431",
430
+ expected: "chleb"
431
+ },
432
+ {
433
+ input: "\u0430\u0434\u0437\u043D\u0430\u0447\u044B\u0446\u044C",
434
+ expected: "adzna\u010Dy\u0107"
435
+ },
436
+ {
437
+ input: "\u0441\u0443\u0434\u0437\u044C\u0434\u0437\u044F",
438
+ expected: "sud\u017Adzia"
439
+ },
440
+ {
441
+ input: "\u0431\u0435\u043B\u0430\u0440\u0443\u0441\u044C",
442
+ expected: "bie\u0142aru\u015B"
443
+ }
444
+ ]
445
+ },
446
+ lacinka_reverse: {
447
+ scheme: "lacinka_reverse",
448
+ description: "Classical Belarusian \u0141acinka, Latin \u2192 Cyrillic. The inverse of lacinka.yaml, and the reason the round-trip property test is possible at all.\n",
449
+ source: "The inverse of the table in lacinka.yaml \u2014 B. Tara\u0161kievi\u010D, Bie\u0142aruskaja hramatyka dla \u0161ko\u0142 (Vilnia, 1918), \u0142acinka edition.\n",
450
+ mappings: [
451
+ {
452
+ from: "la",
453
+ to: "\u043B\u044F",
454
+ when: "default",
455
+ lossy: false
456
+ },
457
+ {
458
+ from: "le",
459
+ to: "\u043B\u0435",
460
+ when: "default",
461
+ lossy: false
462
+ },
463
+ {
464
+ from: "lo",
465
+ to: "\u043B\u0451",
466
+ when: "default",
467
+ lossy: false
468
+ },
469
+ {
470
+ from: "lu",
471
+ to: "\u043B\u044E",
472
+ when: "default",
473
+ lossy: false
474
+ },
475
+ {
476
+ from: "li",
477
+ to: "\u043B\u0456",
478
+ when: "default",
479
+ lossy: false
480
+ },
481
+ {
482
+ from: "ja",
483
+ to: "\u044F",
484
+ when: "default",
485
+ lossy: false
486
+ },
487
+ {
488
+ from: "je",
489
+ to: "\u0435",
490
+ when: "default",
491
+ lossy: false
492
+ },
493
+ {
494
+ from: "jo",
495
+ to: "\u0451",
496
+ when: "default",
497
+ lossy: false
498
+ },
499
+ {
500
+ from: "ju",
501
+ to: "\u044E",
502
+ when: "default",
503
+ lossy: false
504
+ },
505
+ {
506
+ from: "ji",
507
+ to: "\u0456",
508
+ when: "default",
509
+ lossy: false
510
+ },
511
+ {
512
+ from: "ia",
513
+ to: "\u044F",
514
+ when: "default",
515
+ lossy: false
516
+ },
517
+ {
518
+ from: "ie",
519
+ to: "\u0435",
520
+ when: "default",
521
+ lossy: false
522
+ },
523
+ {
524
+ from: "io",
525
+ to: "\u0451",
526
+ when: "default",
527
+ lossy: false
528
+ },
529
+ {
530
+ from: "iu",
531
+ to: "\u044E",
532
+ when: "default",
533
+ lossy: false
534
+ },
535
+ {
536
+ from: "d\u017A",
537
+ to: "\u0434\u0437\u044C",
538
+ when: "default",
539
+ lossy: false
540
+ },
541
+ {
542
+ from: "d\u017E",
543
+ to: "\u0434\u0436",
544
+ when: "default",
545
+ lossy: false
546
+ },
547
+ {
548
+ from: "dz",
549
+ to: "\u0434\u0437",
550
+ when: "default",
551
+ lossy: false
552
+ },
553
+ {
554
+ from: "ch",
555
+ to: "\u0445",
556
+ when: "default",
557
+ lossy: false
558
+ },
559
+ {
560
+ from: "\u0142",
561
+ to: "\u043B",
562
+ when: "default",
563
+ lossy: false
564
+ },
565
+ {
566
+ from: "l",
567
+ to: "\u043B\u044C",
568
+ when: "default",
569
+ lossy: false
570
+ },
571
+ {
572
+ from: "\u016D",
573
+ to: "\u045E",
574
+ when: "default",
575
+ lossy: false
576
+ },
577
+ {
578
+ from: "\u0161",
579
+ to: "\u0448",
580
+ when: "default",
581
+ lossy: false
582
+ },
583
+ {
584
+ from: "\u010D",
585
+ to: "\u0447",
586
+ when: "default",
587
+ lossy: false
588
+ },
589
+ {
590
+ from: "\u017E",
591
+ to: "\u0436",
592
+ when: "default",
593
+ lossy: false
594
+ },
595
+ {
596
+ from: "\u015B",
597
+ to: "\u0441\u044C",
598
+ when: "default",
599
+ lossy: false
600
+ },
601
+ {
602
+ from: "\u017A",
603
+ to: "\u0437\u044C",
604
+ when: "default",
605
+ lossy: false
606
+ },
607
+ {
608
+ from: "\u0107",
609
+ to: "\u0446\u044C",
610
+ when: "default",
611
+ lossy: false
612
+ },
613
+ {
614
+ from: "\u0144",
615
+ to: "\u043D\u044C",
616
+ when: "default",
617
+ lossy: false
618
+ },
619
+ {
620
+ from: "a",
621
+ to: "\u0430",
622
+ when: "default",
623
+ lossy: false
624
+ },
625
+ {
626
+ from: "b",
627
+ to: "\u0431",
628
+ when: "default",
629
+ lossy: false
630
+ },
631
+ {
632
+ from: "c",
633
+ to: "\u0446",
634
+ when: "default",
635
+ lossy: false
636
+ },
637
+ {
638
+ from: "d",
639
+ to: "\u0434",
640
+ when: "default",
641
+ lossy: false
642
+ },
643
+ {
644
+ from: "e",
645
+ to: "\u044D",
646
+ when: "default",
647
+ lossy: false
648
+ },
649
+ {
650
+ from: "f",
651
+ to: "\u0444",
652
+ when: "default",
653
+ lossy: false
654
+ },
655
+ {
656
+ from: "g",
657
+ to: "\u0491",
658
+ when: "default",
659
+ lossy: false
660
+ },
661
+ {
662
+ from: "h",
663
+ to: "\u0433",
664
+ when: "default",
665
+ lossy: false
666
+ },
667
+ {
668
+ from: "i",
669
+ to: "\u0456",
670
+ when: "default",
671
+ lossy: false
672
+ },
673
+ {
674
+ from: "j",
675
+ to: "\u0439",
676
+ when: "default",
677
+ lossy: false
678
+ },
679
+ {
680
+ from: "k",
681
+ to: "\u043A",
682
+ when: "default",
683
+ lossy: false
684
+ },
685
+ {
686
+ from: "m",
687
+ to: "\u043C",
688
+ when: "default",
689
+ lossy: false
690
+ },
691
+ {
692
+ from: "n",
693
+ to: "\u043D",
694
+ when: "default",
695
+ lossy: false
696
+ },
697
+ {
698
+ from: "o",
699
+ to: "\u043E",
700
+ when: "default",
701
+ lossy: false
702
+ },
703
+ {
704
+ from: "p",
705
+ to: "\u043F",
706
+ when: "default",
707
+ lossy: false
708
+ },
709
+ {
710
+ from: "r",
711
+ to: "\u0440",
712
+ when: "default",
713
+ lossy: false
714
+ },
715
+ {
716
+ from: "s",
717
+ to: "\u0441",
718
+ when: "default",
719
+ lossy: false
720
+ },
721
+ {
722
+ from: "t",
723
+ to: "\u0442",
724
+ when: "default",
725
+ lossy: false
726
+ },
727
+ {
728
+ from: "u",
729
+ to: "\u0443",
730
+ when: "default",
731
+ lossy: false
732
+ },
733
+ {
734
+ from: "v",
735
+ to: "\u0432",
736
+ when: "default",
737
+ lossy: false
738
+ },
739
+ {
740
+ from: "y",
741
+ to: "\u044B",
742
+ when: "default",
743
+ lossy: false
744
+ },
745
+ {
746
+ from: "z",
747
+ to: "\u0437",
748
+ when: "default",
749
+ lossy: false
750
+ }
751
+ ],
752
+ tests: [
753
+ {
754
+ input: "\u015Bnieh",
755
+ expected: "\u0441\u044C\u043D\u0435\u0433"
756
+ },
757
+ {
758
+ input: "\u015Bviet",
759
+ expected: "\u0441\u044C\u0432\u0435\u0442"
760
+ },
761
+ {
762
+ input: "jab\u0142yk",
763
+ expected: "\u044F\u0431\u043B\u044B\u043A"
764
+ },
765
+ {
766
+ input: "miasa",
767
+ expected: "\u043C\u044F\u0441\u0430"
768
+ },
769
+ {
770
+ input: "majak",
771
+ expected: "\u043C\u0430\u044F\u043A"
772
+ },
773
+ {
774
+ input: "les",
775
+ expected: "\u043B\u0435\u0441"
776
+ },
777
+ {
778
+ input: "lak",
779
+ expected: "\u043B\u044F\u043A"
780
+ },
781
+ {
782
+ input: "lod",
783
+ expected: "\u043B\u0451\u0434"
784
+ },
785
+ {
786
+ input: "luby",
787
+ expected: "\u043B\u044E\u0431\u044B"
788
+ },
789
+ {
790
+ input: "kantrol",
791
+ expected: "\u043A\u0430\u043D\u0442\u0440\u043E\u043B\u044C"
792
+ },
793
+ {
794
+ input: "balkon",
795
+ expected: "\u0431\u0430\u043B\u044C\u043A\u043E\u043D"
796
+ },
797
+ {
798
+ input: "dzie\u0144",
799
+ expected: "\u0434\u0437\u0435\u043D\u044C"
800
+ },
801
+ {
802
+ input: "\u017Ey\u0107cio",
803
+ expected: "\u0436\u044B\u0446\u044C\u0446\u0451"
804
+ },
805
+ {
806
+ input: "\u010Da\u0142aviek",
807
+ expected: "\u0447\u0430\u043B\u0430\u0432\u0435\u043A"
808
+ },
809
+ {
810
+ input: "e\u016Dropa",
811
+ expected: "\u044D\u045E\u0440\u043E\u043F\u0430"
812
+ },
813
+ {
814
+ input: "ganak",
815
+ expected: "\u0491\u0430\u043D\u0430\u043A"
816
+ },
817
+ {
818
+ input: "chleb",
819
+ expected: "\u0445\u043B\u0435\u0431"
820
+ },
821
+ {
822
+ input: "adzna\u010Dy\u0107",
823
+ expected: "\u0430\u0434\u0437\u043D\u0430\u0447\u044B\u0446\u044C"
824
+ },
825
+ {
826
+ input: "bie\u0142aru\u015B",
827
+ expected: "\u0431\u0435\u043B\u0430\u0440\u0443\u0441\u044C"
828
+ }
829
+ ]
830
+ },
831
+ official2007: {
832
+ scheme: "official2007",
833
+ description: "The Belarusian national romanisation, Cyrillic \u2192 Latin. Pairs with Narkama\u016Dka: it transliterates the \u044C that is actually written and invents none, so \u0441\u043D\u0435\u0433 \u2192 snieh, not \u015Bnieh. Forward only \u2014 it does not mark assimilative softness, so the reverse would not round-trip and pravapis does not offer one.\n",
834
+ source: "\u0406\u043D\u0441\u0442\u0440\u0443\u043A\u0446\u044B\u044F \u043F\u0430 \u0442\u0440\u0430\u043D\u0441\u043B\u0456\u0442\u0430\u0440\u0430\u0446\u044B\u0456 \u0433\u0435\u0430\u0433\u0440\u0430\u0444\u0456\u0447\u043D\u044B\u0445 \u043D\u0430\u0437\u0432\u0430\u045E \u0420\u044D\u0441\u043F\u0443\u0431\u043B\u0456\u043A\u0456 \u0411\u0435\u043B\u0430\u0440\u0443\u0441\u044C \u043B\u0456\u0442\u0430\u0440\u0430\u043C\u0456 \u043B\u0430\u0446\u0456\u043D\u0441\u043A\u0430\u0433\u0430 \u0430\u043B\u0444\u0430\u0432\u0456\u0442\u0430 (\u0414\u0437\u044F\u0440\u0436\u0430\u045E\u043D\u044B \u043A\u0430\u043C\u0456\u0442\u044D\u0442 \u043F\u0430 \u0437\u044F\u043C\u0435\u043B\u044C\u043D\u044B\u0445 \u0440\u044D\u0441\u0443\u0440\u0441\u0430\u0445, \u0433\u0435\u0430\u0434\u044D\u0437\u0456\u0456 \u0456 \u043A\u0430\u0440\u0442\u0430\u0433\u0440\u0430\u0444\u0456\u0456, 2000; as amended 2007), adopted by UNGEGN in 2012 (resolution X/6) as the international romanisation system for Belarusian geographical names.\n",
835
+ mappings: [
836
+ {
837
+ from: "\u0434\u0437\u044C",
838
+ to: "d\u017A",
839
+ when: "default",
840
+ lossy: false
841
+ },
842
+ {
843
+ from: "\u0434\u0437",
844
+ to: "dz",
845
+ when: "default",
846
+ lossy: false
847
+ },
848
+ {
849
+ from: "\u0434\u0436",
850
+ to: "d\u017E",
851
+ when: "default",
852
+ lossy: false
853
+ },
854
+ {
855
+ from: "\u0437\u044C",
856
+ to: "\u017A",
857
+ when: "default",
858
+ lossy: false
859
+ },
860
+ {
861
+ from: "\u043B\u044C",
862
+ to: "\u013A",
863
+ when: "default",
864
+ lossy: false
865
+ },
866
+ {
867
+ from: "\u043D\u044C",
868
+ to: "\u0144",
869
+ when: "default",
870
+ lossy: false
871
+ },
872
+ {
873
+ from: "\u0441\u044C",
874
+ to: "\u015B",
875
+ when: "default",
876
+ lossy: false
877
+ },
878
+ {
879
+ from: "\u0446\u044C",
880
+ to: "\u0107",
881
+ when: "default",
882
+ lossy: false
883
+ },
884
+ {
885
+ from: "\u044F",
886
+ to: "ia",
887
+ when: "after_consonant",
888
+ lossy: false
889
+ },
890
+ {
891
+ from: "\u044F",
892
+ to: "ja",
893
+ when: "default",
894
+ lossy: false
895
+ },
896
+ {
897
+ from: "\u0451",
898
+ to: "io",
899
+ when: "after_consonant",
900
+ lossy: false
901
+ },
902
+ {
903
+ from: "\u0451",
904
+ to: "jo",
905
+ when: "default",
906
+ lossy: false
907
+ },
908
+ {
909
+ from: "\u044E",
910
+ to: "iu",
911
+ when: "after_consonant",
912
+ lossy: false
913
+ },
914
+ {
915
+ from: "\u044E",
916
+ to: "ju",
917
+ when: "default",
918
+ lossy: false
919
+ },
920
+ {
921
+ from: "\u0435",
922
+ to: "ie",
923
+ when: "after_consonant",
924
+ lossy: false
925
+ },
926
+ {
927
+ from: "\u0435",
928
+ to: "je",
929
+ when: "default",
930
+ lossy: false
931
+ },
932
+ {
933
+ from: "\u2019",
934
+ to: "",
935
+ when: "default",
936
+ lossy: false
937
+ },
938
+ {
939
+ from: "\u044C",
940
+ to: "",
941
+ when: "default",
942
+ lossy: false
943
+ },
944
+ {
945
+ from: "\u0430",
946
+ to: "a",
947
+ when: "default",
948
+ lossy: false
949
+ },
950
+ {
951
+ from: "\u0431",
952
+ to: "b",
953
+ when: "default",
954
+ lossy: false
955
+ },
956
+ {
957
+ from: "\u0432",
958
+ to: "v",
959
+ when: "default",
960
+ lossy: false
961
+ },
962
+ {
963
+ from: "\u0433",
964
+ to: "h",
965
+ when: "default",
966
+ lossy: false
967
+ },
968
+ {
969
+ from: "\u0491",
970
+ to: "g",
971
+ when: "default",
972
+ lossy: false
973
+ },
974
+ {
975
+ from: "\u0434",
976
+ to: "d",
977
+ when: "default",
978
+ lossy: false
979
+ },
980
+ {
981
+ from: "\u0436",
982
+ to: "\u017E",
983
+ when: "default",
984
+ lossy: false
985
+ },
986
+ {
987
+ from: "\u0437",
988
+ to: "z",
989
+ when: "default",
990
+ lossy: false
991
+ },
992
+ {
993
+ from: "\u0456",
994
+ to: "i",
995
+ when: "default",
996
+ lossy: false
997
+ },
998
+ {
999
+ from: "\u0439",
1000
+ to: "j",
1001
+ when: "default",
1002
+ lossy: false
1003
+ },
1004
+ {
1005
+ from: "\u043A",
1006
+ to: "k",
1007
+ when: "default",
1008
+ lossy: false
1009
+ },
1010
+ {
1011
+ from: "\u043B",
1012
+ to: "l",
1013
+ when: "default",
1014
+ lossy: false
1015
+ },
1016
+ {
1017
+ from: "\u043C",
1018
+ to: "m",
1019
+ when: "default",
1020
+ lossy: false
1021
+ },
1022
+ {
1023
+ from: "\u043D",
1024
+ to: "n",
1025
+ when: "default",
1026
+ lossy: false
1027
+ },
1028
+ {
1029
+ from: "\u043E",
1030
+ to: "o",
1031
+ when: "default",
1032
+ lossy: false
1033
+ },
1034
+ {
1035
+ from: "\u043F",
1036
+ to: "p",
1037
+ when: "default",
1038
+ lossy: false
1039
+ },
1040
+ {
1041
+ from: "\u0440",
1042
+ to: "r",
1043
+ when: "default",
1044
+ lossy: false
1045
+ },
1046
+ {
1047
+ from: "\u0441",
1048
+ to: "s",
1049
+ when: "default",
1050
+ lossy: false
1051
+ },
1052
+ {
1053
+ from: "\u0442",
1054
+ to: "t",
1055
+ when: "default",
1056
+ lossy: false
1057
+ },
1058
+ {
1059
+ from: "\u0443",
1060
+ to: "u",
1061
+ when: "default",
1062
+ lossy: false
1063
+ },
1064
+ {
1065
+ from: "\u045E",
1066
+ to: "\u016D",
1067
+ when: "default",
1068
+ lossy: false
1069
+ },
1070
+ {
1071
+ from: "\u0444",
1072
+ to: "f",
1073
+ when: "default",
1074
+ lossy: false
1075
+ },
1076
+ {
1077
+ from: "\u0445",
1078
+ to: "ch",
1079
+ when: "default",
1080
+ lossy: false
1081
+ },
1082
+ {
1083
+ from: "\u0446",
1084
+ to: "c",
1085
+ when: "default",
1086
+ lossy: false
1087
+ },
1088
+ {
1089
+ from: "\u0447",
1090
+ to: "\u010D",
1091
+ when: "default",
1092
+ lossy: false
1093
+ },
1094
+ {
1095
+ from: "\u0448",
1096
+ to: "\u0161",
1097
+ when: "default",
1098
+ lossy: false
1099
+ },
1100
+ {
1101
+ from: "\u044B",
1102
+ to: "y",
1103
+ when: "default",
1104
+ lossy: false
1105
+ },
1106
+ {
1107
+ from: "\u044D",
1108
+ to: "e",
1109
+ when: "default",
1110
+ lossy: false
1111
+ }
1112
+ ],
1113
+ tests: [
1114
+ {
1115
+ input: "\u0441\u043D\u0435\u0433",
1116
+ expected: "snieh"
1117
+ },
1118
+ {
1119
+ input: "\u0441\u0432\u0435\u0442",
1120
+ expected: "sviet"
1121
+ },
1122
+ {
1123
+ input: "\u043C\u0456\u043D\u0441\u043A",
1124
+ expected: "minsk"
1125
+ },
1126
+ {
1127
+ input: "\u0432\u0456\u0446\u0435\u0431\u0441\u043A",
1128
+ expected: "viciebsk"
1129
+ },
1130
+ {
1131
+ input: "\u0432\u0443\u043B\u0456\u0446\u0430",
1132
+ expected: "vulica"
1133
+ },
1134
+ {
1135
+ input: "\u0448\u0447\u0443\u0447\u044B\u043D",
1136
+ expected: "\u0161\u010Du\u010Dyn"
1137
+ },
1138
+ {
1139
+ input: "\u0435\u045E\u0440\u043E\u043F\u0430",
1140
+ expected: "je\u016Dropa"
1141
+ },
1142
+ {
1143
+ input: "\u043C\u044F\u0434\u0437\u0435\u043B",
1144
+ expected: "miadziel"
1145
+ },
1146
+ {
1147
+ input: "\u0447\u0430\u043B\u0430\u0432\u0435\u043A",
1148
+ expected: "\u010Dalaviek"
1149
+ },
1150
+ {
1151
+ input: "\u044F\u0431\u043B\u044B\u043A",
1152
+ expected: "jablyk"
1153
+ },
1154
+ {
1155
+ input: "\u0437\u044D\u043B\u044C\u0432\u0430",
1156
+ expected: "ze\u013Ava"
1157
+ }
1158
+ ]
1159
+ }
1160
+ }
1161
+ };
1162
+
1163
+ // src/generated/chars.json
1164
+ var chars_default = {
1165
+ schema: "tag:pravapis,2026:schema:js-chars:1",
1166
+ dataVersion: "1.3.0",
1167
+ dataHash: "753d1d906418ea113bd7db543033b569926fca8701f701f619ddbad526a39efc",
1168
+ alphabet: {
1169
+ pairs: [
1170
+ {
1171
+ lower: "\u0430",
1172
+ upper: "\u0410"
1173
+ },
1174
+ {
1175
+ lower: "\u0431",
1176
+ upper: "\u0411"
1177
+ },
1178
+ {
1179
+ lower: "\u0432",
1180
+ upper: "\u0412"
1181
+ },
1182
+ {
1183
+ lower: "\u0433",
1184
+ upper: "\u0413"
1185
+ },
1186
+ {
1187
+ lower: "\u0491",
1188
+ upper: "\u0490"
1189
+ },
1190
+ {
1191
+ lower: "\u0434",
1192
+ upper: "\u0414"
1193
+ },
1194
+ {
1195
+ lower: "\u0435",
1196
+ upper: "\u0415"
1197
+ },
1198
+ {
1199
+ lower: "\u0451",
1200
+ upper: "\u0401"
1201
+ },
1202
+ {
1203
+ lower: "\u0436",
1204
+ upper: "\u0416"
1205
+ },
1206
+ {
1207
+ lower: "\u0437",
1208
+ upper: "\u0417"
1209
+ },
1210
+ {
1211
+ lower: "\u0456",
1212
+ upper: "\u0406"
1213
+ },
1214
+ {
1215
+ lower: "\u0439",
1216
+ upper: "\u0419"
1217
+ },
1218
+ {
1219
+ lower: "\u043A",
1220
+ upper: "\u041A"
1221
+ },
1222
+ {
1223
+ lower: "\u043B",
1224
+ upper: "\u041B"
1225
+ },
1226
+ {
1227
+ lower: "\u043C",
1228
+ upper: "\u041C"
1229
+ },
1230
+ {
1231
+ lower: "\u043D",
1232
+ upper: "\u041D"
1233
+ },
1234
+ {
1235
+ lower: "\u043E",
1236
+ upper: "\u041E"
1237
+ },
1238
+ {
1239
+ lower: "\u043F",
1240
+ upper: "\u041F"
1241
+ },
1242
+ {
1243
+ lower: "\u0440",
1244
+ upper: "\u0420"
1245
+ },
1246
+ {
1247
+ lower: "\u0441",
1248
+ upper: "\u0421"
1249
+ },
1250
+ {
1251
+ lower: "\u0442",
1252
+ upper: "\u0422"
1253
+ },
1254
+ {
1255
+ lower: "\u0443",
1256
+ upper: "\u0423"
1257
+ },
1258
+ {
1259
+ lower: "\u045E",
1260
+ upper: "\u040E"
1261
+ },
1262
+ {
1263
+ lower: "\u0444",
1264
+ upper: "\u0424"
1265
+ },
1266
+ {
1267
+ lower: "\u0445",
1268
+ upper: "\u0425"
1269
+ },
1270
+ {
1271
+ lower: "\u0446",
1272
+ upper: "\u0426"
1273
+ },
1274
+ {
1275
+ lower: "\u0447",
1276
+ upper: "\u0427"
1277
+ },
1278
+ {
1279
+ lower: "\u0448",
1280
+ upper: "\u0428"
1281
+ },
1282
+ {
1283
+ lower: "\u044B",
1284
+ upper: "\u042B"
1285
+ },
1286
+ {
1287
+ lower: "\u044C",
1288
+ upper: "\u042C"
1289
+ },
1290
+ {
1291
+ lower: "\u044D",
1292
+ upper: "\u042D"
1293
+ },
1294
+ {
1295
+ lower: "\u044E",
1296
+ upper: "\u042E"
1297
+ },
1298
+ {
1299
+ lower: "\u044F",
1300
+ upper: "\u042F"
1301
+ }
1302
+ ]
1303
+ },
1304
+ apostrophes: {
1305
+ canonical: "\u2019",
1306
+ chars: [
1307
+ "\u2019",
1308
+ "'",
1309
+ "\u02BC",
1310
+ "`",
1311
+ "\u2018"
1312
+ ]
1313
+ },
1314
+ homoglyphs: {
1315
+ pairs: [
1316
+ {
1317
+ latin: "a",
1318
+ cyrillic: "\u0430"
1319
+ },
1320
+ {
1321
+ latin: "e",
1322
+ cyrillic: "\u0435"
1323
+ },
1324
+ {
1325
+ latin: "o",
1326
+ cyrillic: "\u043E"
1327
+ },
1328
+ {
1329
+ latin: "p",
1330
+ cyrillic: "\u0440"
1331
+ },
1332
+ {
1333
+ latin: "c",
1334
+ cyrillic: "\u0441"
1335
+ },
1336
+ {
1337
+ latin: "y",
1338
+ cyrillic: "\u0443"
1339
+ },
1340
+ {
1341
+ latin: "x",
1342
+ cyrillic: "\u0445"
1343
+ },
1344
+ {
1345
+ latin: "i",
1346
+ cyrillic: "\u0456"
1347
+ },
1348
+ {
1349
+ latin: "A",
1350
+ cyrillic: "\u0410"
1351
+ },
1352
+ {
1353
+ latin: "E",
1354
+ cyrillic: "\u0415"
1355
+ },
1356
+ {
1357
+ latin: "O",
1358
+ cyrillic: "\u041E"
1359
+ },
1360
+ {
1361
+ latin: "P",
1362
+ cyrillic: "\u0420"
1363
+ },
1364
+ {
1365
+ latin: "C",
1366
+ cyrillic: "\u0421"
1367
+ },
1368
+ {
1369
+ latin: "Y",
1370
+ cyrillic: "\u0423"
1371
+ },
1372
+ {
1373
+ latin: "X",
1374
+ cyrillic: "\u0425"
1375
+ },
1376
+ {
1377
+ latin: "I",
1378
+ cyrillic: "\u0406"
1379
+ },
1380
+ {
1381
+ latin: "T",
1382
+ cyrillic: "\u0422"
1383
+ },
1384
+ {
1385
+ latin: "H",
1386
+ cyrillic: "\u041D"
1387
+ },
1388
+ {
1389
+ latin: "K",
1390
+ cyrillic: "\u041A"
1391
+ },
1392
+ {
1393
+ latin: "M",
1394
+ cyrillic: "\u041C"
1395
+ },
1396
+ {
1397
+ latin: "B",
1398
+ cyrillic: "\u0412"
1399
+ }
1400
+ ]
1401
+ }
1402
+ };
1403
+
1404
+ // src/normalize.ts
1405
+ var CANONICAL_APOSTROPHE = chars_default.apostrophes.canonical;
1406
+ var APOSTROPHES = new Set(chars_default.apostrophes.chars);
1407
+ var HOMOGLYPH_MAP = new Map(
1408
+ chars_default.homoglyphs.pairs.map((p) => [p.latin, p.cyrillic])
1409
+ );
1410
+ var REVERSE_HOMOGLYPH_MAP = new Map(
1411
+ chars_default.homoglyphs.pairs.map((p) => [p.cyrillic, p.latin])
1412
+ );
1413
+ var ZERO_WIDTH = /* @__PURE__ */ new Set([
1414
+ "\u200B",
1415
+ // zero width space
1416
+ "\u200C",
1417
+ // zero width non-joiner
1418
+ "\u200D",
1419
+ // zero width joiner
1420
+ "\u2060",
1421
+ // word joiner
1422
+ "\uFEFF",
1423
+ // byte order mark
1424
+ "\xAD"
1425
+ // soft hyphen
1426
+ ]);
1427
+ var LETTER_RUN = /\p{L}+/gu;
1428
+ var HAS_CYRILLIC = /\p{Script=Cyrillic}/u;
1429
+ var HAS_LATIN = /\p{Script=Latin}/u;
1430
+ var ANY_HOMOGLYPH = new RegExp(`[${[...HOMOGLYPH_MAP.keys()].join("")}]`);
1431
+ var ANY_REVERSE_HOMOGLYPH = new RegExp(`[${[...REVERSE_HOMOGLYPH_MAP.keys()].join("")}]`);
1432
+ function toNfc(text) {
1433
+ return text.normalize("NFC");
1434
+ }
1435
+ function foldHomoglyphs(text, script = "cyrillic") {
1436
+ if (script === "latin") {
1437
+ return text.replace(LETTER_RUN, (run) => {
1438
+ if (!ANY_REVERSE_HOMOGLYPH.test(run) || !HAS_LATIN.test(run)) return run;
1439
+ return [...run].map((ch) => REVERSE_HOMOGLYPH_MAP.get(ch) ?? ch).join("");
1440
+ });
1441
+ }
1442
+ return text.replace(LETTER_RUN, (run) => {
1443
+ if (!ANY_HOMOGLYPH.test(run) || !HAS_CYRILLIC.test(run)) return run;
1444
+ return [...run].map((ch) => HOMOGLYPH_MAP.get(ch) ?? ch).join("");
1445
+ });
1446
+ }
1447
+ function normalizeApostrophes(text, target = CANONICAL_APOSTROPHE) {
1448
+ return [...text].map((ch) => APOSTROPHES.has(ch) ? target : ch).join("");
1449
+ }
1450
+ function stripZeroWidth(text) {
1451
+ return [...text].filter((ch) => !ZERO_WIDTH.has(ch)).join("");
1452
+ }
1453
+ function sanitize(text, script = "cyrillic") {
1454
+ return normalizeApostrophes(foldHomoglyphs(stripZeroWidth(toNfc(text)), script));
1455
+ }
1456
+
1457
+ // src/tokenize.ts
1458
+ var APOSTROPHE_CLASS = chars_default.apostrophes.chars.join("");
1459
+ function escapeForClass(chs) {
1460
+ return chs.replace(/[\^\]\\-]/g, "\\$&");
1461
+ }
1462
+ var WORD_RE = new RegExp(
1463
+ `\\p{Script=Cyrillic}+(?:[${escapeForClass(APOSTROPHE_CLASS)}\\-]\\p{Script=Cyrillic}+)*`,
1464
+ "u"
1465
+ );
1466
+ var TOKEN_RE = new RegExp(
1467
+ `(?<word>\\p{Script=Cyrillic}+(?:[${escapeForClass(APOSTROPHE_CLASS)}\\-]\\p{Script=Cyrillic}+)*)|(?<latin>\\p{L}+(?:[${escapeForClass(APOSTROPHE_CLASS)}\\-]\\p{L}+)*)|(?<number>\\d+(?:[.,]\\d+)*)|(?<space>\\s+)|(?<punct>[^\\p{L}\\d\\s]+)|(?<other>.)`,
1468
+ "gsu"
1469
+ );
1470
+ var KIND_BY_GROUP = {
1471
+ word: "word",
1472
+ latin: "latin",
1473
+ number: "number",
1474
+ space: "space",
1475
+ punct: "punct",
1476
+ other: "punct"
1477
+ };
1478
+ function tokenize(text) {
1479
+ const tokens = [];
1480
+ TOKEN_RE.lastIndex = 0;
1481
+ for (const m of text.matchAll(TOKEN_RE)) {
1482
+ const groups = m.groups;
1483
+ const kind = Object.keys(groups).find((k) => groups[k] !== void 0) ?? "other";
1484
+ const start = m.index;
1485
+ const end = start + m[0].length;
1486
+ tokens.push({ text: m[0], start, end, kind: KIND_BY_GROUP[kind] });
1487
+ }
1488
+ return tokens;
1489
+ }
1490
+ var BELARUSIAN_LETTERS = new Set(
1491
+ chars_default.alphabet.pairs.map((p) => p.lower)
1492
+ );
1493
+ var WORD_CHARS = /* @__PURE__ */ new Set([...BELARUSIAN_LETTERS, ...APOSTROPHE_CLASS, "-"]);
1494
+ var UPPER_OF = new Map(
1495
+ chars_default.alphabet.pairs.map((p) => [p.lower, p.upper])
1496
+ );
1497
+ var NOT_BELARUSIAN = /* @__PURE__ */ new Set([
1498
+ ...WORD_CHARS,
1499
+ ...[...WORD_CHARS].map((c) => UPPER_OF.get(c) ?? c)
1500
+ ]);
1501
+
1502
+ // src/casing.ts
1503
+ var isAlpha = (c) => /\p{L}/u.test(c);
1504
+ var isLower = (c) => c === c.toLowerCase() && c !== c.toUpperCase();
1505
+ var isUpper = (c) => c === c.toUpperCase() && c !== c.toLowerCase();
1506
+ function detectCase(word) {
1507
+ const letters = [...word].filter(isAlpha);
1508
+ if (letters.length === 0) return "lower";
1509
+ if (letters.every(isLower)) return "lower";
1510
+ if (isUpper(letters[0]) && letters.slice(1).every(isLower)) return "title";
1511
+ if (letters.every(isUpper)) {
1512
+ return letters.length === 1 ? "title" : "upper";
1513
+ }
1514
+ return "mixed";
1515
+ }
1516
+ function applyCase(word, form) {
1517
+ switch (form) {
1518
+ case "lower":
1519
+ return word;
1520
+ case "upper":
1521
+ return word.toUpperCase();
1522
+ case "title": {
1523
+ for (let i = 0; i < word.length; i++) {
1524
+ if (isAlpha(word[i])) {
1525
+ return word.slice(0, i) + word[i].toUpperCase() + word.slice(i + 1);
1526
+ }
1527
+ }
1528
+ return word;
1529
+ }
1530
+ case "mixed":
1531
+ return word;
1532
+ }
1533
+ }
1534
+ function recase(source, target) {
1535
+ return applyCase(target, detectCase(source));
1536
+ }
1537
+
1538
+ // src/translit/engine.ts
1539
+ var VOWELS = /* @__PURE__ */ new Set(["\u0430", "\u0435", "\u0451", "\u0456", "\u043E", "\u0443", "\u044B", "\u044D", "\u044E", "\u044F"]);
1540
+ var GLIDES = /* @__PURE__ */ new Set(["\u045E"]);
1541
+ var SOFT_VOWELS = /* @__PURE__ */ new Set(["\u0435", "\u0451", "\u0456", "\u044E", "\u044F"]);
1542
+ var APOSTROPHES2 = /* @__PURE__ */ new Set(["\u2019", "'", "\u02BC", "`", "\u2018"]);
1543
+ var SOFT_SIGN = "\u044C";
1544
+ function isVowel(ch) {
1545
+ return VOWELS.has(ch) || GLIDES.has(ch);
1546
+ }
1547
+ function isConsonant(ch) {
1548
+ return !!ch && /\p{L}/u.test(ch) && !isVowel(ch) && ch !== SOFT_SIGN && ch !== "\u044A";
1549
+ }
1550
+ var CONDITIONS = {
1551
+ default: () => true,
1552
+ initial: (_s, i) => i === 0,
1553
+ final: (s, _i, j) => j >= s.length,
1554
+ after_vowel: (s, i) => i > 0 && isVowel(s[i - 1]),
1555
+ after_consonant: (s, i) => i > 0 && isConsonant(s[i - 1]),
1556
+ after_apostrophe: (s, i) => i > 0 && APOSTROPHES2.has(s[i - 1]),
1557
+ after_soft_sign: (s, i) => i > 0 && s[i - 1] === SOFT_SIGN,
1558
+ after_l: (s, i) => i > 0 && s[i - 1] === "\u043B",
1559
+ before_vowel: (s, _i, j) => j < s.length && isVowel(s[j]),
1560
+ before_soft_vowel: (s, _i, j) => j < s.length && SOFT_VOWELS.has(s[j]),
1561
+ before_consonant: (s, _i, j) => j < s.length && isConsonant(s[j])
1562
+ };
1563
+ function holds(mapping, text, start, end) {
1564
+ return mapping.when.some((c) => CONDITIONS[c](text, start, end));
1565
+ }
1566
+ var Scheme = class {
1567
+ name;
1568
+ tests;
1569
+ maxLen;
1570
+ bySource;
1571
+ constructor(scheme) {
1572
+ this.name = scheme.scheme;
1573
+ this.tests = scheme.tests;
1574
+ const bySource = /* @__PURE__ */ new Map();
1575
+ let maxLen = 1;
1576
+ for (const m of scheme.mappings) {
1577
+ const list = bySource.get(m.from) ?? [];
1578
+ list.push({ source: m.from, target: m.to, when: m.when.split("|"), lossy: m.lossy });
1579
+ bySource.set(m.from, list);
1580
+ maxLen = Math.max(maxLen, m.from.length);
1581
+ }
1582
+ this.bySource = bySource;
1583
+ this.maxLen = maxLen;
1584
+ }
1585
+ /** The longest grapheme at `start` whose condition holds: [output, consumed, lossy]. */
1586
+ lookup(text, start) {
1587
+ for (let length = Math.min(this.maxLen, text.length - start); length >= 1; length--) {
1588
+ const end = start + length;
1589
+ const candidates = this.bySource.get(text.slice(start, end));
1590
+ if (!candidates) continue;
1591
+ for (const mapping of candidates) {
1592
+ if (holds(mapping, text, start, end)) return [mapping.target, length, mapping.lossy];
1593
+ }
1594
+ }
1595
+ return null;
1596
+ }
1597
+ };
1598
+ function transliterateWord(scheme, word) {
1599
+ const out = [];
1600
+ const unresolved = [];
1601
+ let i = 0;
1602
+ while (i < word.length) {
1603
+ const hit = scheme.lookup(word, i);
1604
+ if (hit === null) {
1605
+ const ch = word[i];
1606
+ if (!unresolved.includes(ch)) unresolved.push(ch);
1607
+ out.push(ch);
1608
+ i += 1;
1609
+ continue;
1610
+ }
1611
+ const [target, consumed, lossy] = hit;
1612
+ out.push(target);
1613
+ if (lossy) {
1614
+ const grapheme = word.slice(i, i + consumed);
1615
+ if (!unresolved.includes(grapheme)) unresolved.push(grapheme);
1616
+ }
1617
+ i += consumed;
1618
+ }
1619
+ return { text: out.join(""), unresolved };
1620
+ }
1621
+ function transliterateToken(scheme, word) {
1622
+ const result = transliterateWord(scheme, word.toLowerCase());
1623
+ return { text: recase(word, result.text), unresolved: result.unresolved };
1624
+ }
1625
+
1626
+ // src/translit/index.ts
1627
+ var PAIRED = {
1628
+ lacinka: "taraskievica",
1629
+ official: "narkamauka"
1630
+ };
1631
+ var REVERSIBLE = /* @__PURE__ */ new Set(["lacinka"]);
1632
+ var Transliterator = class _Transliterator {
1633
+ scheme;
1634
+ constructor(scheme) {
1635
+ this.scheme = scheme;
1636
+ }
1637
+ static fromData(translit, script, reverse = false) {
1638
+ if (reverse && !REVERSIBLE.has(script)) {
1639
+ throw new Error(
1640
+ `${script} is forward-only: it does not write assimilative softness, so a reverse table could not round-trip`
1641
+ );
1642
+ }
1643
+ const name = reverse ? `${script}_reverse` : script;
1644
+ const data = translit.schemes[name];
1645
+ if (!data) throw new Error(`no transliteration scheme named ${JSON.stringify(name)}`);
1646
+ return new _Transliterator(new Scheme(data));
1647
+ }
1648
+ word(word) {
1649
+ return transliterateToken(this.scheme, word);
1650
+ }
1651
+ /** Only word tokens are transliterated; numbers, punctuation and whitespace are
1652
+ * reproduced byte for byte. */
1653
+ transliterate(text) {
1654
+ const out = [];
1655
+ const unresolved = [];
1656
+ for (const token of tokenize(text)) {
1657
+ if (token.kind === "word" || token.kind === "latin") {
1658
+ const result = transliterateToken(this.scheme, token.text);
1659
+ out.push(result.text);
1660
+ for (const ch of result.unresolved) if (!unresolved.includes(ch)) unresolved.push(ch);
1661
+ } else {
1662
+ out.push(token.text);
1663
+ }
1664
+ }
1665
+ return { text: out.join(""), unresolved };
1666
+ }
1667
+ };
1668
+ function transliterate(translit, text, script, reverse = false) {
1669
+ const sourceScript = reverse ? "latin" : "cyrillic";
1670
+ return Transliterator.fromData(translit, script, reverse).transliterate(sanitize(text, sourceScript)).text;
1671
+ }
1672
+
1673
+ // src/translit.ts
1674
+ var DATA = translit_default;
1675
+ var cache = /* @__PURE__ */ new Map();
1676
+ function schemeFor(script, reverse) {
1677
+ const key = `${script}\0${reverse}`;
1678
+ let t = cache.get(key);
1679
+ if (!t) {
1680
+ t = Transliterator.fromData(DATA, script, reverse);
1681
+ cache.set(key, t);
1682
+ }
1683
+ return t;
1684
+ }
1685
+ function transliterate2(text, script, options = {}) {
1686
+ return transliterate(DATA, text, script, options.reverse ?? false);
1687
+ }
1688
+ function transliterateResult(text, script, options = {}) {
1689
+ return schemeFor(script, options.reverse ?? false).transliterate(text);
1690
+ }
1691
+ // Annotate the CommonJS export names for ESM import in node:
1692
+ 0 && (module.exports = {
1693
+ PAIRED,
1694
+ REVERSIBLE,
1695
+ Transliterator,
1696
+ transliterate,
1697
+ transliterateResult
1698
+ });