package precis
import (
)
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 ( ...Option) ( options) {
for , := range {
(&)
}
if .norm == nil {
.norm = norm.NFC
}
return
}
var (
IgnoreCase Option = ignoreCase
FoldWidth Option = foldWidth
DisallowEmpty Option = disallowEmpty
BidiRule Option = bidiRule
)
var (
ignoreCase = func( *options) {
.ignorecase = true
}
foldWidth = func( *options) {
.foldWidth = true
}
disallowEmpty = func( *options) {
.disallowEmpty = true
}
bidiRule = func( *options) {
.bidiRule = true
}
repeat = func( *options) {
.repeat = true
}
)
type spanWrap struct{ transform.Transformer }
func ( spanWrap) ( []byte, bool) ( int, error) {
return 0, transform.ErrEndOfSpan
}
func ( ...func() transform.Transformer) Option {
return func( *options) {
for , := range {
:= func() transform.SpanningTransformer {
return ().(transform.SpanningTransformer)
}
if , := ().(transform.SpanningTransformer); ! {
= func() transform.SpanningTransformer {
return spanWrap{()}
}
}
.additional = append(.additional, )
}
}
}
func ( norm.Form) Option {
return func( *options) {
.norm =
}
}
func ( ...cases.Option) Option {
return func( *options) {
.asciiLower = true
.cases = cases.Fold(...)
}
}
func ( ...cases.Option) Option {
return func( *options) {
.asciiLower = true
if len() == 0 {
.cases = cases.Lower(language.Und, cases.HandleFinalSigma(false))
return
}
= append([]cases.Option{cases.HandleFinalSigma(false)}, ...)
.cases = cases.Lower(language.Und, ...)
}
}
func ( runes.Set) Option {
return func( *options) {
.disallow =
}
}