all repos

clerk @ 17e6766e0ee81ee4057b536903d2f6d5419320aa

missing tooling for ledger/hledger

clerk/internal/lsp/transliteration.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
lsp: latin to cyrillic transliteration, 1 month ago
1
package lsp
2
3
import "strings"
4
5
// latinToCyrillicTable maps latin input to Ukrainian Cyrillic.
6
// Ordered longest-first so greedy scanning matches "shch" as щ before it can match "sh"+"ch".
7
var latinToCyrillicTable = [...]struct{ latin, cyrillic string }{
8
	{"shch", "щ"},
9
	{"sch", "щ"},
10
	{"dzh", "дж"},
11
	{"zh", "ж"},
12
	{"kh", "х"},
13
	{"ts", "ц"},
14
	{"ch", "ч"},
15
	{"sh", "ш"},
16
	{"dz", "дз"},
17
	{"yu", "ю"},
18
	{"ya", "я"},
19
	{"ye", "є"},
20
	{"yi", "ї"},
21
	{"ji", "ї"},
22
	{"a", "а"},
23
	{"b", "б"},
24
	{"v", "в"},
25
	{"g", "г"},
26
	{"d", "д"},
27
	{"e", "е"},
28
	{"z", "з"},
29
	{"i", "і"},
30
	{"j", "й"},
31
	{"k", "к"},
32
	{"l", "л"},
33
	{"m", "м"},
34
	{"n", "н"},
35
	{"o", "о"},
36
	{"p", "п"},
37
	{"r", "р"},
38
	{"s", "с"},
39
	{"t", "т"},
40
	{"u", "у"},
41
	{"f", "ф"},
42
	{"h", "х"},
43
	{"c", "ц"},
44
	{"q", "к"},
45
	{"x", "кс"},
46
	{"w", "в"},
47
	{"y", "и"},
48
}
49
50
func latinToCyrillic(pattern string) string {
51
	p := strings.ToLower(pattern)
52
	var b strings.Builder
53
	b.Grow(len(p))
54
	for i := 0; i < len(p); {
55
		for _, kv := range latinToCyrillicTable {
56
			if strings.HasPrefix(p[i:], kv.latin) {
57
				b.WriteString(kv.cyrillic)
58
				i += len(kv.latin)
59
				goto next
60
			}
61
		}
62
		b.WriteByte(p[i])
63
		i++
64
	next:
65
	}
66
	return b.String()
67
}