annotate vendor/github.com/yosssi/gcss/compile.go @ 66:787b5ee0289d draft

Use vendored modules Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Sun, 23 Jul 2023 13:18:53 +0000
parents
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 "io/ioutil"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7 "path/filepath"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8 "strings"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11 // extensions
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 extCSS = ".css"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14 extGCSS = ".gcss"
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 // cssFilePath converts path's extenstion into a CSS file extension.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 var cssFilePath = func(path string) string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19 return convertExt(path, extCSS)
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 // Compile compiles GCSS data which is read from src and
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23 // Writes the result CSS data to the dst.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24 func Compile(dst io.Writer, src io.Reader) (int, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25 data, err := ioutil.ReadAll(src)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28 return 0, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31 bc, berrc := compileBytes(data)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33 bf := new(bytes.Buffer)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 BufWriteLoop:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36 for {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 select {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 case b, ok := <-bc:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39 if !ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 break BufWriteLoop
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43 bf.Write(b)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44 case err := <-berrc:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45 return 0, err
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
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49 return dst.Write(bf.Bytes())
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52 // CompileFile parses the GCSS file specified by the path parameter,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 // generates a CSS file and returns the path of the generated CSS file
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54 // and an error when it occurs.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55 func CompileFile(path string) (string, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 data, err := ioutil.ReadFile(path)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59 return "", err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 cssPath := cssFilePath(path)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64 bc, berrc := compileBytes(data)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66 done, werrc := write(cssPath, bc, berrc)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68 select {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69 case <-done:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 case err := <-werrc:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71 return "", err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74 return cssPath, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 // compileBytes parses the GCSS byte array passed as the s parameter,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78 // generates a CSS byte array and returns the two channels: the first
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79 // one returns the CSS byte array and the last one returns an error
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 // when it occurs.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81 func compileBytes(b []byte) (<-chan []byte, <-chan error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82 lines := strings.Split(formatLF(string(b)), lf)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84 bc := make(chan []byte, len(lines))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85 errc := make(chan error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87 go func() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88 ctx := newContext()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90 elemc, pErrc := parse(lines)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
91
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
92 for {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93 select {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94 case elem, ok := <-elemc:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95 if !ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96 close(bc)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97 return
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 elem.SetContext(ctx)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102 switch v := elem.(type) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103 case *mixinDeclaration:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104 ctx.mixins[v.name] = v
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105 case *variable:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106 ctx.vars[v.name] = v
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107 case *atRule, *declaration, *selector:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108 bf := new(bytes.Buffer)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109 elem.WriteTo(bf)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
110 bc <- bf.Bytes()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
111 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
112 case err := <-pErrc:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
113 errc <- err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
114 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
115 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
116 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
117 }()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
118
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
119 return bc, errc
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
120 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
121
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
122 // Path converts path's extenstion into a GCSS file extension.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
123 func Path(path string) string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
124 return convertExt(path, extGCSS)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
125 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
126
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
127 // convertExt converts path's extension into ext.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
128 func convertExt(path string, ext string) string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
129 return strings.TrimSuffix(path, filepath.Ext(path)) + ext
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
130 }