package precis
import (
"golang.org/x/text/cases"
"golang.org/x/text/language"
"golang.org/x/text/runes"
"golang.org/x/text/transform"
"golang.org/x/text/unicode/norm"
)
type Option func (*options )
type options struct {
foldWidth bool
asciiLower bool
cases transform .SpanningTransformer
disallow runes .Set
norm transform .SpanningTransformer
additional []func () transform .SpanningTransformer
width transform .SpanningTransformer
disallowEmpty bool
bidiRule bool
repeat bool
ignorecase bool
}
func getOpts(o ...Option ) (res options ) {
for _ , f := range o {
f (&res )
}
if res .norm == nil {
res .norm = norm .NFC
}
return
}
var (
IgnoreCase Option = ignoreCase
FoldWidth Option = foldWidth
DisallowEmpty Option = disallowEmpty
BidiRule Option = bidiRule
)
var (
ignoreCase = func (o *options ) {
o .ignorecase = true
}
foldWidth = func (o *options ) {
o .foldWidth = true
}
disallowEmpty = func (o *options ) {
o .disallowEmpty = true
}
bidiRule = func (o *options ) {
o .bidiRule = true
}
repeat = func (o *options ) {
o .repeat = true
}
)
type spanWrap struct { transform .Transformer }
func (s spanWrap ) Span (src []byte , atEOF bool ) (n int , err error ) {
return 0 , transform .ErrEndOfSpan
}
func AdditionalMapping (t ...func () transform .Transformer ) Option {
return func (o *options ) {
for _ , f := range t {
sf := func () transform .SpanningTransformer {
return f ().(transform .SpanningTransformer )
}
if _ , ok := f ().(transform .SpanningTransformer ); !ok {
sf = func () transform .SpanningTransformer {
return spanWrap {f ()}
}
}
o .additional = append (o .additional , sf )
}
}
}
func Norm (f norm .Form ) Option {
return func (o *options ) {
o .norm = f
}
}
func FoldCase (opts ...cases .Option ) Option {
return func (o *options ) {
o .asciiLower = true
o .cases = cases .Fold (opts ...)
}
}
func LowerCase (opts ...cases .Option ) Option {
return func (o *options ) {
o .asciiLower = true
if len (opts ) == 0 {
o .cases = cases .Lower (language .Und , cases .HandleFinalSigma (false ))
return
}
opts = append ([]cases .Option {cases .HandleFinalSigma (false )}, opts ...)
o .cases = cases .Lower (language .Und , opts ...)
}
}
func Disallow (set runes .Set ) Option {
return func (o *options ) {
o .disallow = set
}
}
The pages are generated with Golds v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .