annotate vendor/github.com/eknkc/amber/parser/nodes.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 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 "regexp"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
5 "strings"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8 var selfClosingTags = [...]string{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9 "meta",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10 "img",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11 "link",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 "input",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 "source",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14 "area",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15 "base",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16 "col",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17 "br",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 "hr",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21 var doctypes = map[string]string{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22 "5": `<!DOCTYPE html>`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23 "default": `<!DOCTYPE html>`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24 "xml": `<?xml version="1.0" encoding="utf-8" ?>`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25 "transitional": `<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 "strict": `<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 "frameset": `<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28 "1.1": `<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 "basic": `<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30 "mobile": `<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33 type Node interface {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34 Pos() SourcePosition
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 type SourcePosition struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 LineNum int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39 ColNum int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 TokenLength int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 Filename string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44 func (s *SourcePosition) Pos() SourcePosition {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45 return *s
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 type Doctype struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49 SourcePosition
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 Value string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 func newDoctype(value string) *Doctype {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54 dt := new(Doctype)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55 dt.Value = value
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 return dt
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59 func (d *Doctype) String() string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 if defined := doctypes[d.Value]; len(defined) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61 return defined
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 return `<!DOCTYPE ` + d.Value + `>`
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 type Comment struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68 SourcePosition
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69 Value string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 Block *Block
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71 Silent bool
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 func newComment(value string) *Comment {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75 dt := new(Comment)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76 dt.Value = value
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 dt.Block = nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78 dt.Silent = false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79 return dt
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82 type Text struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83 SourcePosition
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84 Value string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85 Raw bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88 func newText(value string, raw bool) *Text {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89 dt := new(Text)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90 dt.Value = value
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
91 dt.Raw = raw
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
92 return dt
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95 type Block struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96 SourcePosition
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97 Children []Node
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 func newBlock() *Block {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101 block := new(Block)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102 block.Children = make([]Node, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103 return block
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106 func (b *Block) push(node Node) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107 b.Children = append(b.Children, node)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
110 func (b *Block) pushFront(node Node) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
111 b.Children = append([]Node{node}, b.Children...)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
112 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
113
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
114 func (b *Block) CanInline() bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
115 if len(b.Children) == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
116 return true
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 allText := true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
120
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
121 for _, child := range b.Children {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
122 if txt, ok := child.(*Text); !ok || txt.Raw {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
123 allText = false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
124 break
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
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
128 return allText
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 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
132 NamedBlockDefault = iota
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
133 NamedBlockAppend
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
134 NamedBlockPrepend
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
135 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
136
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
137 type NamedBlock struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
138 Block
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
139 Name string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
140 Modifier int
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 func newNamedBlock(name string) *NamedBlock {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
144 bb := new(NamedBlock)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
145 bb.Name = name
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
146 bb.Block.Children = make([]Node, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
147 bb.Modifier = NamedBlockDefault
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
148 return bb
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 type Attribute struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
152 SourcePosition
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
153 Name string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
154 Value string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
155 IsRaw bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
156 Condition string
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 type Tag struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
160 SourcePosition
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
161 Block *Block
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
162 Name string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
163 IsInterpolated bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
164 Attributes []Attribute
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 func newTag(name string) *Tag {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
168 tag := new(Tag)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
169 tag.Block = nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
170 tag.Name = name
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
171 tag.Attributes = make([]Attribute, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
172 tag.IsInterpolated = false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
173 return tag
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
174
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
175 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
176
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
177 func (t *Tag) IsSelfClosing() bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
178 for _, tag := range selfClosingTags {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
179 if tag == t.Name {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
180 return true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
181 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
182 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
183
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
184 return false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
185 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
186
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
187 func (t *Tag) IsRawText() bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
188 return t.Name == "style" || t.Name == "script"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
189 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
190
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
191 type Condition struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
192 SourcePosition
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
193 Positive *Block
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
194 Negative *Block
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
195 Expression string
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 func newCondition(exp string) *Condition {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
199 cond := new(Condition)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
200 cond.Expression = exp
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
201 return cond
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
202 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
203
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
204 type Each struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
205 SourcePosition
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
206 X string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
207 Y string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
208 Expression string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
209 Block *Block
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
210 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
211
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
212 func newEach(exp string) *Each {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
213 each := new(Each)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
214 each.Expression = exp
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
215 return each
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
216 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
217
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
218 type Assignment struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
219 SourcePosition
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
220 X string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
221 Expression string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
222 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
223
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
224 func newAssignment(x, expression string) *Assignment {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
225 assgn := new(Assignment)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
226 assgn.X = x
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
227 assgn.Expression = expression
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
228 return assgn
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
229 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
230
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
231 type Mixin struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
232 SourcePosition
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
233 Block *Block
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
234 Name string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
235 Args []string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
236 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
237
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
238 func newMixin(name, args string) *Mixin {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
239 mixin := new(Mixin)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
240 mixin.Name = name
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
241
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
242 delExp := regexp.MustCompile(`,\s`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
243 mixin.Args = delExp.Split(args, -1)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
244
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
245 for i := 0; i < len(mixin.Args); i++ {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
246 mixin.Args[i] = strings.TrimSpace(mixin.Args[i])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
247 if mixin.Args[i] == "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
248 mixin.Args = append(mixin.Args[:i], mixin.Args[i+1:]...)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
249 i--
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
250 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
251 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
252
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
253 return mixin
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
254 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
255
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
256 type MixinCall struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
257 SourcePosition
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
258 Name string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
259 Args []string
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 func newMixinCall(name, args string) *MixinCall {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
263 mixinCall := new(MixinCall)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
264 mixinCall.Name = name
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
265
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
266 if args != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
267 const t = "%s"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
268 quoteExp := regexp.MustCompile(`"(.*?)"`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
269 delExp := regexp.MustCompile(`,\s`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
270
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
271 quotes := quoteExp.FindAllString(args, -1)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
272 replaced := quoteExp.ReplaceAllString(args, t)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
273 mixinCall.Args = delExp.Split(replaced, -1)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
274
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
275 qi := 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
276 for i, arg := range mixinCall.Args {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
277 if arg == t {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
278 mixinCall.Args[i] = quotes[qi]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
279 qi++
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
280 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
281 }
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 return mixinCall
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
285 }