29 lines
751 B
Go
29 lines
751 B
Go
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)
|
|
}
|