internal/generator/strutil.go (view raw)
1package main
2
3import (
4 "regexp"
5 "strings"
6 "unicode"
7)
8
9var (
10 nonAlphaNumRegex = regexp.MustCompile(`[^\w\d]+`)
11 whitespaceRegex = regexp.MustCompile(`\s+`)
12
13 changes = map[string]string{
14 "*": "asterisk",
15 "#": "hash",
16 "1st": "first",
17 "2nd": "second",
18 "3rd": "third",
19 "&": "and",
20 "U.S.": "US",
21 "Š": "S",
22 "š": "s",
23 "Đ": "Dj",
24 "đ": "dj",
25 "Ž": "Z",
26 "ž": "z",
27 "Č": "C",
28 "č": "c",
29 "Ć": "C",
30 "ć": "c",
31 "À": "A",
32 "Á": "A",
33 "Â": "A",
34 "Ã": "A",
35 "Ä": "A",
36 "Å": "A",
37 "Æ": "A",
38 "Ç": "C",
39 "È": "E",
40 "É": "E",
41 "Ê": "E",
42 "Ë": "E",
43 "Ì": "I",
44 "Í": "I",
45 "Î": "I",
46 "Ï": "I",
47 "Ñ": "N",
48 "Ò": "O",
49 "Ó": "O",
50 "Ô": "O",
51 "Õ": "O",
52 "Ö": "O",
53 "Ø": "O",
54 "Ù": "U",
55 "Ú": "U",
56 "Û": "U",
57 "Ü": "U",
58 "Ý": "Y",
59 "Þ": "B",
60 "ß": "Ss",
61 "à": "a",
62 "á": "a",
63 "â": "a",
64 "ã": "a",
65 "ä": "a",
66 "å": "a",
67 "æ": "a",
68 "ç": "c",
69 "è": "e",
70 "é": "e",
71 "ê": "e",
72 "ë": "e",
73 "ì": "i",
74 "í": "i",
75 "î": "i",
76 "ï": "i",
77 "ð": "o",
78 "ñ": "n",
79 "ò": "o",
80 "ó": "o",
81 "ô": "o",
82 "õ": "o",
83 "ö": "o",
84 "ø": "o",
85 "ù": "u",
86 "ú": "u",
87 "û": "u",
88 "ü": "u",
89 "ý": "y",
90 "þ": "b",
91 "ÿ": "y",
92 "Ŕ": "R",
93 "ŕ": "r",
94 }
95)
96
97// clean makes string more cleaner.
98// It changes non-latin letters with latin version.
99// It removes non–alpha-numeric characters.
100func clean(str string) string {
101 for o, n := range changes {
102 str = strings.ReplaceAll(str, o, n)
103 }
104
105 str = nonAlphaNumRegex.ReplaceAllString(str, " ")
106
107 return str
108}
109
110// removeSpaces removes consecutive whitespaces.
111func removeSpaces(str string) string {
112 return whitespaceRegex.ReplaceAllString(str, "")
113}
114
115// snakeCase converts string to snake_case from PascalCase
116func snakeCase(str string) string {
117 var output strings.Builder
118 for i, r := range str {
119 switch {
120 case unicode.IsUpper(r):
121 if i != 0 {
122 output.WriteRune('_')
123 }
124 output.WriteRune(unicode.ToLower(r))
125 case unicode.IsDigit(r):
126 if i != 0 && !unicode.IsDigit(rune(str[i-1])) {
127 output.WriteRune('_')
128 }
129 output.WriteRune(r)
130 default:
131 output.WriteRune(r)
132 }
133 }
134
135 return output.String()
136}
137
138func makeAlias(str string) string {
139 return ":" + str + ":"
140}