123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- package stringx
- import "strings"
- type (
- Replacer interface {
- Replace(text string) string
- }
- replacer struct {
- node
- mapping map[string]string
- }
- )
- func NewReplacer(mapping map[string]string) Replacer {
- var rep = &replacer{
- mapping: mapping,
- }
- for k := range mapping {
- rep.add(k)
- }
- return rep
- }
- func (r *replacer) Replace(text string) string {
- var builder strings.Builder
- var chars = []rune(text)
- var size = len(chars)
- var start = -1
- for i := 0; i < size; i++ {
- child, ok := r.children[chars[i]]
- if !ok {
- builder.WriteRune(chars[i])
- continue
- }
- if start < 0 {
- start = i
- }
- var end = -1
- if child.end {
- end = i + 1
- }
- var j = i + 1
- for ; j < size; j++ {
- grandchild, ok := child.children[chars[j]]
- if !ok {
- break
- }
- child = grandchild
- if child.end {
- end = j + 1
- i = j
- }
- }
- if end > 0 {
- i = j - 1
- builder.WriteString(r.mapping[string(chars[start:end])])
- } else {
- builder.WriteRune(chars[i])
- }
- start = -1
- }
- return builder.String()
- }
|