github.com/whatap/golib@v0.0.22/util/paramtext/ParamText.go (about) 1 package paramtext 2 3 import ( 4 "bytes" 5 //"fmt" 6 "strings" 7 ) 8 9 type REF struct { 10 key string 11 } 12 type ParamText struct { 13 startBrace string 14 endBrace string 15 tokenList []interface{} 16 keyList []string 17 origin string 18 } 19 20 func (this *ParamText) ToStringMap(p map[string]string) string { 21 var buffer bytes.Buffer 22 23 for i := 0; i < len(this.tokenList); i++ { 24 t := this.tokenList[i] 25 switch t.(type) { 26 case string: 27 buffer.WriteString(t.(string)) 28 default: 29 r := t.(*REF) 30 if p == nil { 31 buffer.WriteString(this.startBrace) 32 buffer.WriteString(r.key) 33 buffer.WriteString(this.endBrace) 34 } else { 35 v, ok := p[r.key] 36 if ok { 37 buffer.WriteString(v) 38 } else { 39 buffer.WriteString(this.startBrace) 40 buffer.WriteString(r.key) 41 buffer.WriteString(this.endBrace) 42 } 43 } 44 } 45 } 46 return buffer.String() 47 } 48 49 func (this *ParamText) GetKeys() []string { 50 return this.keyList 51 } 52 53 func (this *ParamText) GetOriginal() string { 54 return this.origin 55 } 56 57 func (this *ParamText) ToStringStr(p string) string { 58 var buffer bytes.Buffer 59 60 for i := 0; i < len(this.tokenList); i++ { 61 t := this.tokenList[i] 62 switch t.(type) { 63 case string: 64 buffer.WriteString(t.(string)) 65 default: 66 buffer.WriteString(p) 67 } 68 } 69 return buffer.String() 70 } 71 72 func NewParamText(plainText string) *ParamText { 73 return NewParamTextBrace(plainText, "${", "}") 74 } 75 func NewParamTextBrace(plainText string, startBrace string, endBrace string) *ParamText { 76 p := new(ParamText) 77 p.startBrace = startBrace 78 p.endBrace = endBrace 79 p.keyList = []string{} 80 p.origin = plainText 81 82 for len(plainText) > 0 { 83 pos := strings.Index(plainText, startBrace) 84 if pos < 0 { 85 p.tokenList = append(p.tokenList, plainText) 86 return p 87 } else if pos > 0 { 88 p.tokenList = append(p.tokenList, plainText[0:pos]) 89 plainText = plainText[pos:] 90 } else { 91 pos += len(startBrace) 92 org := plainText 93 plainText = plainText[pos:] 94 nextPos := strings.Index(plainText, endBrace) 95 if nextPos < 0 { 96 p.tokenList = append(p.tokenList, org) 97 return p 98 } 99 argName := strings.TrimSpace(plainText[0:nextPos]) 100 p.keyList = append(p.keyList, argName) 101 p.tokenList = append(p.tokenList, &REF{argName}) 102 plainText = plainText[nextPos+len(endBrace):] 103 } 104 } 105 106 return p 107 }