css - ast_sheet.go
1 package css
2
3 import "vimagination.zapto.org/parser"
4
5 func ParseSheet(t parser.Tokeniser) (*Sheet, error) {
6 c, err := newCSSParser(CreateTokeniser(t, true))
7 if err != nil {
8 return nil, err
9 }
10
11 s := new(Sheet)
12 if err := s.parse(&c); err != nil {
13 return nil, err
14 }
15
16 return s, nil
17 }
18
19 type Sheet struct {
20 Rules []Rule
21 Tokens Tokens
22 }
23
24 func (s *Sheet) parse(c *cssParser) error {
25 for c.AcceptRunWhitespace() != parser.TokenDone {
26 d := c.NewGoal()
27 var r Rule
28
29 if err := r.parse(&d); err != nil {
30 return c.Error("Sheet", err)
31 }
32
33 s.Rules = append(s.Rules, r)
34
35 c.Score(d)
36 }
37
38 s.Tokens = c.ToTokens()
39
40 return nil
41 }
42
43 type Rule struct {
44 CommentDelimiter *Token
45 AtRule *AtRule
46 QualifiedRule *QualifiedRule
47 Tokens Tokens
48 }
49
50 func (r *Rule) parse(c *cssParser) error {
51 if c.Accept(TokenCDO, TokenCDC) {
52 r.CommentDelimiter = c.GetLastToken()
53 } else if tk := c.Peek(); tk.Type == TokenAtKeyword {
54 d := c.NewGoal()
55 r.AtRule = new(AtRule)
56
57 if err := r.AtRule.parse(&d); err != nil {
58 return c.Error("Rule", err)
59 }
60
61 c.Score(d)
62 } else {
63 d := c.NewGoal()
64 r.QualifiedRule = new(QualifiedRule)
65
66 if err := r.QualifiedRule.parse(&d); err != nil {
67 return c.Error("Rule", err)
68 }
69
70 c.Score(d)
71 }
72
73 r.Tokens = c.ToTokens()
74
75 return nil
76 }
77
78 type AtRule struct{}
79
80 func (a *AtRule) parse(c *cssParser) error {
81 return nil
82 }
83
84 type QualifiedRule struct{}
85
86 func (q *QualifiedRule) parse(c *cssParser) error {
87 return nil
88 }
89