66
|
1 package gcss
|
|
2
|
|
3 import (
|
|
4 "bytes"
|
|
5 "io"
|
|
6 )
|
|
7
|
|
8 // elementBase holds the common fields of an element.
|
|
9 type elementBase struct {
|
|
10 ln *line
|
|
11 parent element
|
|
12 sels []*selector
|
|
13 decs []*declaration
|
|
14 mixins []*mixinInvocation
|
|
15 ctx *context
|
|
16 }
|
|
17
|
|
18 // AppendChild appends a child element to the element.
|
|
19 func (eBase *elementBase) AppendChild(child element) {
|
|
20 switch c := child.(type) {
|
|
21 case *mixinInvocation:
|
|
22 eBase.mixins = append(eBase.mixins, c)
|
|
23 case *declaration:
|
|
24 eBase.decs = append(eBase.decs, c)
|
|
25 case *selector:
|
|
26 eBase.sels = append(eBase.sels, c)
|
|
27 }
|
|
28 }
|
|
29
|
|
30 // Base returns the element base.
|
|
31 func (eBase *elementBase) Base() *elementBase {
|
|
32 return eBase
|
|
33 }
|
|
34
|
|
35 // SetContext sets the context to the element.
|
|
36 func (eBase *elementBase) SetContext(ctx *context) {
|
|
37 eBase.ctx = ctx
|
|
38 }
|
|
39
|
|
40 // Context returns the top element's context.
|
|
41 func (eBase *elementBase) Context() *context {
|
|
42 if eBase.parent != nil {
|
|
43 return eBase.parent.Context()
|
|
44 }
|
|
45
|
|
46 return eBase.ctx
|
|
47 }
|
|
48
|
|
49 // hasMixinDecs returns true if the element has a mixin
|
|
50 // which has declarations.
|
|
51 func (eBase *elementBase) hasMixinDecs() bool {
|
|
52 for _, mi := range eBase.mixins {
|
|
53 if decs, _ := mi.decsParams(); len(decs) > 0 {
|
|
54 return true
|
|
55 }
|
|
56 }
|
|
57
|
|
58 return false
|
|
59 }
|
|
60
|
|
61 // hasMixinSels returns true if the element has a mixin
|
|
62 // which has selectors.
|
|
63 func (eBase *elementBase) hasMixinSels() bool {
|
|
64 for _, mi := range eBase.mixins {
|
|
65 if sels, _ := mi.selsParams(); len(sels) > 0 {
|
|
66 return true
|
|
67 }
|
|
68 }
|
|
69
|
|
70 return false
|
|
71 }
|
|
72
|
|
73 // writeDecsTo writes the element's declarations to w.
|
|
74 func (eBase *elementBase) writeDecsTo(w io.Writer, params map[string]string) (int64, error) {
|
|
75 bf := new(bytes.Buffer)
|
|
76
|
|
77 // Write the declarations.
|
|
78 for _, dec := range eBase.decs {
|
|
79 // Writing to the bytes.Buffer never returns an error.
|
|
80 dec.writeTo(bf, params)
|
|
81 }
|
|
82
|
|
83 // Write the mixin's declarations.
|
|
84 for _, mi := range eBase.mixins {
|
|
85 decs, prms := mi.decsParams()
|
|
86
|
|
87 for _, dec := range decs {
|
|
88 // Writing to the bytes.Buffer never returns an error.
|
|
89 dec.writeTo(bf, prms)
|
|
90 }
|
|
91 }
|
|
92
|
|
93 n, err := w.Write(bf.Bytes())
|
|
94
|
|
95 return int64(n), err
|
|
96 }
|
|
97
|
|
98 // newElementBase creates and returns an element base.
|
|
99 func newElementBase(ln *line, parent element) elementBase {
|
|
100 return elementBase{
|
|
101 ln: ln,
|
|
102 parent: parent,
|
|
103 }
|
|
104 }
|