72 lines
2.0 KiB
Go
72 lines
2.0 KiB
Go
|
package css
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"io"
|
||
|
|
||
|
"github.com/davecgh/go-spew/spew"
|
||
|
"github.com/gorilla/css/scanner"
|
||
|
)
|
||
|
|
||
|
func ParseCSS(cssString string, log io.Writer) (result []*CSSToken, token *scanner.Token, err error) {
|
||
|
cssScanner := &CSSParser{scanner.New(cssString)}
|
||
|
result = make([]*CSSToken, 0)
|
||
|
io.WriteString(log, "/*******************\n")
|
||
|
io.WriteString(log, "PARSER LOG:\n")
|
||
|
token = cssScanner.tolerantRead(result)
|
||
|
generalLoop:
|
||
|
for token.Type != scanner.TokenEOF && token.Type != scanner.TokenError {
|
||
|
token = cssScanner.Next()
|
||
|
|
||
|
// process token
|
||
|
switch {
|
||
|
case token.Type == scanner.TokenIdent,
|
||
|
token.Type == scanner.TokenChar,
|
||
|
token.Type == scanner.TokenHash:
|
||
|
var intermediate []*CSSToken
|
||
|
|
||
|
rule := &CSSToken{Type: TokenType_Rule, SubTokens: []*CSSToken{}}
|
||
|
|
||
|
// selectors
|
||
|
intermediate, token, err = cssScanner.readSelectors(token)
|
||
|
if err != nil {
|
||
|
break generalLoop
|
||
|
}
|
||
|
rule.SubTokens = append(rule.SubTokens, intermediate...)
|
||
|
io.WriteString(log, spew.Sdump(intermediate)+"\n")
|
||
|
|
||
|
// "{"
|
||
|
if token.Type != scanner.TokenChar || token.Value != "{" {
|
||
|
err = fmt.Errorf("expected closure begin for rule but got %s", token.String())
|
||
|
break generalLoop
|
||
|
}
|
||
|
rule.SubTokens = append(rule.SubTokens, &CSSToken{Type: TokenType_Native, NativeToken: token})
|
||
|
|
||
|
// closure content
|
||
|
intermediate, token, err = cssScanner.readRuleClosure()
|
||
|
if err != nil {
|
||
|
break generalLoop
|
||
|
}
|
||
|
rule.SubTokens = append(rule.SubTokens, intermediate...)
|
||
|
|
||
|
// "}"
|
||
|
if token.Type != scanner.TokenChar || token.Value != "}" {
|
||
|
err = fmt.Errorf("expected closure end for rule but got %s", token.String())
|
||
|
break generalLoop
|
||
|
}
|
||
|
rule.SubTokens = append(rule.SubTokens, &CSSToken{Type: TokenType_Native, NativeToken: token})
|
||
|
|
||
|
result = append(result, rule)
|
||
|
|
||
|
default:
|
||
|
result = append(result, &CSSToken{Type: TokenType_Native, NativeToken: token})
|
||
|
}
|
||
|
|
||
|
io.WriteString(log, token.String()+"\n")
|
||
|
}
|
||
|
io.WriteString(log, token.String()+"\n")
|
||
|
io.WriteString(log, "*******************/\n\n")
|
||
|
|
||
|
return
|
||
|
}
|