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  }