12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- package css
- import (
- "strings"
- "github.com/gorilla/css/scanner"
- )
- type CSSValue struct {
- Tokens []*scanner.Token
- }
- func NewCSSValue(csstext string) *CSSValue {
- sc := scanner.New(csstext)
- val := CSSValue{Tokens: make([]*scanner.Token, 0)}
- Loop:
- for {
- token := sc.Next()
- switch token.Type {
- case scanner.TokenError, scanner.TokenEOF:
- break Loop
- default:
- val.Tokens = append(val.Tokens, token)
- }
- }
- return &val
- }
- func NewCSSValueString(data string) *CSSValue {
- data = strings.ReplaceAll(data, `\`, `\\`)
- data = strings.ReplaceAll(data, `"`, `\"`)
- data = `"` + data + `"`
- token := scanner.Token{scanner.TokenString, data, 0, 0}
- return &CSSValue{Tokens: []*scanner.Token{&token}}
- }
- func (v *CSSValue) SplitOnToken(split *scanner.Token) []*CSSValue {
- res := make([]*CSSValue, 0)
- current := make([]*scanner.Token, 0)
- for _, tok := range v.Tokens {
- if tok.Type == split.Type && tok.Value == split.Value {
- res = append(res, &CSSValue{Tokens: current})
- current = make([]*scanner.Token, 0)
- } else {
- current = append(current, tok)
- }
- }
- res = append(res, &CSSValue{Tokens: current})
- return res
- }
- func (v *CSSValue) Text() string {
- var b strings.Builder
- for _, t := range v.Tokens {
- b.WriteString(t.Value)
- }
- return strings.TrimSpace(b.String())
- }
- func (v *CSSValue) ParsedText() string {
- var b strings.Builder
- for _, t := range v.Tokens {
- switch t.Type {
- case scanner.TokenString:
- val := t.Value[1 : len(t.Value)-1] // remove trailing / leading quotes
- val = strings.ReplaceAll(val, `\"`, `"`)
- val = strings.ReplaceAll(val, `\'`, `'`)
- val = strings.ReplaceAll(val, `\\`, `\`)
- // \A9 should be replaced by the corresponding rune
- b.WriteString(val)
- default:
- b.WriteString(t.Value)
- }
- }
- return strings.TrimSpace(b.String())
- }
|