blob: d2224d6be869dabe7bb0ae8d1ca9fc7535480eb3 [file] [log] [blame]
// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package precis
import (
"unicode"
"golang.org/x/text/runes"
"golang.org/x/text/transform"
"golang.org/x/text/unicode/norm"
"golang.org/x/text/width"
)
var (
Nickname Profile = nickname // Implements the Nickname profile specified in RFC 7700.
UsernameCaseMapped Profile = usernamecasemap // Implements the UsernameCaseMapped profile specified in RFC 7613.
UsernameCasePreserved Profile = usernamenocasemap // Implements the UsernameCasePreserved profile specified in RFC 7613.
OpaqueString Profile = opaquestring // Implements the OpaqueString profile defined in RFC 7613 for passwords and other secure labels.
)
// TODO: mvl: "Ultimately, I would manually define the structs for the internal
// profiles. This avoid pulling in unneeded tables when they are not used."
var (
nickname Profile = NewFreeform(
AdditionalMapping(func() transform.Transformer {
return &nickAdditionalMapping{}
}),
IgnoreCase,
Norm(norm.NFKC),
DisallowEmpty,
)
usernamecasemap Profile = NewIdentifier(
AllowWide,
FoldCase(),
Norm(norm.NFC),
// TODO: BIDI rule
)
usernamenocasemap Profile = NewIdentifier(
AllowWide,
Norm(norm.NFC),
Width(width.Fold), // TODO: Is this correct?
// TODO: BIDI rule
)
opaquestring Profile = NewFreeform(
AdditionalMapping(func() transform.Transformer {
return runes.Map(func(r rune) rune {
if unicode.Is(unicode.Zs, r) {
return ' '
}
return r
})
}),
Norm(norm.NFC),
DisallowEmpty,
)
)