annotate vendor/github.com/eknkc/amber/parser/scanner.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 parser
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 "bufio"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
5 "container/list"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 "fmt"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7 "io"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8 "regexp"
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 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 tokEOF = -(iota + 1)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 tokDoctype
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14 tokComment
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15 tokIndent
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16 tokOutdent
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17 tokBlank
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 tokId
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19 tokClassName
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 tokTag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21 tokText
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22 tokAttribute
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23 tokIf
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24 tokElse
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25 tokEach
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 tokAssignment
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 tokImport
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28 tokNamedBlock
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 tokExtends
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30 tokMixin
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31 tokMixinCall
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 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 scnNewLine = iota
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36 scnLine
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 scnEOF
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 type scanner struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 reader *bufio.Reader
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 indentStack *list.List
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43 stash *list.List
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45 state int32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
46 buffer string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48 line int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49 col int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 lastTokenLine int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51 lastTokenCol int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52 lastTokenSize int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54 readRaw bool
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 type token struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 Kind rune
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59 Value string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 Data map[string]string
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 func newScanner(r io.Reader) *scanner {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64 s := new(scanner)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65 s.reader = bufio.NewReader(r)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66 s.indentStack = list.New()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67 s.stash = list.New()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68 s.state = scnNewLine
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69 s.line = -1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 s.col = 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72 return s
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75 func (s *scanner) Pos() SourcePosition {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76 return SourcePosition{s.lastTokenLine + 1, s.lastTokenCol + 1, s.lastTokenSize, ""}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79 // Returns next token found in buffer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 func (s *scanner) Next() *token {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81 if s.readRaw {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82 s.readRaw = false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83 return s.NextRaw()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86 s.ensureBuffer()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88 if stashed := s.stash.Front(); stashed != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89 tok := stashed.Value.(*token)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90 s.stash.Remove(stashed)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
91 return tok
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
92 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94 switch s.state {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95 case scnEOF:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96 if outdent := s.indentStack.Back(); outdent != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97 s.indentStack.Remove(outdent)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
98 return &token{tokOutdent, "", nil}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
99 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
100
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101 return &token{tokEOF, "", nil}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102 case scnNewLine:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103 s.state = scnLine
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105 if tok := s.scanIndent(); tok != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106 return tok
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109 return s.Next()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
110 case scnLine:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
111 if tok := s.scanMixin(); tok != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
112 return tok
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
113 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
114
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
115 if tok := s.scanMixinCall(); tok != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
116 return tok
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 if tok := s.scanDoctype(); tok != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
120 return tok
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
121 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
122
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
123 if tok := s.scanCondition(); tok != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
124 return tok
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 if tok := s.scanEach(); tok != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
128 return tok
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
129 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
130
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
131 if tok := s.scanImport(); tok != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
132 return tok
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
133 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
134
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
135 if tok := s.scanExtends(); tok != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
136 return tok
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
137 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
138
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
139 if tok := s.scanBlock(); tok != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
140 return tok
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
141 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
142
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
143 if tok := s.scanAssignment(); tok != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
144 return tok
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
145 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
146
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
147 if tok := s.scanTag(); tok != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
148 return tok
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
149 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
150
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
151 if tok := s.scanId(); tok != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
152 return tok
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
153 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
154
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
155 if tok := s.scanClassName(); tok != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
156 return tok
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
157 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
158
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
159 if tok := s.scanAttribute(); tok != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
160 return tok
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
161 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
162
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
163 if tok := s.scanComment(); tok != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
164 return tok
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
165 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
166
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
167 if tok := s.scanText(); tok != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
168 return tok
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
169 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
170 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
171
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
172 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
173 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
174
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
175 func (s *scanner) NextRaw() *token {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
176 result := ""
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
177 level := 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
178
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
179 for {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
180 s.ensureBuffer()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
181
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
182 switch s.state {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
183 case scnEOF:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
184 return &token{tokText, result, map[string]string{"Mode": "raw"}}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
185 case scnNewLine:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
186 s.state = scnLine
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
187
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
188 if tok := s.scanIndent(); tok != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
189 if tok.Kind == tokIndent {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
190 level++
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
191 } else if tok.Kind == tokOutdent {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
192 level--
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
193 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
194 result = result + "\n"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
195 continue
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
196 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
197
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
198 if level < 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
199 s.stash.PushBack(&token{tokOutdent, "", nil})
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
200
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
201 if len(result) > 0 && result[len(result)-1] == '\n' {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
202 result = result[:len(result)-1]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
203 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
204
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
205 return &token{tokText, result, map[string]string{"Mode": "raw"}}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
206 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
207 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
208 case scnLine:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
209 if len(result) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
210 result = result + "\n"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
211 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
212 for i := 0; i < level; i++ {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
213 result += "\t"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
214 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
215 result = result + s.buffer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
216 s.consume(len(s.buffer))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
217 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
218 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
219
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
220 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
221 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
222
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
223 var rgxIndent = regexp.MustCompile(`^(\s+)`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
224
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
225 func (s *scanner) scanIndent() *token {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
226 if len(s.buffer) == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
227 return &token{tokBlank, "", nil}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
228 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
229
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
230 var head *list.Element
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
231 for head = s.indentStack.Front(); head != nil; head = head.Next() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
232 value := head.Value.(*regexp.Regexp)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
233
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
234 if match := value.FindString(s.buffer); len(match) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
235 s.consume(len(match))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
236 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
237 break
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
238 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
239 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
240
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
241 newIndent := rgxIndent.FindString(s.buffer)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
242
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
243 if len(newIndent) != 0 && head == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
244 s.indentStack.PushBack(regexp.MustCompile(regexp.QuoteMeta(newIndent)))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
245 s.consume(len(newIndent))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
246 return &token{tokIndent, newIndent, nil}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
247 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
248
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
249 if len(newIndent) == 0 && head != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
250 for head != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
251 next := head.Next()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
252 s.indentStack.Remove(head)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
253 if next == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
254 return &token{tokOutdent, "", nil}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
255 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
256 s.stash.PushBack(&token{tokOutdent, "", nil})
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
257 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
258 head = next
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
259 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
260 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
261
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
262 if len(newIndent) != 0 && head != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
263 panic("Mismatching indentation. Please use a coherent indent schema.")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
264 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
265
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
266 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
267 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
268
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
269 var rgxDoctype = regexp.MustCompile(`^(!!!|doctype)\s*(.*)`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
270
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
271 func (s *scanner) scanDoctype() *token {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
272 if sm := rgxDoctype.FindStringSubmatch(s.buffer); len(sm) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
273 if len(sm[2]) == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
274 sm[2] = "html"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
275 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
276
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
277 s.consume(len(sm[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
278 return &token{tokDoctype, sm[2], nil}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
279 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
280
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
281 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
282 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
283
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
284 var rgxIf = regexp.MustCompile(`^if\s+(.+)$`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
285 var rgxElse = regexp.MustCompile(`^else\s*`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
286
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
287 func (s *scanner) scanCondition() *token {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
288 if sm := rgxIf.FindStringSubmatch(s.buffer); len(sm) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
289 s.consume(len(sm[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
290 return &token{tokIf, sm[1], nil}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
291 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
292
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
293 if sm := rgxElse.FindStringSubmatch(s.buffer); len(sm) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
294 s.consume(len(sm[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
295 return &token{tokElse, "", nil}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
296 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
297
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
298 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
299 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
300
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
301 var rgxEach = regexp.MustCompile(`^each\s+(\$[\w0-9\-_]*)(?:\s*,\s*(\$[\w0-9\-_]*))?\s+in\s+(.+)$`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
302
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
303 func (s *scanner) scanEach() *token {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
304 if sm := rgxEach.FindStringSubmatch(s.buffer); len(sm) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
305 s.consume(len(sm[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
306 return &token{tokEach, sm[3], map[string]string{"X": sm[1], "Y": sm[2]}}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
307 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
308
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
309 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
310 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
311
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
312 var rgxAssignment = regexp.MustCompile(`^(\$[\w0-9\-_]*)?\s*=\s*(.+)$`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
313
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
314 func (s *scanner) scanAssignment() *token {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
315 if sm := rgxAssignment.FindStringSubmatch(s.buffer); len(sm) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
316 s.consume(len(sm[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
317 return &token{tokAssignment, sm[2], map[string]string{"X": sm[1]}}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
318 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
319
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
320 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
321 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
322
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
323 var rgxComment = regexp.MustCompile(`^\/\/(-)?\s*(.*)$`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
324
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
325 func (s *scanner) scanComment() *token {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
326 if sm := rgxComment.FindStringSubmatch(s.buffer); len(sm) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
327 mode := "embed"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
328 if len(sm[1]) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
329 mode = "silent"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
330 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
331
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
332 s.consume(len(sm[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
333 return &token{tokComment, sm[2], map[string]string{"Mode": mode}}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
334 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
335
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
336 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
337 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
338
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
339 var rgxId = regexp.MustCompile(`^#([\w-]+)(?:\s*\?\s*(.*)$)?`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
340
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
341 func (s *scanner) scanId() *token {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
342 if sm := rgxId.FindStringSubmatch(s.buffer); len(sm) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
343 s.consume(len(sm[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
344 return &token{tokId, sm[1], map[string]string{"Condition": sm[2]}}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
345 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
346
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
347 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
348 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
349
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
350 var rgxClassName = regexp.MustCompile(`^\.([\w-]+)(?:\s*\?\s*(.*)$)?`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
351
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
352 func (s *scanner) scanClassName() *token {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
353 if sm := rgxClassName.FindStringSubmatch(s.buffer); len(sm) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
354 s.consume(len(sm[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
355 return &token{tokClassName, sm[1], map[string]string{"Condition": sm[2]}}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
356 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
357
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
358 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
359 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
360
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
361 var rgxAttribute = regexp.MustCompile(`^\[([\w\-:@\.]+)\s*(?:=\s*(\"([^\"\\]*)\"|([^\]]+)))?\](?:\s*\?\s*(.*)$)?`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
362
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
363 func (s *scanner) scanAttribute() *token {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
364 if sm := rgxAttribute.FindStringSubmatch(s.buffer); len(sm) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
365 s.consume(len(sm[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
366
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
367 if len(sm[3]) != 0 || sm[2] == "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
368 return &token{tokAttribute, sm[1], map[string]string{"Content": sm[3], "Mode": "raw", "Condition": sm[5]}}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
369 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
370
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
371 return &token{tokAttribute, sm[1], map[string]string{"Content": sm[4], "Mode": "expression", "Condition": sm[5]}}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
372 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
373
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
374 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
375 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
376
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
377 var rgxImport = regexp.MustCompile(`^import\s+([0-9a-zA-Z_\-\. \/]*)$`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
378
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
379 func (s *scanner) scanImport() *token {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
380 if sm := rgxImport.FindStringSubmatch(s.buffer); len(sm) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
381 s.consume(len(sm[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
382 return &token{tokImport, sm[1], nil}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
383 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
384
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
385 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
386 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
387
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
388 var rgxExtends = regexp.MustCompile(`^extends\s+([0-9a-zA-Z_\-\. \/]*)$`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
389
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
390 func (s *scanner) scanExtends() *token {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
391 if sm := rgxExtends.FindStringSubmatch(s.buffer); len(sm) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
392 s.consume(len(sm[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
393 return &token{tokExtends, sm[1], nil}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
394 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
395
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
396 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
397 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
398
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
399 var rgxBlock = regexp.MustCompile(`^block\s+(?:(append|prepend)\s+)?([0-9a-zA-Z_\-\. \/]*)$`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
400
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
401 func (s *scanner) scanBlock() *token {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
402 if sm := rgxBlock.FindStringSubmatch(s.buffer); len(sm) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
403 s.consume(len(sm[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
404 return &token{tokNamedBlock, sm[2], map[string]string{"Modifier": sm[1]}}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
405 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
406
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
407 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
408 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
409
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
410 var rgxTag = regexp.MustCompile(`^(\w[-:\w]*)`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
411
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
412 func (s *scanner) scanTag() *token {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
413 if sm := rgxTag.FindStringSubmatch(s.buffer); len(sm) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
414 s.consume(len(sm[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
415 return &token{tokTag, sm[1], nil}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
416 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
417
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
418 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
419 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
420
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
421 var rgxMixin = regexp.MustCompile(`^mixin ([a-zA-Z_-]+\w*)(\(((\$\w*(,\s)?)*)\))?$`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
422
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
423 func (s *scanner) scanMixin() *token {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
424 if sm := rgxMixin.FindStringSubmatch(s.buffer); len(sm) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
425 s.consume(len(sm[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
426 return &token{tokMixin, sm[1], map[string]string{"Args": sm[3]}}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
427 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
428
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
429 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
430 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
431
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
432 var rgxMixinCall = regexp.MustCompile(`^\+([A-Za-z_-]+\w*)(\((.+(,\s)?)*\))?$`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
433
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
434 func (s *scanner) scanMixinCall() *token {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
435 if sm := rgxMixinCall.FindStringSubmatch(s.buffer); len(sm) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
436 s.consume(len(sm[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
437 return &token{tokMixinCall, sm[1], map[string]string{"Args": sm[3]}}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
438 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
439
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
440 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
441 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
442
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
443 var rgxText = regexp.MustCompile(`^(\|)? ?(.*)$`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
444
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
445 func (s *scanner) scanText() *token {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
446 if sm := rgxText.FindStringSubmatch(s.buffer); len(sm) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
447 s.consume(len(sm[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
448
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
449 mode := "inline"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
450 if sm[1] == "|" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
451 mode = "piped"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
452 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
453
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
454 return &token{tokText, sm[2], map[string]string{"Mode": mode}}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
455 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
456
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
457 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
458 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
459
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
460 // Moves position forward, and removes beginning of s.buffer (len bytes)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
461 func (s *scanner) consume(runes int) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
462 if len(s.buffer) < runes {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
463 panic(fmt.Sprintf("Unable to consume %d runes from buffer.", runes))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
464 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
465
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
466 s.lastTokenLine = s.line
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
467 s.lastTokenCol = s.col
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
468 s.lastTokenSize = runes
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
469
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
470 s.buffer = s.buffer[runes:]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
471 s.col += runes
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
472 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
473
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
474 // Reads string into s.buffer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
475 func (s *scanner) ensureBuffer() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
476 if len(s.buffer) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
477 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
478 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
479
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
480 buf, err := s.reader.ReadString('\n')
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
481
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
482 if err != nil && err != io.EOF {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
483 panic(err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
484 } else if err != nil && len(buf) == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
485 s.state = scnEOF
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
486 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
487 // endline "LF only" or "\n" use Unix, Linux, modern MacOS X, FreeBSD, BeOS, RISC OS
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
488 if buf[len(buf)-1] == '\n' {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
489 buf = buf[:len(buf)-1]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
490 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
491 // endline "CR+LF" or "\r\n" use internet protocols, DEC RT-11, Windows, CP/M, MS-DOS, OS/2, Symbian OS
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
492 if len(buf) > 0 && buf[len(buf)-1] == '\r' {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
493 buf = buf[:len(buf)-1]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
494 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
495
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
496 s.state = scnNewLine
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
497 s.buffer = buf
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
498 s.line += 1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
499 s.col = 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
500 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
501 }