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

Unified Diff: utils/template/htmltree.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/template/codegen.dart ('k') | utils/template/parser.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: utils/template/htmltree.dart
diff --git a/utils/template/htmltree.dart b/utils/template/htmltree.dart
new file mode 100644
index 0000000000000000000000000000000000000000..af75f14748deec4be7689e1c1467f0234cd8d47b
--- /dev/null
+++ b/utils/template/htmltree.dart
@@ -0,0 +1,348 @@
+// 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.
+// Generated by scripts/tree_gen.py.
+
+/////////////////////////////////////////////////////////////////////////
+// CSS specific types:
+/////////////////////////////////////////////////////////////////////////
+
+class Identifier extends ASTNode {
+ String name;
+
+ Identifier(this.name, SourceSpan span): super(span);
+
+ visit(TreeVisitor visitor) => visitor.visitIdentifier(this);
+
+ String toString() => name;
+}
+
+class StringValue extends ASTNode {
+ String value;
+
+ StringValue(this.value, SourceSpan span): super(span);
+
+ visit(TreeVisitor visitor) => visitor.visitStringValue(this);
+
+ String toString() => value;
+}
+
+// CDO/CDC (Comment Definition Open <!-- and Comment Definition Close -->).
+class CommentDefinition extends ASTNode {
+ String comment;
+
+ CommentDefinition(this.comment, SourceSpan span): super(span);
+
+ visit(TreeVisitor visitor) => visitor.visitCommentDefinition(this);
+
+ String toString() => '<!-- ${comment} -->';
+}
+
+class Template extends ASTNode {
+ TemplateSignature signature;
+ TemplateContent content;
+
+ Template(this.signature, this.content, SourceSpan span):
+ super(span);
+
+ visit(TreeVisitor visitor) => visitor.visitTemplate(this);
+
+ String toString() => "${signature.toString()} \r{\r${content.toString()}\r}\r";
+}
+
+class TemplateSignature extends ASTNode {
+ String name;
+ List<Map<Identifier, Identifier>> params; // Map of {type:, name:}
+
+ TemplateSignature(this.name, this.params, SourceSpan span): super(span);
+
+ visit(TreeVisitor visitor) => visitor.visitTemplateSignature(this);
+
+ String paramsAsString() {
+ StringBuffer buff = new StringBuffer();
+ bool first = true;
+ for (final param in params) {
+ if (!first) {
+ buff.add(", ");
+ }
+ if (param['type'] != null) {
+ buff.add(param['type']);
+ buff.add(' ');
+ }
+ buff.add(param['name']);
+ first = false;
+ }
+
+ return buff.toString();
+ }
+
+ String toString() => "template ${name}(${paramsAsString()})";
+}
+
+class TemplateChildren extends ASTNode {
+ List<ASTNode> children;
+
+ TemplateChildren(this.children, SourceSpan span): super(span);
+ TemplateChildren.empty(SourceSpan span): super(span);
+
+ add(var child) {
+ if (children == null) {
+ children = new List<ASTNode>();
+ }
+ children.add(child);
+ }
+
+ ASTNode last() => children.last();
+ ASTNode removeLast() => children.removeLast();
+ bool get anyChildren() => children != null && children.length > 0;
+
+ visit(TreeVisitor visitor) => visitor.visitTemplateChildren(this);
+
+ String toString() {
+ StringBuffer buff = new StringBuffer();
+ if (children != null) {
+ for (final child in children) {
+ buff.add(child.toString());
+ }
+ }
+
+ return buff.toString();
+ }
+}
+
+class TemplateContent extends ASTNode {
+ css.Stylesheet css;
+ TemplateDocument html;
+
+ TemplateContent(this.css, this.html, SourceSpan span) : super(span);
+
+ visit(TreeVisitor visitor) => visitor.visitTemplateContent(this);
+}
+
+class TemplateDocument extends TemplateChildren {
+ TemplateDocument(List<ASTNode> children, SourceSpan span):
+ super(children, span);
+
+ visit(TreeVisitor visitor) => visitor.visitTemplateDocument(this);
+}
+
+class TemplateElement extends TemplateChildren {
+ int tagTokenId;
+ List<TemplateAttribute> attributes;
+ StringValue _varName;
+
+ TemplateElement(this.tagTokenId, SourceSpan span): super.empty(span);
+ TemplateElement.fragment(SourceSpan span) : super.empty(span), tagTokenId = -1;
+ TemplateElement.attributes(this.tagTokenId, this.attributes, this._varName,
+ SourceSpan span): super.empty(span);
+
+ bool get isFragment() => tagTokenId == -1;
+ bool get anyAttributes() => attributes != null;
+
+ visit(TreeVisitor visitor) => visitor.visitTemplateElement(this);
+
+ bool get hasVar() => _varName != null;
+ String get varName() => hasVar ? _varName.value : null;
+
+ String attributesToString() {
+ StringBuffer buff = new StringBuffer();
+
+ for (final attr in attributes) {
+ buff.add(' ${attr.toString()}');
+ }
+
+ return buff.toString();
+ }
+
+ String get tagName() => isFragment ?
+ 'root' : TokenKind.tagNameFromTokenId(tagTokenId);
+
+ String tagStartToString() => "<${tagName} ${attributesToString()}>";
+
+ String tagEndToString() => "</${tagName}>";
+
+ String toString() {
+ StringBuffer buff = new StringBuffer(tagStartToString());
+
+ if (children != null) {
+ for (final child in children) {
+ buff.add(child.toString());
+ }
+
+ buff.add(tagEndToString());
+ }
+
+ return buff.toString();
+ }
+}
+
+class TemplateAttribute extends ASTNode {
+ String name;
+ String value;
+
+ TemplateAttribute(this.name, this.value, SourceSpan span): super(span);
+
+ visit(TreeVisitor visitor) => visitor.visitTemplateAttribute(this);
+
+ String toString() => "${name}=\"${value}\"";
+}
+
+class TemplateText extends ASTNode {
+ String value;
+
+ TemplateText(this.value, SourceSpan span): super(span);
+
+ visit(TreeVisitor visitor) => visitor.visitTemplateText(this);
+
+ String toString() => value;
+}
+
+class TemplateExpression extends ASTNode {
+ String expression;
+
+ TemplateExpression(this.expression, SourceSpan span): super(span);
+
+ visit(TreeVisitor visitor) => visitor.visitTemplateExpression(this);
+
+ String toString() => "\$\{value}";
+}
+
+class TemplateEachCommand extends ASTNode {
+ String listName;
+ TemplateDocument documentFragment;
+
+ TemplateEachCommand(this.listName, this.documentFragment, SourceSpan span):
+ super(span);
+
+ visit(TreeVisitor visitor) => visitor.visitTemplateEachCommand(this);
+
+ String toString() => "\$\{#each ${listName}}";
+}
+
+class TemplateWithCommand extends ASTNode {
+ String objectName;
+ TemplateDocument documentFragment;
+
+ TemplateWithCommand(this.objectName, this.documentFragment, SourceSpan span):
+ super(span);
+
+ visit(TreeVisitor visitor) => visitor.visitTemplateWithCommand(this);
+
+ String toString() => "\$\{#with ${objectName}}";
+}
+
+interface TreeVisitor {
+ void visitIdentifier(Identifier node);
+ void visitStringValue(StringValue node);
+ void visitCommentDefinition(CommentDefinition node);
+ void visitTemplate(Template node);
+ void visitTemplateSignature(TemplateSignature node);
+ void visitTemplateChildren(TemplateChildren node);
+ void visitTemplateDocument(TemplateDocument node);
+ void visitTemplateContent(TemplateContent node);
+ void visitTemplateElement(TemplateElement node);
+ void visitTemplateAttribute(TemplateAttribute node);
+ void visitTemplateText(TemplateText node);
+ void visitTemplateExpression(TemplateExpression node);
+ void visitTemplateEachCommand(TemplateEachCommand node);
+ void visitTemplateWithCommand(TemplateWithCommand node);
+}
+
+class TreePrinter implements TreeVisitor {
+ var output;
+ TreePrinter(this.output) { output.printer = this; }
+
+ void visitIdentifier(Identifier node) {
+ output.heading('Identifier(${output.toValue(node.name)})', node.span);
+ }
+
+ void visitStringValue(StringValue node) {
+ output.heading('"${output.toValue(node.value)}"', node.span);
+ }
+
+ void visitCommentDefinition(CommentDefinition node) {
+ output.heading('CommentDefinition (CDO/CDC)', node.span);
+ output.depth++;
+ output.writeValue('comment value', node.comment);
+ output.depth--;
+ }
+
+ void visitTemplate(Template node) {
+ output.heading('Template', node.span);
+ output.depth++;
+ visitTemplateSignature(node.signature);
+ visitTemplateContent(node.content);
+ output.depth--;
+ }
+
+ void visitTemplateSignature(TemplateSignature node) {
+ output.heading('TemplateSignature', node.span);
+ output.depth++;
+ output.writeValue('Template', node);
+ output.depth--;
+ }
+
+ void visitTemplateChildren(TemplateChildren node) {
+ output.writeNodeList('children', node.children);
+ }
+
+ void visitTemplateContent(TemplateContent node) {
+ visitTemplateDocument(node.html);
+ if (node.css != null) {
+ output.depth++;
+ output.writeValue('---CSS---', node.css.toString());
+ output.depth--;
+ }
+ }
+
+ void visitTemplateDocument(TemplateDocument node) {
+ output.heading('Content', node.span);
+ output.depth++;
+ var child = node.children[0];
+ assert(node.children.length == 1 && child.tagTokenId == -1);
+ output.writeNodeList("document", node.children);
+ output.depth--;
+ }
+
+ void visitTemplateElement(TemplateElement node) {
+ output.heading('Element', node.span);
+ output.depth++;
+ output.writeValue('tag', node.tagName);
+ if (node.attributes != null && (node.attributes.length > 0)) {
+ output.writeNodeList("attributes", node.attributes);
+ }
+ visitTemplateChildren(node);
+ output.depth--;
+ }
+
+ void visitTemplateAttribute(TemplateAttribute node) {
+ output.heading('Attribute', node.span);
+ output.depth++;
+ output.writeValue('name', node.name);
+ output.writeValue('value', node.value);
+ output.depth--;
+ }
+
+ void visitTemplateText(TemplateText node) {
+ output.heading('Text', node.span);
+ output.writeValue('value', node.value);
+ }
+
+ void visitTemplateExpression(TemplateExpression node) {
+ output.heading('Interpolate', node.span);
+ output.writeValue('expression', "\$\{${node.expression}\}");
+ }
+
+ void visitTemplateEachCommand(TemplateEachCommand node) {
+ output.heading('#each', node.span);
+ output.writeValue('list', node.listName);
+ visitTemplateDocument(node.documentFragment);
+ }
+
+ void visitTemplateWithCommand(TemplateWithCommand node) {
+ output.heading('#with', node.span);
+ output.writeValue('object', node.objectName);
+ visitTemplateDocument(node.documentFragment);
+ }
+}
+
« no previous file with comments | « utils/template/codegen.dart ('k') | utils/template/parser.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698