| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #import('dart:html'); | 5 #import('dart:html'); |
| 6 #import('template.dart'); | 6 #import('template.dart'); |
| 7 #import('../lib/file_system_memory.dart'); | 7 #import('../lib/file_system_memory.dart'); |
| 8 | 8 |
| 9 String currSampleTemplate; | 9 String currSampleTemplate; |
| 10 | 10 |
| 11 void changeTemplate() { | 11 void changeTemplate() { |
| 12 final Document doc = window.document; | 12 final Document doc = window.document; |
| 13 final SelectElement samples = doc.query('#templateSamples'); | 13 final SelectElement samples = doc.query('#templateSamples'); |
| 14 final TextAreaElement template = doc.query('#template'); | 14 final TextAreaElement template = doc.query('#template'); |
| 15 template.value = sample(samples.value); | 15 template.value = sample(samples.value); |
| 16 } | 16 } |
| 17 | 17 |
| 18 String sample(String sampleName) { | 18 String sample(String sampleName) { |
| 19 final String each = '\${#each'; | 19 final String each = '\${#each'; |
| 20 final String endEach = '\${/each}'; | 20 final String endEach = '\${/each}'; |
| 21 final String with = '\${#with'; | 21 final String with = '\${#with'; |
| 22 final String endWith = '\${/with}'; | 22 final String endWith = '\${/with}'; |
| 23 | 23 |
| 24 final String simpleTemplate = ''' | 24 final String simpleTemplate = @''' |
| 25 template NameEntry(String name, int age) { | 25 template NameEntry(String name, int age) { |
| 26 <div var=topDiv attr="test" attr1=test1 attr2='test2' attr3=test3> | 26 <div var=topDiv attr="test" attr1=test1 attr2='test2' attr3=test3> |
| 27 <span var=spanElem>\${name}</span> | 27 <span var=spanElem>${name}</span> |
| 28 <span>-</span> | 28 <span>-</span> |
| 29 <span>\${age}</span> | 29 <span>${age}</span> |
| 30 </div> | 30 </div> |
| 31 } | 31 } |
| 32 '''; | 32 '''; |
| 33 | 33 |
| 34 final String simpleTemplate2 = ''' | 34 final String simpleTemplate2 = @''' |
| 35 template NameEntry(String name, int age) { | 35 template NameEntry(String name, int age) { |
| 36 <div var=topDiv attr="test" attr1=test1 attr2='test2' attr3=test3> | 36 <div var=topDiv attr="test" attr1=test1 attr2='test2' attr3=test3> |
| 37 <h1> | 37 <h1> |
| 38 <h2> | 38 <h2> |
| 39 <h3> | 39 <h3> |
| 40 <span var=spanElem>\${name}</span> | 40 <span var=spanElem>${name}</span> |
| 41 <span>-</span> | 41 <span>-</span> |
| 42 <span>\${age}</span> | 42 <span>${age}</span> |
| 43 </h3> | 43 </h3> |
| 44 </h2> | 44 </h2> |
| 45 </h1> | 45 </h1> |
| 46 </div> | 46 </div> |
| 47 } | 47 } |
| 48 '''; | 48 '''; |
| 49 | 49 |
| 50 final String simpleTemplateCSS = ''' | 50 final String simpleTemplateCSS = @''' |
| 51 template NameEntry(String name, int age) { | 51 template NameEntry(String name, int age) { |
| 52 css { | 52 css { |
| 53 .foo { | 53 .foo { |
| 54 left: 10px; | 54 left: 10px; |
| 55 } | 55 } |
| 56 } | 56 } |
| 57 <div var=topDiv attr="test" attr1=test1 attr2='test2' attr3=test3> | 57 <div var=topDiv attr="test" attr1=test1 attr2='test2' attr3=test3> |
| 58 <span var=spanElem>\${name}</span> | 58 <span var=spanElem>${name}</span> |
| 59 <span>-</span> | 59 <span>-</span> |
| 60 <span>\${age}</span> | 60 <span>${age}</span> |
| 61 </div> | 61 </div> |
| 62 } | 62 } |
| 63 '''; | 63 '''; |
| 64 | 64 |
| 65 | 65 |
| 66 final String eachTemplate = ''' | 66 final String eachTemplate = @''' |
| 67 template Applications(var products) { | 67 template Applications(var products) { |
| 68 <div> | 68 <div> |
| 69 ${each} products} | 69 ${each} products |
| 70 <div> | 70 <div> |
| 71 <span>\${name}</span> | 71 <span>${name}</span> |
| 72 <span>-</span> | 72 <span>-</span> |
| 73 <span>\${users}</span> | 73 <span>${users}</span> |
| 74 </div> | 74 </div> |
| 75 ${endEach} | 75 ${endEach} |
| 76 </div> | 76 </div> |
| 77 } | 77 } |
| 78 '''; | 78 '''; |
| 79 | 79 |
| 80 final String withTemplate = ''' | 80 final String withTemplate = @''' |
| 81 template Product(Person person) { | 81 template Product(Person person) { |
| 82 <div> | 82 <div> |
| 83 ${with} person} | 83 ${with} person |
| 84 <div> | 84 <div> |
| 85 <span>\${name}</span> | 85 <span>${name}</span> |
| 86 <span>-</span> | 86 <span>-</span> |
| 87 <span>\${age}</span> | 87 <span>${age}</span> |
| 88 </div> | 88 </div> |
| 89 ${endWith} | 89 ${endWith} |
| 90 </div> | 90 </div> |
| 91 } | 91 } |
| 92 '''; | 92 '''; |
| 93 | 93 |
| 94 final String withTemplate2 = ''' | 94 final String withTemplate2 = @''' |
| 95 template Product(Person person) { | 95 template Product(Person person) { |
| 96 <div> | 96 <div> |
| 97 <span var=a1> | 97 <span var=a1> |
| 98 <h1> | 98 <h1> |
| 99 ${with} person} | 99 ${with} person |
| 100 <div> | 100 <div> |
| 101 <span>\${name}</span> | 101 <span>${name}</span> |
| 102 <span>-</span> | 102 <span>-</span> |
| 103 <span>\${age}</span> | 103 <span>${age}</span> |
| 104 </div> | 104 </div> |
| 105 ${endWith} | 105 ${endWith} |
| 106 </h1> | 106 </h1> |
| 107 </span> | 107 </span> |
| 108 </div> | 108 </div> |
| 109 } | 109 } |
| 110 '''; | 110 '''; |
| 111 | 111 |
| 112 final String complexTemplate = ''' | 112 final String complexTemplate = @''' |
| 113 template ProductsForPerson(Person person, var products) { | 113 template ProductsForPerson(Person person, var products) { |
| 114 <div> | 114 <div> |
| 115 ${with} person} | 115 ${with} person person |
| 116 <div> | 116 <div> |
| 117 <span>\${name}</span> | 117 <span>${person.name}</span> |
| 118 <span>-</span> | 118 <span>-</span> |
| 119 <span>\${age}</span> | 119 <span>${person.age}</span> |
| 120 </div> | 120 </div> |
| 121 ${each} products} | 121 ${each} products product |
| 122 <div> | 122 <div> |
| 123 <span>product=\${name},users=\${users}</span> | 123 <span>product=${product.name},users=${product.users}</span> |
| 124 </div> | 124 </div> |
| 125 ${endEach} | 125 ${endEach} |
| 126 ${endWith} | 126 ${endWith} |
| 127 </div> | 127 </div> |
| 128 } | 128 } |
| 129 '''; | 129 '''; |
| 130 | 130 |
| 131 final String complexTemplate2 = ''' | 131 final String complexTemplate2 = @''' |
| 132 template ProductsForPerson(Person person, var products) { | 132 template ProductsForPerson(Person person, var products) { |
| 133 <div> | 133 <div> |
| 134 ${with} person} | 134 ${with} person person |
| 135 <div> | 135 <div> |
| 136 <span>\${name}</span> | 136 <span>${person.name}</span> |
| 137 <span>-</span> | 137 <span>-</span> |
| 138 <span>\${age}</span> | 138 <span>${person.age}</span> |
| 139 </div> | 139 </div> |
| 140 <div> | 140 <div> |
| 141 ${each} products} | 141 ${each} products product |
| 142 <span>product=\${name},users=\${users}</span> | 142 <span>product=${product.name},users=${product.users}</span> |
| 143 ${endEach} | 143 ${endEach} |
| 144 </div> | 144 </div> |
| 145 ${endWith} | 145 ${endWith} |
| 146 </div> | 146 </div> |
| 147 } | 147 } |
| 148 '''; | 148 '''; |
| 149 | 149 |
| 150 final String complexTemplate3 = ''' | 150 final String complexTemplate3 = @''' |
| 151 template ProductsForPerson(Person person, var products) { | 151 template ProductsForPerson(Person person, var products) { |
| 152 css { | 152 css { |
| 153 .sales-item { | 153 .sales-item { |
| 154 font-family: arial; | 154 font-family: arial; |
| 155 background-color: lightgray; | 155 background-color: lightgray; |
| 156 margin-left: 10px; | 156 margin-left: 10px; |
| 157 border-bottom: 1px solid white; | 157 border-bottom: 1px solid white; |
| 158 } | 158 } |
| 159 .ytd-sales { | 159 .ytd-sales { |
| 160 position: absolute; | 160 position: absolute; |
| 161 left: 100px; | 161 left: 100px; |
| 162 } | 162 } |
| 163 } | 163 } |
| 164 <div> | 164 <div> |
| 165 ${with} person} | 165 ${with} person person |
| 166 <div> | 166 <div> |
| 167 <span>\${name}</span> | 167 <span>${person.name}</span> |
| 168 <span>-</span> | 168 <span>-</span> |
| 169 <span>\${age}</span> | 169 <span>${person.age}</span> |
| 170 </div> | 170 </div> |
| 171 <div> | 171 <div> |
| 172 ${each} products} | 172 ${each} products product |
| 173 <div>product=\${name},users=\${users}</div> | 173 <div>product=${product.name},users=${product.users}</div> |
| 174 ${each} products.sales} | 174 ${each} products.sales sale |
| 175 <div class="sales-item"> | 175 <div class="sales-item"> |
| 176 <span>\${country}</span> | 176 <span>${sale.country}</span> |
| 177 <span class="ytd-sales">\\\$\${yearly}</span> | 177 <span class="ytd-sales">\$${sale.yearly}</span> |
| 178 </div> | 178 </div> |
| 179 ${endEach} | 179 ${endEach} |
| 180 ${endEach} | 180 ${endEach} |
| 181 </div> | 181 </div> |
| 182 ${endWith} | 182 ${endWith} |
| 183 </div> | 183 </div> |
| 184 } | 184 } |
| 185 | 185 |
| 186 | 186 |
| 187 template NameEntry(String name, int age) { | 187 template NameEntry(String name, int age) { |
| 188 css { | 188 css { |
| 189 .name-item { | 189 .name-item { |
| 190 font-size: 18pt; | 190 font-size: 18pt; |
| 191 font-weight: bold; | 191 font-weight: bold; |
| 192 } | 192 } |
| 193 } | 193 } |
| 194 <div var=topDiv class="name-item" attr="test" attr1=test1 attr2='test2' attr3=
test3> | 194 <div var=topDiv class="name-item" attr="test" attr1=test1 attr2='test2' attr3=
test3> |
| 195 <span var=spanElem>\${name}</span> | 195 <span var=spanElem>${name}</span> |
| 196 <span> - </span> | 196 <span> - </span> |
| 197 <span>\${age}</span> | 197 <span>${age}</span> |
| 198 </div> | 198 </div> |
| 199 } | 199 } |
| 200 '''; | 200 '''; |
| 201 | 201 |
| 202 // Test #each in a #each where the nested #each is a top-level child of the | 202 // Test #each in a #each where the nested #each is a top-level child of the |
| 203 // outer #each. | 203 // outer #each. |
| 204 final String complexTemplate4 = ''' | 204 final String complexTemplate4 = @''' |
| 205 template DivisionSales(var divisions) { | 205 template DivisionSales(var divisions) { |
| 206 <div> | 206 <div> |
| 207 \${#each divisions} | 207 ${each} divisions division |
| 208 <div> | 208 <div> |
| 209 <span>\${name}</span> | 209 <span>${division.name}</span> |
| 210 <span>-</span> | 210 <span>-</span> |
| 211 <span>\${id}</span> | 211 <span>${division.id}</span> |
| 212 </div> | 212 </div> |
| 213 <div> | 213 <div> |
| 214 \${#each divisions.products} | 214 ${each} divisions.products divProduct |
| 215 <div> | 215 <div> |
| 216 <span var=productItem>▶</span> | 216 <span var=productItem>▶</span> |
| 217 <span>Product</span> | 217 <span>Product</span> |
| 218 <span>\${name}</span> | 218 <span>${divProduct.name}</span> |
| 219 <span>\${users} users</span> | 219 <span>${divProduct.users} users</span> |
| 220 </div> | 220 </div> |
| 221 \${#each products.sales} | 221 ${each} products.sales sale |
| 222 <div> | 222 <div> |
| 223 <span>\${country}</span> | 223 <span>${sale.country}</span> |
| 224 <span>\\\$\${yearly}</span> | 224 <span>\$${sale.yearly}</span> |
| 225 </div> | 225 </div> |
| 226 \${/each} | 226 ${endEach} |
| 227 \${/each} | 227 ${endEach} |
| 228 </div> | 228 </div> |
| 229 \${/each} | 229 ${endEach} |
| 230 </div> | 230 </div> |
| 231 } | 231 } |
| 232 '''; | 232 '''; |
| 233 | 233 |
| 234 | 234 |
| 235 final String realWorldList = ''' | 235 final String realWorldList = @''' |
| 236 template DivisionSales(var divisions) { | 236 template DivisionSales(var divisions) { |
| 237 css { | 237 css { |
| 238 .division-item { | 238 .division-item { |
| 239 background-color: #bbb; | 239 background-color: #bbb; |
| 240 border-top: 2px solid white; | 240 border-top: 2px solid white; |
| 241 line-height: 20pt; | 241 line-height: 20pt; |
| 242 padding-left: 5px; | 242 padding-left: 5px; |
| 243 } | 243 } |
| 244 .product-item { | 244 .product-item { |
| 245 background-color: lightgray; | 245 background-color: lightgray; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 border-top: 1px solid white; | 288 border-top: 1px solid white; |
| 289 line-height: 18pt; | 289 line-height: 18pt; |
| 290 padding-left: 5px; | 290 padding-left: 5px; |
| 291 } | 291 } |
| 292 .ytd-sales { | 292 .ytd-sales { |
| 293 position: absolute; | 293 position: absolute; |
| 294 left: 100px; | 294 left: 100px; |
| 295 } | 295 } |
| 296 } | 296 } |
| 297 <div> | 297 <div> |
| 298 \${#each divisions} | 298 ${each} divisions division |
| 299 <div class="division-item"> | 299 <div class="division-item"> |
| 300 <span>\${name}</span> | 300 <span>${division.name}</span> |
| 301 <span>-</span> | 301 <span>-</span> |
| 302 <span>\${id}</span> | 302 <span>${division.id}</span> |
| 303 </div> | 303 </div> |
| 304 <div> | 304 <div> |
| 305 \${#each divisions.products} | 305 ${each} divisions.products divProduct |
| 306 <div class="product-item"> | 306 <div class="product-item"> |
| 307 <span var=productZippy class="expand-collapse expand">▼</span> | 307 <span var=productZippy class="expand-collapse expand">▼</span> |
| 308 <span class='product-title'>Product</span> | 308 <span class='product-title'>Product</span> |
| 309 <span class="product-name">\${name}</span> | 309 <span class="product-name">${divProduct.name}</span> |
| 310 <span class="product-users" align=right>\${users} users</span> | 310 <span class="product-users" align=right>${divProduct.users |
| 311 } users</span> |
| 311 <div class="show-sales"> | 312 <div class="show-sales"> |
| 312 \${#each products.sales} | 313 ${each} products.sales sale |
| 313 <div class="sales-item"> | 314 <div class="sales-item"> |
| 314 <span>\${country}</span> | 315 <span>${sale.country}</span> |
| 315 <span class="ytd-sales">\\\$\${yearly}</span> | 316 <span class="ytd-sales">\$${sale.yearly}</span> |
| 316 </div> | 317 </div> |
| 317 \${/each} | 318 ${endEach} |
| 318 </div> | 319 </div> |
| 319 </div> | 320 </div> |
| 320 \${/each} | 321 ${endEach} |
| 321 </div> | 322 </div> |
| 322 \${/each} | 323 ${endEach} |
| 323 </div> | 324 </div> |
| 324 } | 325 } |
| 325 | 326 |
| 326 template Header(String company, Date date) { | 327 template Header(String company, Date date) { |
| 327 css { | 328 css { |
| 328 .header { | 329 .header { |
| 329 background-color: slateGray; | 330 background-color: slateGray; |
| 330 font-family: arial; | 331 font-family: arial; |
| 331 color: lightgray; | 332 color: lightgray; |
| 332 font-weight: bold; | 333 font-weight: bold; |
| 333 padding-top: 20px; | 334 padding-top: 20px; |
| 334 } | 335 } |
| 335 } | 336 } |
| 336 <div class='header' align=center> | 337 <div class='header' align=center> |
| 337 <h2>\${company}</h2> | 338 <h2>${company}</h2> |
| 338 <div align=right>\${date}</div> | 339 <div align=right>${date}</div> |
| 339 </div> | 340 </div> |
| 340 } | 341 } |
| 341 '''; | 342 '''; |
| 342 | 343 |
| 343 switch (sampleName) { | 344 switch (sampleName) { |
| 344 case "simple": | 345 case "simple": |
| 345 return simpleTemplate; | 346 return simpleTemplate; |
| 346 case "simple2": | 347 case "simple2": |
| 347 return simpleTemplate2; | 348 return simpleTemplate2; |
| 348 case "simpleCSS": | 349 case "simpleCSS": |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 388 } | 389 } |
| 389 | 390 |
| 390 // Generate the Dart class(es) for all template(s). | 391 // Generate the Dart class(es) for all template(s). |
| 391 // Pass in filename of 'foo' for testing in UITest. | 392 // Pass in filename of 'foo' for testing in UITest. |
| 392 code.add(Codegen.generate(templates, 'foo')); | 393 code.add(Codegen.generate(templates, 'foo')); |
| 393 } catch (final htmlException) { | 394 } catch (final htmlException) { |
| 394 // TODO(terry): TBD | 395 // TODO(terry): TBD |
| 395 print("ERROR unhandled EXCEPTION"); | 396 print("ERROR unhandled EXCEPTION"); |
| 396 } | 397 } |
| 397 } | 398 } |
| 398 | 399 |
| 399 /* | 400 /* |
| 400 if (!debug) { | 401 if (!debug) { |
| 401 try { | 402 try { |
| 402 cssParseAndValidate(cssExpr, cssWorld); | 403 cssParseAndValidate(cssExpr, cssWorld); |
| 403 } catch (final cssException) { | 404 } catch (final cssException) { |
| 404 templateValid = false; | 405 templateValid = false; |
| 405 dumpTree = cssException.toString(); | 406 dumpTree = cssException.toString(); |
| 406 } | 407 } |
| 407 } else if (parseOnly) { | 408 } else if (parseOnly) { |
| 408 try { | 409 try { |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 563 initHtmlWorld(false); | 564 initHtmlWorld(false); |
| 564 | 565 |
| 565 // Don't display any colors in the UI. | 566 // Don't display any colors in the UI. |
| 566 options.useColors = false; | 567 options.useColors = false; |
| 567 | 568 |
| 568 // Replace error handler bring up alert for any problems. | 569 // Replace error handler bring up alert for any problems. |
| 569 world.printHandler = (String msg) { | 570 world.printHandler = (String msg) { |
| 570 window.alert(msg); | 571 window.alert(msg); |
| 571 }; | 572 }; |
| 572 } | 573 } |
| OLD | NEW |