12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- package stringx
- import (
- "bytes"
- )
- type (
- // Replacer interface wraps the Replace method.
- Replacer interface {
- Replace(text string) string
- }
- replacer struct {
- *node
- mapping map[string]string
- }
- )
- // NewReplacer returns a Replacer.
- func NewReplacer(mapping map[string]string) Replacer {
- rep := &replacer{
- node: new(node),
- mapping: mapping,
- }
- for k := range mapping {
- rep.add(k)
- }
- rep.build()
- return rep
- }
- // Replace replaces text with given substitutes.
- func (r *replacer) Replace(text string) string {
- var buf bytes.Buffer
- target := []rune(text)
- cur := r.node
- nextStart := 0
- for len(target) != 0 {
- used, jump, matched := cur.longestMatch(target, nextStart)
- if matched {
- replaced := r.mapping[string(target[:used])]
- target = append([]rune(replaced), target[used:]...)
- cur = r.node
- } else {
- buf.WriteString(string(target[:used]))
- target = target[used:]
- if jump != nil {
- cur = jump
- nextStart = jump.depth
- } else {
- cur = r.node
- nextStart = 0
- }
- }
- }
- return buf.String()
- }
|