ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/aya/vendor/github.com/yosssi/gcss/declaration.go
Revision: 1.1
Committed: Mon Sep 30 00:42:06 2024 UTC (6 weeks, 4 days ago) by yakumo_izuru
Branch: MAIN
CVS Tags: HEAD
Error occurred while calculating annotation data.
Log Message:
Mirrored from https://git.chaotic.ninja/git/yakumo_izuru/aya

File Contents

# Content
1 package gcss
2
3 import (
4 "bytes"
5 "fmt"
6 "io"
7 "strings"
8 )
9
10 // declaration represents a declaration of CSS.
11 type declaration struct {
12 elementBase
13 property string
14 value string
15 }
16
17 // WriteTo writes the declaration to the writer.
18 func (dec *declaration) WriteTo(w io.Writer) (int64, error) {
19 return dec.writeTo(w, nil)
20 }
21
22 // writeTo writes the declaration to the writer.
23 func (dec *declaration) writeTo(w io.Writer, params map[string]string) (int64, error) {
24 bf := new(bytes.Buffer)
25
26 bf.WriteString(dec.property)
27 bf.WriteString(colon)
28
29 for i, v := range strings.Split(dec.value, space) {
30 if i > 0 {
31 bf.WriteString(space)
32 }
33
34 for j, w := range strings.Split(v, comma) {
35 if j > 0 {
36 bf.WriteString(comma)
37 }
38
39 if strings.HasPrefix(w, dollarMark) {
40 // Writing to the bytes.Buffer never returns an error.
41 dec.writeParamTo(bf, strings.TrimPrefix(w, dollarMark), params)
42 } else {
43 bf.WriteString(w)
44 }
45 }
46 }
47
48 bf.WriteString(semicolon)
49
50 n, err := w.Write(bf.Bytes())
51
52 return int64(n), err
53 }
54
55 // writeParam writes the param to the writer.
56 func (dec *declaration) writeParamTo(w io.Writer, name string, params map[string]string) (int64, error) {
57 if s, ok := params[name]; ok {
58 if strings.HasPrefix(s, dollarMark) {
59 if v, ok := dec.Context().vars[strings.TrimPrefix(s, dollarMark)]; ok {
60 return v.WriteTo(w)
61 }
62 return 0, nil
63 }
64
65 n, err := w.Write([]byte(s))
66 return int64(n), err
67 }
68
69 if v, ok := dec.Context().vars[name]; ok {
70 return v.WriteTo(w)
71 }
72
73 return 0, nil
74 }
75
76 // declarationPV extracts a declaration property and value
77 // from the line.
78 func declarationPV(ln *line) (string, string, error) {
79 pv := strings.SplitN(strings.TrimSpace(ln.s), space, 2)
80
81 if len(pv) < 2 {
82 return "", "", fmt.Errorf("declaration's property and value should be divided by a space [line: %d]", ln.no)
83 }
84
85 if !strings.HasSuffix(pv[0], colon) {
86 return "", "", fmt.Errorf("property should end with a colon [line: %d]", ln.no)
87 }
88
89 return strings.TrimSuffix(pv[0], colon), pv[1], nil
90 }
91
92 // newDeclaration creates and returns a declaration.
93 func newDeclaration(ln *line, parent element) (*declaration, error) {
94 property, value, err := declarationPV(ln)
95
96 if err != nil {
97 return nil, err
98 }
99
100 if strings.HasSuffix(value, semicolon) {
101 return nil, fmt.Errorf("declaration must not end with %q [line: %d]", semicolon, ln.no)
102 }
103
104 return &declaration{
105 elementBase: newElementBase(ln, parent),
106 property: property,
107 value: value,
108 }, nil
109 }