annotate vendor/github.com/yosssi/gcss/parse.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 "strings"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
4
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
5 // Special characters
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7 cr = "\r"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8 lf = "\n"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9 crlf = "\r\n"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10 space = " "
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11 colon = ":"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 comma = ","
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 openBrace = "{"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14 closeBrace = "}"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15 semicolon = ";"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16 ampersand = "&"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17 atMark = "@"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 dollarMark = "$"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19 openParenthesis = "("
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 closeParenthesis = ")"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21 slash = "/"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22 doubleSlash = slash + slash
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25 // parse parses the string, generates the elements
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 // and returns the two channels: the first one returns
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 // the generated elements and the last one returns
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28 // an error when it occurs.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 func parse(lines []string) (<-chan element, <-chan error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30 elemc := make(chan element, len(lines))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31 errc := make(chan error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33 go func() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34 i := 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 l := len(lines)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 for i < l {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 // Fetch a line.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39 ln := newLine(i+1, lines[i])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 i++
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 // Ignore the empty line.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43 if ln.isEmpty() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44 continue
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 if ln.isTopIndent() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48 elem, err := newElement(ln, nil)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51 errc <- err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52 return
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 if err := appendChildren(elem, lines, &i, l); err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 errc <- err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 elemc <- elem
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64 close(elemc)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65 }()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67 return elemc, errc
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 // appendChildren parses the lines and appends the child elements
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71 // to the parent element.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72 func appendChildren(parent element, lines []string, i *int, l int) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73 for *i < l {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74 // Fetch a line.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75 ln := newLine(*i+1, lines[*i])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 // Ignore the empty line.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78 if ln.isEmpty() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79 *i++
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 return nil
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 ok, err := ln.childOf(parent)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86 return err
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 if !ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90 return nil
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 child, err := newElement(ln, parent)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
98
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
99 parent.AppendChild(child)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
100
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101 *i++
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103 if err := appendChildren(child, lines, i, l); err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
110
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
111 // formatLF replaces the line feed codes with LF and
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
112 // returns the result string.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
113 func formatLF(s string) string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
114 return strings.Replace(strings.Replace(s, crlf, lf, -1), cr, lf, -1)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
115 }