| Index: utils/tests/template/sample.dart
 | 
| diff --git a/utils/tests/template/sample.dart b/utils/tests/template/sample.dart
 | 
| new file mode 100755
 | 
| index 0000000000000000000000000000000000000000..82f436088ee1f81e9c0fddf01a17731bccf8eb95
 | 
| --- /dev/null
 | 
| +++ b/utils/tests/template/sample.dart
 | 
| @@ -0,0 +1,243 @@
 | 
| +// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 | 
| +// for details. All rights reserved. Use of this source code is governed by a
 | 
| +// BSD-style license that can be found in the LICENSE file.
 | 
| +
 | 
| +#import('dart:html');
 | 
| +
 | 
| +// Utility functions:
 | 
| +String safeHTML(String value) {
 | 
| +  // TODO(terry): TBD
 | 
| +  return value;
 | 
| +}
 | 
| +
 | 
| +/* Data Model */
 | 
| +class Friend {
 | 
| +  String name;
 | 
| +  String phone;
 | 
| +  int age;
 | 
| +  int friendsCircle, familyCircle, workCircle;
 | 
| +
 | 
| +  Friend(this.name, this.phone, this.age,
 | 
| +         this.friendsCircle, this.familyCircle, this.workCircle);
 | 
| +}
 | 
| +
 | 
| +/* Simple template:
 | 
| +   ================
 | 
| +
 | 
| +  template HTML FriendList(List<Friend> friends) {
 | 
| +    <div>Friends:
 | 
| +      <ul>
 | 
| +        ${#each friends}          // Iterates over each friend
 | 
| +          <li>${name}</li>        // Scope of block is Friend type
 | 
| +        ${/each}
 | 
| +      </ul>
 | 
| +    </div>
 | 
| +  }
 | 
| +*/
 | 
| +class FriendList /*extends Template*/ {
 | 
| +  Element _fragment;
 | 
| +
 | 
| +  // ${#each friends}
 | 
| +  each_0(List items, Element parent) {
 | 
| +    for (var item in items) {
 | 
| +      var e0 = new Element.html('<li></li>');      // Node before injection
 | 
| +      e0.innerHTML = inject_0(item);
 | 
| +      parent.elements.add(e0);
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  // ${name}
 | 
| +  String inject_0(item) {
 | 
| +    return safeHTML('''${item.name}''');
 | 
| +  }
 | 
| +
 | 
| +  FriendList(List<Friend> friends) {
 | 
| +    _fragment = new Element.tag('div');
 | 
| +    Element e0 = new Element.html('<div>Friends:</div>');
 | 
| +    _fragment.elements.add(e0);
 | 
| +    Element e0_0 = new Element.html('<ul></ul>');  // Node before #each
 | 
| +    e0.elements.add(e0_0);
 | 
| +    each_0(friends, e0_0);
 | 
| +  }
 | 
| +
 | 
| +  Element get root() => _fragment.nodes.first;
 | 
| +
 | 
| +  String toString(){
 | 
| +    return _fragment.innerHTML;
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +
 | 
| +/* More template control:
 | 
| +   ======================
 | 
| +
 | 
| +  template HTML FriendEntry(Friend friend) {
 | 
| +    <li>
 | 
| +      ${#with friend}
 | 
| +        <span>${name}</span>
 | 
| +        ${#if (age < 18)}
 | 
| +          <span class=”left-space”>child</span>
 | 
| +        ${#else}
 | 
| +          <span class=”left-space”>adult</span>
 | 
| +        ${/if}
 | 
| +        <span class=”left-space”>circles = ${friendCircle + familyCircle + workCircle}</span>
 | 
| +      ${/friend}
 | 
| +    </li>
 | 
| +  }
 | 
| +*/
 | 
| +class FriendEntry /*extends Template*/ {
 | 
| +  Element _fragment;
 | 
| +
 | 
| +  // ${#with friend}
 | 
| +  with_0(Friend item, Element parent) {
 | 
| +    var e0 = new Element.html('<span></span>');  // Node before injection
 | 
| +    e0.innerHTML = inject_0(item);
 | 
| +    parent.elements.add(e0);
 | 
| +
 | 
| +    // ${#if expression} 
 | 
| +    if (if_0(item)) {
 | 
| +      var e1 = new Element.html('<span class="left-space">child</span>');
 | 
| +      parent.elements.add(e1);
 | 
| +    } else {
 | 
| +      var e2 = new Element.html('<span class="left-space">adult</span>');
 | 
| +      parent.elements.add(e2);
 | 
| +    }
 | 
| +
 | 
| +    // Node before injection.
 | 
| +    var e3 = new Element.html('<span class="left-space"></span>');
 | 
| +    e3.innerHTML = inject_1(item);
 | 
| +    parent.elements.add(e3);
 | 
| +  }
 | 
| +
 | 
| +  // expression (age < 18)}
 | 
| +  bool if_0(var item) {
 | 
| +    return (item.age < 18);
 | 
| +  }
 | 
| +
 | 
| +  // ${name}
 | 
| +  String inject_0(item) {
 | 
| +    return safeHTML('''${item.name}''');
 | 
| +  }
 | 
| +
 | 
| +  // ${friendCircle + family.Circle + workCircle
 | 
| +  String inject_1(item) {
 | 
| +    return safeHTML('circles = ${item.friendsCircle + item.familyCircle + item.workCircle}');
 | 
| +  }
 | 
| +
 | 
| +  FriendEntry(Friend friend) {
 | 
| +    _fragment = new Element.tag('div');
 | 
| +    Element e0 = new Element.html('<li></li>');  // Node before #with
 | 
| +    _fragment.elements.add(e0);
 | 
| +    with_0(friend, e0);
 | 
| +  }
 | 
| +
 | 
| +  Element get root() => _fragment.nodes.first;
 | 
| +
 | 
| +  String toString(){
 | 
| +    return _fragment.innerHTML;
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +
 | 
| +/* Template with events:
 | 
| +   =====================
 | 
| +
 | 
| +  template HTML FriendEntryEvents(Friend friend) {
 | 
| +   <li>
 | 
| +     ${#with friend}
 | 
| +       <span var=friendElem style="cursor: pointer;">${name}</span>
 | 
| +       ${#if (age < 18)}
 | 
| +         <span class=”left-space”>child</span>
 | 
| +       ${#else}
 | 
| +         <span class=”left-space”>adult</span>
 | 
| +       ${/if}
 | 
| +       <span class=”left-space”>circles = ${friendCircle + familyCircle + workCircle}</span>
 | 
| +     ${/friend}
 | 
| +   </li>
 | 
| +  }
 | 
| +*/
 | 
| +class FriendEntryEvents /*extends Template*/ {
 | 
| +  Element _fragment;
 | 
| +  var _friendElem;
 | 
| +
 | 
| +  get friendElem() => _friendElem;
 | 
| +
 | 
| +  // ${#with friend}
 | 
| +  with_0(Friend item, Element parent) {
 | 
| +    _friendElem = new Element.html('<span style="cursor: pointer;"></span>');  // Node before injection
 | 
| +    _friendElem.innerHTML = inject_0(item);
 | 
| +   parent.elements.add(_friendElem);
 | 
| +
 | 
| +   // ${#if expression} 
 | 
| +   if (if_0(item)) {
 | 
| +     var e1 = new Element.html('<span class="left-space">child</span>');
 | 
| +     parent.elements.add(e1);
 | 
| +   } else {
 | 
| +     var e2 = new Element.html('<span class="left-space">adult</span>');
 | 
| +     parent.elements.add(e2);
 | 
| +   }
 | 
| +
 | 
| +   // Node before injection.
 | 
| +   var e3 = new Element.html('<span class="left-space"></span>');
 | 
| +   e3.innerHTML = inject_1(item);
 | 
| +   parent.elements.add(e3);
 | 
| +  }
 | 
| +
 | 
| +  // expression (age < 18)}
 | 
| +  bool if_0(var item) {
 | 
| +   return (item.age < 18);
 | 
| +  }
 | 
| +
 | 
| +  // ${name}
 | 
| +  String inject_0(item) {
 | 
| +   return safeHTML('''${item.name}''');
 | 
| +  }
 | 
| +
 | 
| +  // ${friendCircle + family.Circle + workCircle
 | 
| +  String inject_1(item) {
 | 
| +   return safeHTML('circles = ${item.friendsCircle + item.familyCircle + item.workCircle}');
 | 
| +  }
 | 
| +
 | 
| +  FriendEntryEvents(Friend friend) {
 | 
| +   _fragment = new Element.tag('div');
 | 
| +   Element e0 = new Element.html('<li></li>');  // Node before #with
 | 
| +   _fragment.elements.add(e0);
 | 
| +   with_0(friend, e0);
 | 
| +  }
 | 
| +
 | 
| +  Element get root() => _fragment.nodes.first;
 | 
| +
 | 
| +  String toString(){
 | 
| +   return _fragment.innerHTML;
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void main() {
 | 
| +  // Setup style sheet for page.
 | 
| +  document.head.elements.add(new Element.html('<style>.left-space { margin-left: 10px; }</style>'));
 | 
| +
 | 
| +  // Create data model.
 | 
| +  List<Friend> friends = new List<Friend>();
 | 
| +  friends.add(new Friend('Tom','425.123.4567', 35, 20, 10, 40));
 | 
| +  friends.add(new Friend('Sue','802.987.6543', 23, 53, 25, 80));
 | 
| +  friends.add(new Friend('Bill','617.123.4444', 50, 10, 5, 110));
 | 
| +
 | 
| +  // Simple template.
 | 
| +  document.body.elements.add(new FriendList(friends).root);
 | 
| +
 | 
| +  // Use control template.
 | 
| +  document.body.elements.add(new FriendEntry(friends[0]).root);
 | 
| +
 | 
| +  // Template with Events:
 | 
| +  var clickableFriend = new FriendEntryEvents(friends[0]);
 | 
| +  document.body.elements.add(clickableFriend.root);
 | 
| +  clickableFriend.friendElem.on.click.add((e) {
 | 
| +    var elemStyle = e.srcElement.style;
 | 
| +    String toggleColor = elemStyle.getPropertyValue("background-color") == "red" ? "white" : "red";
 | 
| +    elemStyle.setProperty("background-color", "${toggleColor}");
 | 
| +  });
 | 
| +
 | 
| +  // Calling template inside of a template:
 | 
| +//  document.body.elements.add(new Templates(friends).root);
 | 
| +}
 | 
| 
 |