| // 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 |
| }) |