+15
Compiler.ps1
+15
Compiler.ps1
···
102
102
ATTR_NAME # [a-zA-Z0-9_-\.]+
103
103
ATTR_VALUE # plain identifier
104
104
ATTR_VALUE_SCRIPTBLOCK # { ... }
105
+
ATTR_SPLAT # @VariableName
105
106
106
107
EOF
107
108
···
322
323
323
324
$this.State = [ElementState]::AFTER_ATTRIBUTE_VALUE
324
325
return [Token]::new( [TokenType]::ATTR_VALUE_SCRIPTBLOCK , $this.PopQuotedAttrValue() )
326
+
}
327
+
328
+
'@' {
329
+
$this.PopChar() # drop @
330
+
331
+
if ($this.State -notin
332
+
[ElementState]::AFTER_TAG,
333
+
[ElementState]::AFTER_ATTRIBUTE_NAME,
334
+
[ElementState]::AFTER_ATTRIBUTE_VALUE
335
+
) {
336
+
$this.Die('@')
337
+
}
338
+
339
+
return [Token]::new( [TokenType]::ATTR_SPLAT, $this.PopIdentifier() )
325
340
}
326
341
327
342
'[a-zA-Z0-9_-]' {
+30
Tests.ps1
+30
Tests.ps1
···
150
150
$VOID_ELEMENT_CLOSE,
151
151
$EOF
152
152
)
153
+
},
154
+
@{
155
+
Name = "Splat"
156
+
Input = '<div attr1="one two" @Splat_Me three></div>'
157
+
Expect = @(
158
+
$OPEN_ELEMENT_START
159
+
(_tag_token div)
160
+
[Token]::new(
161
+
[TokenType]::ATTR_NAME,
162
+
'attr1'
163
+
),
164
+
$EQUALS
165
+
[Token]::new(
166
+
[TokenType]::ATTR_VALUE,
167
+
'one two'
168
+
),
169
+
[Token]::new(
170
+
[TokenType]::ATTR_SPLAT,
171
+
'Splat_Me'
172
+
),
173
+
[Token]::new(
174
+
[TokenType]::ATTR_NAME,
175
+
'three'
176
+
),
177
+
$CLOSE_ELEMENT,
178
+
$OPEN_ELEMENT_END,
179
+
(_tag_token div),
180
+
$CLOSE_ELEMENT,
181
+
$EOF
182
+
)
153
183
}
154
184
)
155
185