You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
1.6 KiB
78 lines
1.6 KiB
// 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 |
|
})
|
|
|