-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.ts
84 lines (80 loc) · 2.29 KB
/
index.ts
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
// https://zakon.rada.gov.ua/laws/show/55-2010-%D0%BF#Text
type CharTransliteration = (prefix: string) => string
type AlphabetTransliteration = Map<string, CharTransliteration>
const uaToLatin: AlphabetTransliteration = new Map<string, CharTransliteration>([
["а", () => "a"],
["б", () => "b"],
["в", () => "v"],
["г", (acc: string) => acc.length > 0 && acc[acc.length - 1] == "z"
? "gh"
: "h"
],
["ґ", () => "g"],
["д", () => "d"],
["е", () => "e"],
["є", (acc: string) => acc.length == 0
? "ye"
: "ie"
],
["ж", () => "zh"],
["з", () => "z"],
["и", () => "y"],
["і", () => "i"],
["ї", (acc: string) => acc.length == 0
? "yi"
: "i"
],
["й", (acc: string) => acc.length == 0
? "y"
: "i"
],
["к", () => "k"],
["л", () => "l"],
["м", () => "m"],
["н", () => "n"],
["о", () => "o"],
["п", () => "p"],
["р", () => "r"],
["с", () => "s"],
["т", () => "t"],
["у", () => "u"],
["ф", () => "f"],
["х", () => "kh"],
["ц", () => "ts"],
["ч", () => "ch"],
["ш", () => "sh"],
["щ", () => "shch"],
["ь", () => ""],
["ю", (acc: string) => acc.length == 0
? "yu"
: "iu"
],
["я", (acc: string) => acc.length == 0
? "ya"
: "ia"
],
["ʼ", () => ""],
["’", () => ""],
["'", () => ""],
["`", () => ""],
]);
const transliterate = (transliterations: AlphabetTransliteration, source: string) =>
source
.split(/\s/)
.map((value) =>
[...value].reduce((acc, char) => {
const lowercased = char.toLowerCase()
const transliteration = transliterations.get(lowercased)
if (transliteration !== undefined) {
const result = transliteration!!(acc.toLowerCase())
return acc + (char == lowercased
? result
: result.charAt(0).toUpperCase() + result.substring(1)
)
} else {
return acc + char
}
}, "")
)
.join(" ");
export const transliterateUaToLatin = (source: string) => transliterate(uaToLatin, source)