// NewTransformer creates a new transform.Transformer that performs the PRECIS // preparation and enforcement steps on the given UTF-8 encoded bytes. func (p *Profile) NewTransformer() *Transformer { var ts []transform.Transformer // These transforms are applied in the order defined in // https://tools.ietf.org/html/rfc7564#section-7 if p.options.foldWidth { ts = append(ts, width.Fold) } for _, f := range p.options.additional { ts = append(ts, f()) } if p.options.cases != nil { ts = append(ts, p.options.cases) } ts = append(ts, p.options.norm) if p.options.bidiRule { ts = append(ts, bidirule.New()) } ts = append(ts, &checker{p: p, allowed: p.Allowed()}) // TODO: Add the disallow empty rule with a dummy transformer? return &Transformer{transform.Chain(ts...)} }
func (b *buffers) enforce(p *Profile, src []byte) (str []byte, err error) { b.src = src // These transforms are applied in the order defined in // https://tools.ietf.org/html/rfc7564#section-7 // TODO: allow different width transforms options. if p.options.foldWidth { // TODO: use Span, once available. if err = b.apply(width.Fold); err != nil { return nil, err } } for _, f := range p.options.additional { if err = b.apply(f()); err != nil { return nil, err } } if p.options.cases != nil { if err = b.apply(p.options.cases); err != nil { return nil, err } } if n := p.norm.QuickSpan(b.src); n < len(b.src) { x := b.next & 1 n = copy(b.buf[x], b.src[:n]) b.src, _, err = transform.Append(p.norm, b.buf[x][:n], b.src[n:]) b.buf[x] = b.src b.next++ if err != nil { return nil, err } } if p.options.bidiRule { if err := b.apply(bidirule.New()); err != nil { return nil, err } } c := checker{p: p} if _, err := c.span(b.src, true); err != nil { return nil, err } if p.disallow != nil { for i := 0; i < len(b.src); { r, size := utf8.DecodeRune(b.src[i:]) if p.disallow.Contains(r) { return nil, errDisallowedRune } i += size } } // TODO: Add the disallow empty rule with a dummy transformer? if p.options.disallowEmpty && len(b.src) == 0 { return nil, errEmptyString } return b.src, nil }