remote-darkness/internal/css/parse.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
}