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 "ý": "y",
89 "þ": "b",
90 "ÿ": "y",
91 "Ŕ": "R",
92 "ŕ": "r",
93 }
94)
95
96// clean makes string more cleaner.
97// It changes non-latin letters with latin version.
98// It removes non–alpha-numeric characters.
99func clean(str string) string {
100 for o, n := range changes {
101 str = strings.ReplaceAll(str, o, n)
102 }
103
104 str = nonAlphaNumRegex.ReplaceAllString(str, " ")
105
106 return str
107}
108
109// removeSpaces removes consecutive whitespaces.
110func removeSpaces(str string) string {
111 return whitespaceRegex.ReplaceAllString(str, "")
112}
113
114// snakeCase converts string to snake_case from PascalCase
115func snakeCase(str string) string {
116 var output strings.Builder
117 for i, r := range str {
118 switch {
119 case unicode.IsUpper(r):
120 if i != 0 {
121 output.WriteRune('_')
122 }
123 output.WriteRune(unicode.ToLower(r))
124 case unicode.IsDigit(r):
125 if i != 0 && !unicode.IsDigit(rune(str[i-1])) {
126 output.WriteRune('_')
127 }
128 output.WriteRune(r)
129 default:
130 output.WriteRune(r)
131 }
132 }
133
134 return output.String()
135}
136
137func makeAlias(str string) string {
138 return ":" + str + ":"
139}