package shared import ( "strings" "golang.org/x/text/cases" "golang.org/x/text/unicode/norm" ) // TextComparisonPolicy identifies the shared D&D text-comparison semantics. // A semantic change requires a new value and a review of every dependent // identity, mapping, normalization, and validator policy. const TextComparisonPolicy = "dnd.text_comparison.v1" // ComparisonKey returns the D&D Unicode- and case-insensitive comparison key. func ComparisonKey(value string) string { value = norm.NFKC.String(value) value = strings.Map(func(r rune) rune { switch r { case '\u2018', '\u2019', '\u02bc': return '\'' default: return r } }, value) value = strings.Join(strings.Fields(value), " ") return cases.Fold().String(value) }