annotate vendor/github.com/yosssi/gcss/declaration.go @ 81:6ce24b93c8d0 draft

I keep inserting random bugs Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Tue, 12 Dec 2023 14:27:29 +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 "fmt"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 "io"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7 "strings"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10 // declaration represents a declaration of CSS.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11 type declaration struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 elementBase
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 property string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14 value string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17 // WriteTo writes the declaration to the writer.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 func (dec *declaration) WriteTo(w io.Writer) (int64, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19 return dec.writeTo(w, nil)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22 // writeTo writes the declaration to the writer.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23 func (dec *declaration) writeTo(w io.Writer, params map[string]string) (int64, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24 bf := new(bytes.Buffer)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 bf.WriteString(dec.property)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 bf.WriteString(colon)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 for i, v := range strings.Split(dec.value, space) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30 if i > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31 bf.WriteString(space)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34 for j, w := range strings.Split(v, comma) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 if j > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36 bf.WriteString(comma)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39 if strings.HasPrefix(w, dollarMark) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 // Writing to the bytes.Buffer never returns an error.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 dec.writeParamTo(bf, strings.TrimPrefix(w, dollarMark), params)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43 bf.WriteString(w)
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 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48 bf.WriteString(semicolon)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 n, err := w.Write(bf.Bytes())
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52 return int64(n), err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55 // writeParam writes the param to the writer.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 func (dec *declaration) writeParamTo(w io.Writer, name string, params map[string]string) (int64, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57 if s, ok := params[name]; ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 if strings.HasPrefix(s, dollarMark) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59 if v, ok := dec.Context().vars[strings.TrimPrefix(s, dollarMark)]; ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 return v.WriteTo(w)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 return 0, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65 n, err := w.Write([]byte(s))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66 return int64(n), err
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 if v, ok := dec.Context().vars[name]; ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 return v.WriteTo(w)
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 return 0, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76 // declarationPV extracts a declaration property and value
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 // from the line.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78 func declarationPV(ln *line) (string, string, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79 pv := strings.SplitN(strings.TrimSpace(ln.s), space, 2)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81 if len(pv) < 2 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82 return "", "", fmt.Errorf("declaration's property and value should be divided by a space [line: %d]", ln.no)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85 if !strings.HasSuffix(pv[0], colon) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86 return "", "", fmt.Errorf("property should end with a colon [line: %d]", ln.no)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89 return strings.TrimSuffix(pv[0], colon), pv[1], nil
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 // newDeclaration creates and returns a declaration.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93 func newDeclaration(ln *line, parent element) (*declaration, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94 property, value, err := declarationPV(ln)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
98 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
99
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
100 if strings.HasSuffix(value, semicolon) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101 return nil, fmt.Errorf("declaration must not end with %q [line: %d]", semicolon, ln.no)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104 return &declaration{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105 elementBase: newElementBase(ln, parent),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106 property: property,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107 value: value,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108 }, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109 }