Transpiler for HTML-in-PowerShell, PSX (like JSX)

token: splat (@), for PS splatting

Changed files
+45
+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
··· 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