github.com/Axway/agent-sdk@v1.1.101/pkg/util/normalize.go (about) 1 package util 2 3 import ( 4 "regexp" 5 "strings" 6 "unicode" 7 8 "golang.org/x/text/runes" 9 "golang.org/x/text/transform" 10 "golang.org/x/text/unicode/norm" 11 ) 12 13 const ( 14 separator = "-" 15 ) 16 17 func NormalizeNameForCentral(str string) string { 18 if str == "" { 19 return "" 20 } 21 22 str = strings.Trim(str, " ") // remove leading and trailing blanks 23 24 // replace accented characters with their non-accented English character equivalents. 25 str = removeDiacritics(str) 26 str = regexp.MustCompile(`[ß]`).ReplaceAllString(str, "ss") 27 str = regexp.MustCompile(`[Øø]`).ReplaceAllString(str, "o") 28 str = regexp.MustCompile(`[Ææ]`).ReplaceAllString(str, "ae") 29 str = regexp.MustCompile(`[Œœ]`).ReplaceAllString(str, "oe") 30 31 // make string all lowercase 32 str = strings.ToLower(str) 33 34 // replace invalid characters with "-" and reduce to 1 "-" maximum 35 str = regexp.MustCompile(`[^a-z0-9-]`).ReplaceAllString(str, separator) 36 str = regexp.MustCompile(`[-]{2,}`).ReplaceAllString(str, separator) 37 38 // remove leading and trailing "-" 39 str = strings.Trim(str, separator) 40 41 return str 42 } 43 44 type runesSet struct{} 45 46 func (s runesSet) Contains(r rune) bool { 47 return unicode.Is(unicode.Mn, r) // Mn: nonspacing marks 48 } 49 50 func removeDiacritics(input string) string { 51 t := transform.Chain(norm.NFD, runes.Remove(runesSet{}), norm.NFC) 52 result, _, _ := transform.String(t, input) 53 return result 54 }