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 }