-
Notifications
You must be signed in to change notification settings - Fork 1
/
acronym.go
99 lines (92 loc) · 1.39 KB
/
acronym.go
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package strcase
import (
"sort"
"strings"
"sync"
)
var acrMap = &sync.Map{}
var _baseAcronyms = []string{
"ID",
"IDs",
"APP",
"IP",
"URL",
"UUID",
"UUIDs",
"HTTP",
"HTTPS",
"ASCII",
"NASA",
"LOL",
"JSON",
"IDE",
"ES",
"GUI",
"IIFE",
"XML",
"SEO",
"UX",
"JS",
"API",
"UTC",
"EOF",
"FIFO",
"SDK",
"SQL",
"SOAP",
"ORM",
"OOP",
"TDD",
"BDD",
"SAAS",
"PAAS",
"IOT",
"WYSIWYG",
"SMACSS",
"SOLID",
"YAGNI",
"CRUD",
"CDN",
"MVC",
}
func init() {
for _, acronym := range _baseAcronyms {
loadAcronym(acronym)
}
}
func loadAcronym(acr string, variants ...string) {
lower := false
for _, v := range variants {
if strings.ToLower(v) == v {
lower = true
break
}
}
if !lower {
variants = append(variants, strings.ToLower(acr))
}
for _, variant := range variants {
acrMap.Store(variant, []rune(acr))
}
}
func AddAcronym(acr string, variants ...string) {
loadAcronym(acr, variants...)
}
func SetAcronyms(acrs map[string][]string) {
values := make([]string, 0, len(acrs))
for acr, vars := range acrs {
values = append(values, acr)
loadAcronym(acr, vars...)
}
sort.Strings(values)
acrMap.Range(func(key, value interface{}) bool {
if !bins(values, string(value.([]rune))) {
acrMap.Delete(key)
}
return true
})
}
func bins(arr []string, target string) bool {
index := sort.SearchStrings(arr, target)
return index < len(arr) && arr[index] == target
}