| // 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" | |
| ) | |
| var ( | |
| // Implements the Nickname profile specified in RFC 8266. | |
| Nickname *Profile = nickname | |
| // Implements the UsernameCaseMapped profile specified in RFC 8265. | |
| UsernameCaseMapped *Profile = usernameCaseMap | |
| // Implements the UsernameCasePreserved profile specified in RFC 8265. | |
| UsernameCasePreserved *Profile = usernameNoCaseMap | |
| // Implements the OpaqueString profile defined in RFC 8265 for passwords and | |
| // other secure labels. | |
| OpaqueString *Profile = opaquestring | |
| ) | |
| var ( | |
| nickname = &Profile{ | |
| options: getOpts( | |
| AdditionalMapping(func() transform.Transformer { | |
| return &nickAdditionalMapping{} | |
| }), | |
| IgnoreCase, | |
| Norm(norm.NFKC), | |
| DisallowEmpty, | |
| repeat, | |
| ), | |
| class: freeform, | |
| } | |
| usernameCaseMap = &Profile{ | |
| options: getOpts( | |
| FoldWidth, | |
| LowerCase(), | |
| Norm(norm.NFC), | |
| BidiRule, | |
| ), | |
| class: identifier, | |
| } | |
| usernameNoCaseMap = &Profile{ | |
| options: getOpts( | |
| FoldWidth, | |
| Norm(norm.NFC), | |
| BidiRule, | |
| ), | |
| class: identifier, | |
| } | |
| opaquestring = &Profile{ | |
| options: getOpts( | |
| AdditionalMapping(func() transform.Transformer { | |
| return mapSpaces | |
| }), | |
| Norm(norm.NFC), | |
| DisallowEmpty, | |
| ), | |
| class: freeform, | |
| } | |
| ) | |
| // mapSpaces is a shared value of a runes.Map transformer. | |
| var mapSpaces transform.Transformer = runes.Map(func(r rune) rune { | |
| if unicode.Is(unicode.Zs, r) { | |
| return ' ' | |
| } | |
| return r | |
| }) |