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  }