annotate vendor/github.com/yosssi/gcss/element_base.go @ 68:4b79810863f6 draft

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