Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1155)

Unified Diff: utils/tests/template/sample.dart

Issue 9695048: Template parser (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Siggi's comments Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « utils/tests/template/run ('k') | utils/tests/template/test_complex.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
+}
« no previous file with comments | « utils/tests/template/run ('k') | utils/tests/template/test_complex.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698