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
| package util
import ( "strings" "unicode"
"github.com/pkg/errors" "github.com/samber/lo" )
var acronymMap = map[string]string{}
func ConfigureAcronym(key, val string) { acronymMap[key] = val }
var acronyms []string
func InitAcronyms(extras ...string) error { if len(acronyms) > 0 { return errors.New("double initialization of acronyms") } x := []string{"Api", "Html", "Id", "Ip", "Json", "Md5", "Sha", "Sku", "Sql", "Xml", "Uri", "Url"} x = append(x, lo.Map(extras, func(s string, _ int) string { return strings.ToUpper(s[:1]) + strings.ToLower(s[1:]) })...) lo.ForEach(x, func(x string, _ int) { ConfigureAcronym(strings.ToUpper(x), strings.ToLower(x)) }) acronyms = x return nil }
func acr(ret string, extraAcronyms ...string) string { proc := func(a string) { var lastIdx int for { i := strings.Index(ret[lastIdx:], a) if i == -1 { if strings.EqualFold(a, ret) && unicode.IsUpper(rune(ret[0])) { ret = strings.ToUpper(a) } break } i += lastIdx lastIdx = i + len(a) if lastIdx >= len(ret) { ret = ret[:i] + strings.ToUpper(a) + ret[lastIdx:] } else { s := string(ret[lastIdx]) if strings.ToUpper(s) == s { ret = ret[:i] + strings.ToUpper(a) + ret[lastIdx:] } else { lastIdx++ } } } } lo.ForEach(acronyms, func(a string, _ int) { proc(a) }) lo.ForEach(extraAcronyms, func(a string, _ int) { proc(a) }) return ret }
|