diff --git a/lib/mustache.dart b/lib/mustache.dart
index 70fa97d..7cdbaa7 100644
--- a/lib/mustache.dart
+++ b/lib/mustache.dart
@@ -6,109 +6,104 @@
 
 /// Use new Template(source) instead.
 @deprecated
-Template parse(String source, {bool lenient : false})
-  => new Template(source, lenient: lenient);
+Template parse(String source, {bool lenient: false}) =>
+    new Template(source, lenient: lenient);
 
 /// A Template can be efficiently rendered multiple times with different
 /// values.
 abstract class Template {
-
   /// The constructor parses the template source and throws [TemplateException]
   /// if the syntax of the source is invalid.
   /// Tag names may only contain characters a-z, A-Z, 0-9, underscore, and minus,
   /// unless lenient mode is specified.
   factory Template(String source,
       {bool lenient,
-       bool htmlEscapeValues,
-       String name,
-       PartialResolver partialResolver,
-       String delimiters}) = t.Template.fromSource;
+      bool htmlEscapeValues,
+      String name,
+      PartialResolver partialResolver,
+      String delimiters}) = t.Template.fromSource;
 
   String get name;
   String get source;
-  
-	/// [values] can be a combination of Map, List, String. Any non-String object
-	/// will be converted using toString(). Null values will cause a 
-	/// [TemplateException], unless lenient module is enabled.
-	String renderString(values);
 
-	/// [values] can be a combination of Map, List, String. Any non-String object
-	/// will be converted using toString(). Null values will cause a 
-	/// [TemplateException], unless lenient module is enabled.
-	void render(values, StringSink sink);
+  /// [values] can be a combination of Map, List, String. Any non-String object
+  /// will be converted using toString(). Null values will cause a
+  /// [TemplateException], unless lenient module is enabled.
+  String renderString(values);
+
+  /// [values] can be a combination of Map, List, String. Any non-String object
+  /// will be converted using toString(). Null values will cause a
+  /// [TemplateException], unless lenient module is enabled.
+  void render(values, StringSink sink);
 }
 
-
 @deprecated
-abstract class MustacheFormatException implements FormatException {  
-}
+abstract class MustacheFormatException implements FormatException {}
 
 typedef Template PartialResolver(String templateName);
 
 typedef Object LambdaFunction(LambdaContext context);
 
 /// Passed as an argument to a mustache lambda function. The methods on
-/// this object may only be called before the lambda function returns. If a 
+/// this object may only be called before the lambda function returns. If a
 /// method is called after it has returned an exception will be thrown.
 abstract class LambdaContext {
-  
   /// Render the current section tag in the current context and return the
   /// result as a string. If provided, value will be added to the top of the
   /// context's stack.
   String renderString({Object value});
-  
+
   /// Render and directly output the current section tag. If provided, value
   /// will be added to the top of the context's stack.
   void render({Object value});
-  
+
   /// Output a string. The output will not be html escaped, and will be written
   /// before the output returned from the lambda.
   void write(Object object);
-  
+
   /// Get the unevaluated template source for the current section tag.
   String get source;
-  
+
   /// Evaluate the string as a mustache template using the current context. If
   /// provided, value will be added to the top of the context's stack.
-  String renderSource(String source, {Object value});  
-  
-  /// Lookup the value of a variable in the current context. 
+  String renderSource(String source, {Object value});
+
+  /// Lookup the value of a variable in the current context.
   Object lookup(String variableName);
 }
 
-const MustacheMirrorsUsedAnnotation mustache = const MustacheMirrorsUsedAnnotation();
+const MustacheMirrorsUsedAnnotation mustache =
+    const MustacheMirrorsUsedAnnotation();
 
 class MustacheMirrorsUsedAnnotation {
   const MustacheMirrorsUsedAnnotation();
 }
 
-
 /// [TemplateException] is used to obtain the line and column numbers
 /// of the token which caused parse or render to fail.
 abstract class TemplateException implements MustacheFormatException, Exception {
-  
   /// A message describing the problem parsing or rendering the template.
   String get message;
 
   /// The name used to identify the template, as passed to the Template
   /// constructor.
   String get templateName;
-  
+
   /// The 1-based line number of the token where formatting error was found.
   int get line;
 
   /// The 1-based column number of the token where formatting error was found.
-  int get column; 
-  
+  int get column;
+
   /// The character offset within the template source.
   int get offset;
 
   /// The template source.
   String get source;
-  
+
   /// A short source substring of the source at the point the problem occurred
   /// with parsing or rendering.
   String get context;
-  
+
   String toString();
 }
diff --git a/lib/src/lambda_context.dart b/lib/src/lambda_context.dart
index 130e445..8b00d74 100644
--- a/lib/src/lambda_context.dart
+++ b/lib/src/lambda_context.dart
@@ -9,28 +9,27 @@
 
 /// Passed as an argument to a mustache lambda function.
 class LambdaContext implements m.LambdaContext {
-  
   final Node _node;
   final Renderer _renderer;
   final bool _isSection;
   bool _closed = false;
-  
+
   LambdaContext(this._node, this._renderer, {bool isSection: true})
       : _isSection = isSection;
-  
+
   void close() {
     _closed = true;
   }
-  
+
   void _checkClosed() {
     if (_closed) throw _error('LambdaContext accessed outside of callback.');
   }
-  
+
   TemplateException _error(String msg) {
-    return new TemplateException(msg, _renderer.templateName, _renderer.source,
-        _node.start);    
+    return new TemplateException(
+        msg, _renderer.templateName, _renderer.source, _node.start);
   }
-  
+
   /// Render the current section tag in the current context and return the
   /// result as a string.
   String renderString({Object value}) {
@@ -48,7 +47,7 @@
     if (value != null) renderer.push(value);
     renderer.render(section.children);
   }
-  
+
   void render({Object value}) {
     _checkClosed();
     if (_node is! SectionNode) _error(
@@ -60,21 +59,21 @@
     _checkClosed();
     _renderer.write(object);
   }
-  
+
   /// Get the unevaluated template source for the current section tag.
   String get source {
     _checkClosed();
-    
+
     if (_node is! SectionNode) return '';
-    
+
     SectionNode node = _node;
-    
+
     var nodes = node.children;
-    
+
     if (nodes.isEmpty) return '';
-    
+
     if (nodes.length == 1 && nodes.first is TextNode) return nodes.first.text;
-    
+
     return _renderer.source.substring(node.contentStart, node.contentEnd);
   }
 
@@ -82,26 +81,20 @@
   String renderSource(String source, {Object value}) {
     _checkClosed();
     var sink = new StringBuffer();
-    
+
     // Lambdas used for sections should parse with the current delimiters.
     var delimiters = '{{ }}';
     if (_node is SectionNode) {
       SectionNode node = _node;
       delimiters = node.delimiters;
     }
-    
-    var nodes = parser.parse(source,
-        _renderer.lenient,
-        _renderer.templateName,
-        delimiters);
-    
+
+    var nodes = parser.parse(
+        source, _renderer.lenient, _renderer.templateName, delimiters);
+
     var renderer = new Renderer.lambda(
-        _renderer,
-        source,
-        _renderer.indent,
-        sink,
-        delimiters);
-    
+        _renderer, source, _renderer.indent, sink, delimiters);
+
     if (value != null) renderer.push(value);
     renderer.render(nodes);
 
@@ -113,5 +106,4 @@
     _checkClosed();
     return _renderer.resolveValue(variableName);
   }
-
-}
\ No newline at end of file
+}
diff --git a/lib/src/node.dart b/lib/src/node.dart
index a0be614..046baff 100644
--- a/lib/src/node.dart
+++ b/lib/src/node.dart
@@ -2,15 +2,15 @@
 
 abstract class Node {
   Node(this.start, this.end);
-  
+
   // The offset of the start of the token in the file. Unless this is a section
   // or inverse section, then this stores the start of the content of the
   // section.
   final int start;
   final int end;
-  
+
   void accept(Visitor visitor);
-  void visitChildren(Visitor visitor) { }  
+  void visitChildren(Visitor visitor) {}
 }
 
 abstract class Visitor {
@@ -21,42 +21,38 @@
 }
 
 class TextNode extends Node {
-  
   TextNode(this.text, int start, int end) : super(start, end);
-    
+
   final String text;
-  
+
   String toString() => '(TextNode "$_debugText" $start $end)';
-  
+
   String get _debugText {
     var t = text.replaceAll('\n', '\\n');
     return t.length < 50 ? t : t.substring(0, 48) + '...';
   }
-  
-  void accept(Visitor visitor) => visitor.visitText(this);  
+
+  void accept(Visitor visitor) => visitor.visitText(this);
 }
 
 class VariableNode extends Node {
-  
   VariableNode(this.name, int start, int end, {this.escape: true})
-    : super(start, end);
-  
+      : super(start, end);
+
   final String name;
   final bool escape;
 
   void accept(Visitor visitor) => visitor.visitVariable(this);
-  
-  String toString() => '(VariableNode "$name" escape: $escape $start $end)';  
+
+  String toString() => '(VariableNode "$name" escape: $escape $start $end)';
 }
 
-
 class SectionNode extends Node {
-  
   SectionNode(this.name, int start, int end, this.delimiters,
       {this.inverse: false})
-    : contentStart = end,
-      super(start, end);
-  
+      : contentStart = end,
+        super(start, end);
+
   final String name;
   final String delimiters;
   final bool inverse;
@@ -65,26 +61,24 @@
   final List<Node> children = <Node>[];
 
   void accept(Visitor visitor) => visitor.visitSection(this);
-  
+
   void visitChildren(Visitor visitor) {
     children.forEach((node) => node.accept(visitor));
   }
-  
-  toString() => '(SectionNode $name inverse: $inverse $start $end)'; 
+
+  toString() => '(SectionNode $name inverse: $inverse $start $end)';
 }
 
 class PartialNode extends Node {
+  PartialNode(this.name, int start, int end, this.indent) : super(start, end);
 
-  PartialNode(this.name, int start, int end, this.indent)
-    : super(start, end);
-  
   final String name;
-  
+
   // Used to store the preceding whitespace before a partial tag, so that
   // it's content can be correctly indented.
   final String indent;
 
   void accept(Visitor visitor) => visitor.visitPartial(this);
-  
-  toString() => '(PartialNode $name $start $end "$indent")';  
+
+  toString() => '(PartialNode $name $start $end "$indent")';
 }
diff --git a/lib/src/parser.dart b/lib/src/parser.dart
index 1ec0c10..779afaa 100644
--- a/lib/src/parser.dart
+++ b/lib/src/parser.dart
@@ -5,10 +5,8 @@
 import 'template_exception.dart';
 import 'token.dart';
 
-List<Node> parse(String source,
-             bool lenient,
-             String templateName,
-             String delimiters) {
+List<Node> parse(
+    String source, bool lenient, String templateName, String delimiters) {
   var parser = new Parser(source, templateName, delimiters, lenient: lenient);
   return parser.parse();
 }
@@ -24,7 +22,7 @@
 class TagType {
   const TagType(this.name);
   final String name;
-  
+
   static const TagType openSection = const TagType('openSection');
   static const TagType openInverseSection = const TagType('openInverseSection');
   static const TagType closeSection = const TagType('closeSection');
@@ -36,83 +34,78 @@
   static const TagType changeDelimiter = const TagType('changeDelimiter');
 }
 
-
 class Parser {
-  
   Parser(String source, String templateName, String delimiters,
-         {lenient: false})
+      {lenient: false})
       : _source = source,
         _templateName = templateName,
         _delimiters = delimiters,
         _lenient = lenient,
-        _scanner = new Scanner(
-            source, templateName, delimiters, lenient: lenient);
-  
+        _scanner =
+            new Scanner(source, templateName, delimiters, lenient: lenient);
+
   final String _source;
   final bool _lenient;
   final String _templateName;
-  final String _delimiters;  
-  final Scanner _scanner;  
+  final String _delimiters;
+  final Scanner _scanner;
   final List<SectionNode> _stack = <SectionNode>[];
   List<Token> _tokens;
-  String _currentDelimiters;  
+  String _currentDelimiters;
   int _offset = 0;
 
-  
   List<Node> parse() {
-    
-    _tokens = _scanner.scan();  
-    _currentDelimiters = _delimiters;    
+    _tokens = _scanner.scan();
+    _currentDelimiters = _delimiters;
     _stack.clear();
-    _stack.add(new SectionNode('root', 0, 0, _delimiters));    
-  
+    _stack.add(new SectionNode('root', 0, 0, _delimiters));
+
     // Handle a standalone tag on first line, including special case where the
     // first line is empty.
     var lineEnd = _readIf(TokenType.lineEnd, eofOk: true);
     if (lineEnd != null) _appendTextToken(lineEnd);
     _parseLine();
-    
+
     for (var token = _peek(); token != null; token = _peek()) {
-      switch(token.type) {
-        
+      switch (token.type) {
         case TokenType.text:
-        case TokenType.whitespace:            
-            _read();
-            _appendTextToken(token);
+        case TokenType.whitespace:
+          _read();
+          _appendTextToken(token);
           break;
-        
+
         case TokenType.openDelimiter:
           var tag = _readTag();
           var node = _createNodeFromTag(tag);
           if (tag != null) _appendTag(tag, node);
           break;
-                 
+
         case TokenType.changeDelimiter:
           _read();
           _currentDelimiters = token.value;
           break;
-          
+
         case TokenType.lineEnd:
           _appendTextToken(_read());
           _parseLine();
           break;
-          
+
         default:
           throw new Exception('Unreachable code.');
       }
     }
-    
+
     if (_stack.length != 1) {
       throw new TemplateException("Unclosed tag: '${_stack.last.name}'.",
           _templateName, _source, _stack.last.start);
     }
-    
+
     return _stack.last.children;
   }
-  
+
   // Returns null on EOF.
   Token _peek() => _offset < _tokens.length ? _tokens[_offset] : null;
-  
+
   // Returns null on EOF.
   Token _read() {
     var t = null;
@@ -122,7 +115,7 @@
     }
     return t;
   }
-      
+
   Token _expect(TokenType type) {
     var token = _read();
     if (token == null) throw _errorEof();
@@ -131,24 +124,24 @@
     }
     return token;
   }
-  
+
   Token _readIf(TokenType type, {eofOk: false}) {
     var token = _peek();
     if (!eofOk && token == null) throw _errorEof();
     return token != null && token.type == type ? _read() : null;
   }
-  
+
   TemplateException _errorEof() =>
       _error('Unexpected end of input.', _source.length - 1);
-  
-  TemplateException _error(String msg, int offset) => 
+
+  TemplateException _error(String msg, int offset) =>
       new TemplateException(msg, _templateName, _source, offset);
-  
+
   // Add a text node to top most section on the stack and merge consecutive
   // text nodes together.
   void _appendTextToken(Token token) {
     assert(const [TokenType.text, TokenType.lineEnd, TokenType.whitespace]
-      .contains(token.type));
+        .contains(token.type));
     var children = _stack.last.children;
     if (children.isEmpty || children.last is! TextNode) {
       children.add(new TextNode(token.value, token.start, token.end));
@@ -158,30 +151,33 @@
       children.add(node);
     }
   }
-  
+
   // Add the node to top most section on the stack. If a section node then
   // push it onto the stack, if a close section tag, then pop the stack.
   void _appendTag(Tag tag, Node node) {
     switch (tag.type) {
-      
+
       // {{#...}}  {{^...}}
       case TagType.openSection:
       case TagType.openInverseSection:
         _stack.last.children.add(node);
         _stack.add(node);
         break;
-        
+
       // {{/...}}
       case TagType.closeSection:
         if (tag.name != _stack.last.name) {
-          throw new TemplateException("Mismatched tag, expected: "
+          throw new TemplateException(
+              "Mismatched tag, expected: "
               "'${_stack.last.name}', was: '${tag.name}'",
-              _templateName, _source, tag.start);
+              _templateName,
+              _source,
+              tag.start);
         }
         var node = _stack.removeLast();
         node.contentEnd = tag.start;
-        break;        
-      
+        break;
+
       // {{...}} {{&...}} {{{...}}}
       case TagType.variable:
       case TagType.unescapedVariable:
@@ -189,7 +185,7 @@
       case TagType.partial:
         if (node != null) _stack.last.children.add(node);
         break;
-      
+
       case TagType.comment:
       case TagType.changeDelimiter:
         // Ignore.
@@ -199,163 +195,165 @@
         throw new Exception('Unreachable code.');
     }
   }
-    
+
   // Handle standalone tags and indented partials.
   //
   // A "standalone tag" in the spec is a tag one a line where the line only
   // contains whitespace. During rendering the whitespace is ommitted.
-  // Standalone partials also indent their content to match the tag during 
+  // Standalone partials also indent their content to match the tag during
   // rendering.
-  
+
   // match:
   // lineEnd whitespace openDelimiter any* closeDelimiter whitespace lineEnd
   //
   // Where lineEnd can also mean start/end of the source.
-  void _parseLine() {   
+  void _parseLine() {
     // Continue parsing standalone lines until we find one than isn't a
-    // standalone line.        
+    // standalone line.
     while (_peek() != null) {
       _readIf(TokenType.lineEnd, eofOk: true);
-      var precedingWhitespace = _readIf(TokenType.whitespace, eofOk: true);          
+      var precedingWhitespace = _readIf(TokenType.whitespace, eofOk: true);
       var indent = precedingWhitespace == null ? '' : precedingWhitespace.value;
       var tag = _readTag();
       var tagNode = _createNodeFromTag(tag, partialIndent: indent);
       var followingWhitespace = _readIf(TokenType.whitespace, eofOk: true);
-      
+
       const standaloneTypes = const [
         TagType.openSection,
         TagType.closeSection,
         TagType.openInverseSection,
         TagType.partial,
         TagType.comment,
-        TagType.changeDelimiter]; 
-      
+        TagType.changeDelimiter
+      ];
+
       if (tag != null &&
           (_peek() == null || _peek().type == TokenType.lineEnd) &&
-          standaloneTypes.contains(tag.type)) {                
+          standaloneTypes.contains(tag.type)) {
         // This is a tag on a "standalone line", so do not create text nodes
         // for whitespace, or the following newline.
         _appendTag(tag, tagNode);
         // Now continue to loop and parse the next line.
       } else {
-        // This is not a standalone line so add the whitespace to the ast.        
+        // This is not a standalone line so add the whitespace to the ast.
         if (precedingWhitespace != null) _appendTextToken(precedingWhitespace);
         if (tag != null) _appendTag(tag, tagNode);
-        if (followingWhitespace != null) _appendTextToken(followingWhitespace);        
+        if (followingWhitespace != null) _appendTextToken(followingWhitespace);
         // Done parsing standalone lines. Exit the loop.
         break;
       }
     }
   }
-  
+
   final RegExp _validIdentifier = new RegExp(r'^[0-9a-zA-Z\_\-\.]+$');
-  
+
   static const _tagTypeMap = const {
-          '#': TagType.openSection,
-          '^': TagType.openInverseSection,
-          '/': TagType.closeSection,
-          '&': TagType.unescapedVariable,
-          '>': TagType.partial,
-          '!': TagType.comment};
+    '#': TagType.openSection,
+    '^': TagType.openInverseSection,
+    '/': TagType.closeSection,
+    '&': TagType.unescapedVariable,
+    '>': TagType.partial,
+    '!': TagType.comment
+  };
 
   // If open delimiter, or change delimiter token then return a tag.
   // If EOF or any another token then return null.
   Tag _readTag() {
-    
     var t = _peek();
     if (t == null ||
         (t.type != TokenType.changeDelimiter &&
-         t.type != TokenType.openDelimiter)) {
+            t.type != TokenType.openDelimiter)) {
       return null;
-    
-    } else if (t.type == TokenType.changeDelimiter) {      
+    } else if (t.type == TokenType.changeDelimiter) {
       _read();
       // Remember the current delimiters.
       _currentDelimiters = t.value;
-      
+
       // Change delimiter tags are already parsed by the scanner.
       // So just create a tag and return it.
       return new Tag(TagType.changeDelimiter, t.value, t.start, t.end);
     }
-    
+
     // Start parsing a typical tag.
-    
+
     var open = _expect(TokenType.openDelimiter);
-    
+
     _readIf(TokenType.whitespace);
-    
+
     // A sigil is the character which identifies which sort of tag it is,
     // i.e.  '#', '/', or '>'.
     // Variable tags and triple mustache tags don't have a sigil.
     TagType tagType;
-    
+
     if (open.value == '{{{') {
       tagType = TagType.tripleMustache;
     } else {
       var sigil = _readIf(TokenType.sigil);
       tagType = sigil == null ? TagType.variable : _tagTypeMap[sigil.value];
     }
-      
+
     _readIf(TokenType.whitespace);
-    
+
     // TODO split up names here instead of during render.
     // Also check that they are valid token types.
     // TODO split up names here instead of during render.
-    // Also check that they are valid token types.     
+    // Also check that they are valid token types.
     var list = <Token>[];
     for (var t = _peek();
-         t != null && t.type != TokenType.closeDelimiter; t = _peek()) {
+        t != null && t.type != TokenType.closeDelimiter;
+        t = _peek()) {
       _read();
       list.add(t);
-    }    
+    }
     var name = list.map((t) => t.value).join().trim();
     if (_peek() == null) throw _errorEof();
-    
+
     // Check to see if the tag name is valid.
-    if (tagType != TagType.comment) {    
-      if (name == '') throw _error('Empty tag name.', open.start);      
+    if (tagType != TagType.comment) {
+      if (name == '') throw _error('Empty tag name.', open.start);
       if (!_lenient) {
         if (name.contains('\t') || name.contains('\n') || name.contains('\r')) {
           throw _error('Tags may not contain newlines or tabs.', open.start);
-        }    
-        
+        }
+
         if (!_validIdentifier.hasMatch(name)) {
-          throw _error('Unless in lenient mode, tags may only contain the '
-              'characters a-z, A-Z, minus, underscore and period.', open.start);
+          throw _error(
+              'Unless in lenient mode, tags may only contain the '
+              'characters a-z, A-Z, minus, underscore and period.',
+              open.start);
         }
       }
     }
-    
+
     var close = _expect(TokenType.closeDelimiter);
-        
+
     return new Tag(tagType, name, open.start, close.end);
   }
-  
+
   Node _createNodeFromTag(Tag tag, {String partialIndent: ''}) {
     // Handle EOF case.
     if (tag == null) return null;
-    
+
     Node node = null;
     switch (tag.type) {
-      
       case TagType.openSection:
       case TagType.openInverseSection:
         bool inverse = tag.type == TagType.openInverseSection;
-        node = new SectionNode(tag.name, tag.start, tag.end, 
-          _currentDelimiters, inverse: inverse);
+        node = new SectionNode(tag.name, tag.start, tag.end, _currentDelimiters,
+            inverse: inverse);
         break;
-   
+
       case TagType.variable:
       case TagType.unescapedVariable:
       case TagType.tripleMustache:
         bool escape = tag.type == TagType.variable;
         node = new VariableNode(tag.name, tag.start, tag.end, escape: escape);
         break;
-        
+
       case TagType.partial:
         node = new PartialNode(tag.name, tag.start, tag.end, partialIndent);
         break;
-            
+
       case TagType.closeSection:
       case TagType.comment:
       case TagType.changeDelimiter:
@@ -366,5 +364,5 @@
         throw new Exception('Unreachable code');
     }
     return node;
-  }  
+  }
 }
diff --git a/lib/src/renderer.dart b/lib/src/renderer.dart
index 36f646b..9735195 100644
--- a/lib/src/renderer.dart
+++ b/lib/src/renderer.dart
@@ -14,52 +14,30 @@
 const Object noSuchProperty = const Object();
 
 class Renderer extends Visitor {
-    
-  Renderer(this.sink,
-      List stack,
-      this.lenient,
-      this.htmlEscapeValues,
-      this.partialResolver,
-      this.templateName,
-      this.indent,
-      this.source)
-    : _stack = new List.from(stack); 
-  
+  Renderer(this.sink, List stack, this.lenient, this.htmlEscapeValues,
+      this.partialResolver, this.templateName, this.indent, this.source)
+      : _stack = new List.from(stack);
+
   Renderer.partial(Renderer ctx, Template partial, String indent)
-      : this(ctx.sink,
-          ctx._stack,
-          ctx.lenient,
-          ctx.htmlEscapeValues,
-          ctx.partialResolver,
-          ctx.templateName,
-          ctx.indent + indent,
-          partial.source);
+      : this(
+            ctx.sink,
+            ctx._stack,
+            ctx.lenient,
+            ctx.htmlEscapeValues,
+            ctx.partialResolver,
+            ctx.templateName,
+            ctx.indent + indent,
+            partial.source);
 
   Renderer.subtree(Renderer ctx, StringSink sink)
-     : this(sink,
-         ctx._stack,
-         ctx.lenient,
-         ctx.htmlEscapeValues,
-         ctx.partialResolver,
-         ctx.templateName,
-         ctx.indent,
-         ctx.source);
+      : this(sink, ctx._stack, ctx.lenient, ctx.htmlEscapeValues,
+            ctx.partialResolver, ctx.templateName, ctx.indent, ctx.source);
 
-  Renderer.lambda(
-      Renderer ctx,
-      String source,
-      String indent,
-      StringSink sink,
+  Renderer.lambda(Renderer ctx, String source, String indent, StringSink sink,
       String delimiters)
-     : this(sink,
-         ctx._stack,
-         ctx.lenient,
-         ctx.htmlEscapeValues,
-         ctx.partialResolver,
-         ctx.templateName,
-         ctx.indent + indent,
-         source);
- 
+      : this(sink, ctx._stack, ctx.lenient, ctx.htmlEscapeValues,
+            ctx.partialResolver, ctx.templateName, ctx.indent + indent, source);
+
   final StringSink sink;
   final List _stack;
   final bool lenient;
@@ -70,34 +48,31 @@
   final String source;
 
   void push(value) => _stack.add(value);
-  
+
   Object pop() => _stack.removeLast();
-  
+
   write(Object output) => sink.write(output.toString());
-  
+
   void render(List<Node> nodes) {
-
-    if (indent == null || indent == '') {      
-     nodes.forEach((n) => n.accept(this));
-
+    if (indent == null || indent == '') {
+      nodes.forEach((n) => n.accept(this));
     } else if (nodes.isNotEmpty) {
       // Special case to make sure there is not an extra indent after the last
-      // line in the partial file.      
+      // line in the partial file.
       write(indent);
-      
+
       nodes.take(nodes.length - 1).forEach((n) => n.accept(this));
-      
+
       var node = nodes.last;
       if (node is TextNode) {
-        visitText(node, lastNode: true);  
+        visitText(node, lastNode: true);
       } else {
         node.accept(this);
       }
     }
   }
-  
+
   void visitText(TextNode node, {bool lastNode: false}) {
-    
     if (node.text == '') return;
     if (indent == null || indent == '') {
       write(node.text);
@@ -110,119 +85,113 @@
       write(node.text.replaceAll('\n', '\n${indent}'));
     }
   }
-  
+
   void visitVariable(VariableNode node) {
     var value = resolveValue(node.name);
-    
+
     if (value is Function) {
       var context = new LambdaContext(node, this, isSection: false);
       value = value(context);
       context.close();
     }
-    
+
     if (value == noSuchProperty) {
-      if (!lenient) 
-        throw error('Value was missing for variable tag: ${node.name}.',
-            node);
+      if (!lenient) throw error(
+          'Value was missing for variable tag: ${node.name}.', node);
     } else {
       var valueString = (value == null) ? '' : value.toString();
       var output = !node.escape || !htmlEscapeValues
-        ? valueString
-        : _htmlEscape(valueString);
+          ? valueString
+          : _htmlEscape(valueString);
       if (output != null) write(output);
-    }  
+    }
   }
-  
+
   void visitSection(SectionNode node) {
-    if (node.inverse) _renderInvSection(node); else _renderSection(node); 
+    if (node.inverse) _renderInvSection(node);
+    else _renderSection(node);
   }
- 
-  //TODO can probably combine Inv and Normal to shorten.   
-   void _renderSection(SectionNode node) {
-     var value = resolveValue(node.name);
-     
-     if (value == null) {
-       // Do nothing.
-     
-     } else if (value is Iterable) {
-       value.forEach((v) => _renderWithValue(node, v));
-     
-     } else if (value is Map) {
-       _renderWithValue(node, value);
-     
-     } else if (value == true) {
-       _renderWithValue(node, value);
-     
-     } else if (value == false) {
-       // Do nothing.
-     
-     } else if (value == noSuchProperty) {
-       if (!lenient)
-         throw error('Value was missing for section tag: ${node.name}.', node);
-     
-     } else if (value is Function) {
-       var context = new LambdaContext(node, this, isSection: true);
-       var output = value(context);
-       context.close();        
-       if (output != null) write(output);
-       
-     } else if (lenient) {
-       // We consider all other values as 'true' in lenient mode.
-       _renderWithValue(node, null);
 
-     } else {
-       throw error('Invalid value type for section, '
-         'section: ${node.name}, '
-         'type: ${value.runtimeType}.', node);
-     }
-   }
-   
-   void _renderInvSection(SectionNode node) {
-     var value = resolveValue(node.name);
-     
-     if (value == null) {
-       _renderWithValue(node, null);
-     
-     } else if ((value is Iterable && value.isEmpty) || value == false) {
-       _renderWithValue(node, node.name);
-     
-     } else if (value == true || value is Map || value is Iterable) {
-       // Do nothing.
-     
-     } else if (value == noSuchProperty) {
-       if (lenient) {
-         _renderWithValue(node, null);
-       } else {
-         throw error('Value was missing for inverse section: ${node.name}.', node);
-       }
-   
-      } else if (value is Function) {       
-       // Do nothing.
-        //TODO in strict mode should this be an error?
-   
-     } else if (lenient) {
-       // We consider all other values as 'true' in lenient mode. Since this
-       // is an inverted section, we do nothing.
+  //TODO can probably combine Inv and Normal to shorten.
+  void _renderSection(SectionNode node) {
+    var value = resolveValue(node.name);
 
-     } else {
-       throw error(
-         'Invalid value type for inverse section, '
-         'section: ${node.name}, '
-         'type: ${value.runtimeType}.', node);
-     }
-   }
-   
-   void _renderWithValue(SectionNode node, value) {
-     push(value);
-     node.visitChildren(this);
-     pop();
-   }
-  
+    if (value == null) {
+      // Do nothing.
+
+    } else if (value is Iterable) {
+      value.forEach((v) => _renderWithValue(node, v));
+    } else if (value is Map) {
+      _renderWithValue(node, value);
+    } else if (value == true) {
+      _renderWithValue(node, value);
+    } else if (value == false) {
+      // Do nothing.
+
+    } else if (value == noSuchProperty) {
+      if (!lenient) throw error(
+          'Value was missing for section tag: ${node.name}.', node);
+    } else if (value is Function) {
+      var context = new LambdaContext(node, this, isSection: true);
+      var output = value(context);
+      context.close();
+      if (output != null) write(output);
+    } else if (lenient) {
+      // We consider all other values as 'true' in lenient mode.
+      _renderWithValue(node, null);
+    } else {
+      throw error(
+          'Invalid value type for section, '
+          'section: ${node.name}, '
+          'type: ${value.runtimeType}.',
+          node);
+    }
+  }
+
+  void _renderInvSection(SectionNode node) {
+    var value = resolveValue(node.name);
+
+    if (value == null) {
+      _renderWithValue(node, null);
+    } else if ((value is Iterable && value.isEmpty) || value == false) {
+      _renderWithValue(node, node.name);
+    } else if (value == true || value is Map || value is Iterable) {
+      // Do nothing.
+
+    } else if (value == noSuchProperty) {
+      if (lenient) {
+        _renderWithValue(node, null);
+      } else {
+        throw error(
+            'Value was missing for inverse section: ${node.name}.', node);
+      }
+    } else if (value is Function) {
+      // Do nothing.
+      //TODO in strict mode should this be an error?
+
+    } else if (lenient) {
+      // We consider all other values as 'true' in lenient mode. Since this
+      // is an inverted section, we do nothing.
+
+    } else {
+      throw error(
+          'Invalid value type for inverse section, '
+          'section: ${node.name}, '
+          'type: ${value.runtimeType}.',
+          node);
+    }
+  }
+
+  void _renderWithValue(SectionNode node, value) {
+    push(value);
+    node.visitChildren(this);
+    pop();
+  }
+
   void visitPartial(PartialNode node) {
     var partialName = node.name;
-    Template template = partialResolver == null
-        ? null
-        : partialResolver(partialName);
+    Template template =
+        partialResolver == null ? null : partialResolver(partialName);
     if (template != null) {
       var renderer = new Renderer.partial(this, template, node.indent);
       var nodes = getTemplateNodes(template);
@@ -231,9 +200,9 @@
       // do nothing
     } else {
       throw error('Partial not found: $partialName.', node);
-    } 
+    }
   }
-  
+
   // Walks up the stack looking for the variable.
   // Handles dotted names of the form "a.b.c".
   Object resolveValue(String name) {
@@ -256,28 +225,26 @@
     }
     return object;
   }
-  
+
   // Returns the property of the given object by name. For a map,
   // which contains the key name, this is object[name]. For other
   // objects, this is object.name or object.name(). If no property
   // by the given name exists, this method returns noSuchProperty.
   _getNamedProperty(object, name) {
-    
-    if (object is Map && object.containsKey(name))
-      return object[name];
-    
-    if (object is List && _integerTag.hasMatch(name))
-      return object[int.parse(name)];
-    
-    if (lenient && !_validTag.hasMatch(name))
-      return noSuchProperty;
-    
+    if (object is Map && object.containsKey(name)) return object[name];
+
+    if (object is List && _integerTag.hasMatch(name)) return object[
+        int.parse(name)];
+
+    if (lenient && !_validTag.hasMatch(name)) return noSuchProperty;
+
     var instance = reflect(object);
     var field = instance.type.instanceMembers[new Symbol(name)];
     if (field == null) return noSuchProperty;
-    
+
     var invocation = null;
-    if ((field is VariableMirror) || ((field is MethodMirror) && (field.isGetter))) {
+    if ((field is VariableMirror) ||
+        ((field is MethodMirror) && (field.isGetter))) {
       invocation = instance.getField(field.simpleName);
     } else if ((field is MethodMirror) && (field.parameters.length == 0)) {
       invocation = instance.invoke(field.simpleName, []);
@@ -287,31 +254,30 @@
     }
     return invocation.reflectee;
   }
-  
-  m.TemplateException error(String message, Node node)
-    => new TemplateException(message, templateName, source, node.start);
 
-  static const Map<String,String> _htmlEscapeMap = const {
+  m.TemplateException error(String message, Node node) =>
+      new TemplateException(message, templateName, source, node.start);
+
+  static const Map<String, String> _htmlEscapeMap = const {
     _AMP: '&amp;',
     _LT: '&lt;',
     _GT: '&gt;',
     _QUOTE: '&quot;',
     _APOS: '&#x27;',
-    _FORWARD_SLASH: '&#x2F;' 
+    _FORWARD_SLASH: '&#x2F;'
   };
-  
+
   String _htmlEscape(String s) {
-    
     var buffer = new StringBuffer();
     int startIndex = 0;
     int i = 0;
     for (int c in s.runes) {
-      if (c == _AMP
-          || c == _LT
-          || c == _GT
-          || c == _QUOTE
-          || c == _APOS
-          || c == _FORWARD_SLASH) {
+      if (c == _AMP ||
+          c == _LT ||
+          c == _GT ||
+          c == _QUOTE ||
+          c == _APOS ||
+          c == _FORWARD_SLASH) {
         buffer.write(s.substring(startIndex, i));
         buffer.write(_htmlEscapeMap[c]);
         startIndex = i + 1;
@@ -321,7 +287,6 @@
     buffer.write(s.substring(startIndex));
     return buffer.toString();
   }
-
 }
 
 const int _AMP = 38;
diff --git a/lib/src/scanner.dart b/lib/src/scanner.dart
index b537b57..c1bd497 100644
--- a/lib/src/scanner.dart
+++ b/lib/src/scanner.dart
@@ -4,48 +4,43 @@
 import 'template_exception.dart';
 
 class Scanner {
-  
   Scanner(String source, this._templateName, String delimiters,
       {bool lenient: true})
-   : _source = source,
-     _lenient = lenient,
-     _itr = source.runes.iterator {
-    
+      : _source = source,
+        _lenient = lenient,
+        _itr = source.runes.iterator {
     if (source == '') {
       _c = _EOF;
     } else {
       _itr.moveNext();
       _c = _itr.current;
     }
-    
+
     if (delimiters == null) {
       _openDelimiter = _openDelimiterInner = _OPEN_MUSTACHE;
       _closeDelimiter = _closeDelimiterInner = _CLOSE_MUSTACHE;
-    
     } else if (delimiters.length == 3) {
       _openDelimiter = delimiters.codeUnits[0];
       _closeDelimiter = delimiters.codeUnits[2];
-    
     } else if (delimiters.length == 5) {
       _openDelimiter = delimiters.codeUnits[0];
       _openDelimiterInner = delimiters.codeUnits[1];
       _closeDelimiterInner = delimiters.codeUnits[3];
       _closeDelimiter = delimiters.codeUnits[4];
-    
     } else {
       throw new TemplateException(
-              'Invalid delimiter string $delimiters', null, null, null);   
+          'Invalid delimiter string $delimiters', null, null, null);
     }
   }
 
   final String _templateName;
   final String _source;
   final bool _lenient;
-  
+
   final Iterator<int> _itr;
   int _offset = 0;
   int _c = 0;
-  
+
   final List<Token> _tokens = new List<Token>();
 
   // These can be changed by the change delimiter tag.
@@ -53,61 +48,55 @@
   int _openDelimiterInner;
   int _closeDelimiterInner;
   int _closeDelimiter;
-  
+
   List<Token> scan() {
-    
     for (int c = _peek(); c != _EOF; c = _peek()) {
-      
       // Scan text tokens.
       if (c != _openDelimiter) {
         _scanText();
         continue;
       }
-        
+
       int start = _offset;
-      
+
       // Read first open delimiter character.
       _read();
-      
+
       // If only a single delimiter character then create a text token.
       if (_openDelimiterInner != null && _peek() != _openDelimiterInner) {
         var value = new String.fromCharCode(_openDelimiter);
         _append(TokenType.text, value, start, _offset);
         continue;
       }
-        
+
       if (_openDelimiterInner != null) _expect(_openDelimiterInner);
-      
+
       // Handle triple mustache.
       if (_openDelimiterInner == _OPEN_MUSTACHE &&
           _openDelimiter == _OPEN_MUSTACHE &&
           _peek() == _OPEN_MUSTACHE) {
-        
         _read();
         _append(TokenType.openDelimiter, '{{{', start, _offset);
         _scanTagContent();
         _scanCloseTripleMustache();
-                   
       } else {
-      
         // Check to see if this is a change delimiter tag. {{= | | =}}
         // Need to skip whitespace and check for "=".
         int wsStart = _offset;
         var ws = _readWhile(_isWhitespace);
-        
+
         if (_peek() == _EQUAL) {
           _parseChangeDelimiterTag(start);
-          
         } else {
           // Scan standard mustache tag.
           var value = new String.fromCharCodes(_openDelimiterInner == null
               ? [_openDelimiter]
               : [_openDelimiter, _openDelimiterInner]);
-          
+
           _append(TokenType.openDelimiter, value, start, wsStart);
-          
+
           if (ws != '') _append(TokenType.whitespace, ws, wsStart, _offset);
-          
+
           _scanTagContent();
           _scanCloseDelimiter();
         }
@@ -115,18 +104,18 @@
     }
     return _tokens;
   }
-  
+
   int _peek() => _c;
-  
+
   int _read() {
     int c = _c;
     _offset++;
     _c = _itr.moveNext() ? _itr.current : _EOF;
     return c;
   }
-  
+
   String _readWhile(bool test(int charCode)) {
-    if (_c == _EOF) return '';      
+    if (_c == _EOF) return '';
     int start = _offset;
     while (_peek() != _EOF && test(_peek())) {
       _read();
@@ -134,28 +123,30 @@
     int end = _peek() == _EOF ? _source.length : _offset;
     return _source.substring(start, end);
   }
-  
+
   _expect(int expectedCharCode) {
     int c = _read();
 
     if (c == _EOF) {
-      throw new TemplateException('Unexpected end of input',
-          _templateName, _source, _offset - 1);
-
+      throw new TemplateException(
+          'Unexpected end of input', _templateName, _source, _offset - 1);
     } else if (c != expectedCharCode) {
-      throw new TemplateException('Unexpected character, '
-        'expected: ${new String.fromCharCode(expectedCharCode)}, '
-        'was: ${new String.fromCharCode(c)}',
-          _templateName, _source, _offset - 1);
+      throw new TemplateException(
+          'Unexpected character, '
+          'expected: ${new String.fromCharCode(expectedCharCode)}, '
+          'was: ${new String.fromCharCode(c)}',
+          _templateName,
+          _source,
+          _offset - 1);
     }
   }
-  
+
   _append(TokenType type, String value, int start, int end) =>
       _tokens.add(new Token(type, value, start, end));
-  
-  bool _isWhitespace(int c)
-    => const [_SPACE, _TAB , _NEWLINE, _RETURN].contains(c);
-  
+
+  bool _isWhitespace(int c) =>
+      const [_SPACE, _TAB, _NEWLINE, _RETURN].contains(c);
+
   // Scan text. This adds text tokens, line end tokens, and whitespace
   // tokens for whitespace at the begining of a line. This is because the
   // mustache spec requires special handing of whitespace.
@@ -163,23 +154,23 @@
     int start = 0;
     TokenType token;
     String value;
-  
+
     for (int c = _peek(); c != _EOF && c != _openDelimiter; c = _peek()) {
       start = _offset;
-      
+
       switch (c) {
         case _SPACE:
         case _TAB:
           value = _readWhile((c) => c == _SPACE || c == _TAB);
-          token = TokenType.whitespace;          
+          token = TokenType.whitespace;
           break;
-          
+
         case _NEWLINE:
           _read();
           token = TokenType.lineEnd;
           value = '\n';
           break;
-        
+
         case _RETURN:
           _read();
           if (_peek() == _NEWLINE) {
@@ -191,43 +182,41 @@
             value = '\r';
           }
           break;
-          
+
         default:
           value = _readWhile((c) => c != _openDelimiter && c != _NEWLINE);
           token = TokenType.text;
       }
-      
+
       _append(token, value, start, _offset);
     }
   }
-  
+
   // Scan contents of a tag and the end delimiter token.
   void _scanTagContent() {
-    
     int start;
     TokenType token;
     String value;
-    
-    bool isCloseDelimiter(int c) => 
-          (_closeDelimiterInner == null && c == _closeDelimiter)
-          || (_closeDelimiterInner != null && c == _closeDelimiterInner);      
-    
+
+    bool isCloseDelimiter(int c) =>
+        (_closeDelimiterInner == null && c == _closeDelimiter) ||
+            (_closeDelimiterInner != null && c == _closeDelimiterInner);
+
     for (int c = _peek(); c != _EOF && !isCloseDelimiter(c); c = _peek()) {
-      
       start = _offset;
-      
+
       switch (c) {
         case _HASH:
         case _CARET:
         case _FORWARD_SLASH:
         case _GT:
         case _AMP:
-        case _EXCLAIM:        
+        case _EXCLAIM:
           _read();
           token = TokenType.sigil;
           value = new String.fromCharCode(c);
           break;
-          
+
         case _SPACE:
         case _TAB:
         case _NEWLINE:
@@ -235,86 +224,94 @@
           token = TokenType.whitespace;
           value = _readWhile(_isWhitespace);
           break;
-          
+
         case _PERIOD:
           _read();
           token = TokenType.dot;
-          value = '.';  
+          value = '.';
           break;
-          
-        default:          
+
+        default:
           // Identifier can be any other character in lenient mode.
           token = TokenType.identifier;
-          value = _readWhile((c) => !(const [ _HASH, _CARET, _FORWARD_SLASH,
-            _GT, _AMP, _EXCLAIM, _SPACE, _TAB, _NEWLINE, _RETURN,
-            _PERIOD].contains(c)) &&
-            c != _closeDelimiterInner &&
-            c != _closeDelimiter);
+          value = _readWhile((c) => !(const [
+                _HASH,
+                _CARET,
+                _FORWARD_SLASH,
+                _GT,
+                _AMP,
+                _EXCLAIM,
+                _SPACE,
+                _TAB,
+                _NEWLINE,
+                _RETURN,
+                _PERIOD
+              ].contains(c)) &&
+              c != _closeDelimiterInner &&
+              c != _closeDelimiter);
       }
-      _append(token, value, start, _offset);    
-    }    
+      _append(token, value, start, _offset);
+    }
   }
 
   // Scan close delimiter token.
   void _scanCloseDelimiter() {
-    
     if (_peek() != _EOF) {
       int start = _offset;
-      
+
       if (_closeDelimiterInner != null) _expect(_closeDelimiterInner);
       _expect(_closeDelimiter);
-      
+
       String value = new String.fromCharCodes(_closeDelimiterInner == null
           ? [_closeDelimiter]
           : [_closeDelimiterInner, _closeDelimiter]);
-      
+
       _append(TokenType.closeDelimiter, value, start, _offset);
-    }    
+    }
   }
 
   // Scan close triple mustache delimiter token.
   void _scanCloseTripleMustache() {
     if (_peek() != _EOF) {
       int start = _offset;
-      
+
       _expect(_CLOSE_MUSTACHE);
-      _expect(_CLOSE_MUSTACHE);      
       _expect(_CLOSE_MUSTACHE);
-      
+      _expect(_CLOSE_MUSTACHE);
+
       _append(TokenType.closeDelimiter, '}}}', start, _offset);
-    }    
-  }  
+    }
+  }
 
   // Open delimiter characters have already been read.
   void _parseChangeDelimiterTag(int start) {
-    
     _expect(_EQUAL);
-    
+
     var delimiterInner = _closeDelimiterInner;
     var delimiter = _closeDelimiter;
-    
+
     _readWhile(_isWhitespace);
-    
+
     int c;
     c = _read();
-    
+
     if (c == _EQUAL) throw _error('Incorrect change delimiter tag.');
     _openDelimiter = c;
-    
+
     c = _read();
     if (_isWhitespace(c)) {
       _openDelimiterInner = null;
     } else {
       _openDelimiterInner = c;
     }
-    
+
     _readWhile(_isWhitespace);
-    
+
     c = _read();
-    
-    if (_isWhitespace(c) || c == _EQUAL)
-      throw _error('Incorrect change delimiter tag.');
-    
+
+    if (_isWhitespace(c) ||
+        c == _EQUAL) throw _error('Incorrect change delimiter tag.');
+
     if (_isWhitespace(_peek()) || _peek() == _EQUAL) {
       _closeDelimiterInner = null;
       _closeDelimiter = c;
@@ -322,34 +319,33 @@
       _closeDelimiterInner = c;
       _closeDelimiter = _read();
     }
-    
+
     _readWhile(_isWhitespace);
-    
+
     _expect(_EQUAL);
-    
-    _readWhile(_isWhitespace);     
-     
+
+    _readWhile(_isWhitespace);
+
     if (delimiterInner != null) _expect(delimiterInner);
-     _expect(delimiter);
-    
-     // Create delimiter string.
-     var buffer = new StringBuffer();
-     buffer.writeCharCode(_openDelimiter);
-     if (_openDelimiterInner != null) buffer.writeCharCode(_openDelimiterInner);
-     buffer.write(' ');
-     if (_closeDelimiterInner != null) {
-       buffer.writeCharCode(_closeDelimiterInner);
-     }
-     buffer.writeCharCode(_closeDelimiter);
-     var value = buffer.toString();
-          
-     _append(TokenType.changeDelimiter, value, start, _offset);
+    _expect(delimiter);
+
+    // Create delimiter string.
+    var buffer = new StringBuffer();
+    buffer.writeCharCode(_openDelimiter);
+    if (_openDelimiterInner != null) buffer.writeCharCode(_openDelimiterInner);
+    buffer.write(' ');
+    if (_closeDelimiterInner != null) {
+      buffer.writeCharCode(_closeDelimiterInner);
+    }
+    buffer.writeCharCode(_closeDelimiter);
+    var value = buffer.toString();
+
+    _append(TokenType.changeDelimiter, value, start, _offset);
   }
-  
+
   TemplateException _error(String message) {
     return new TemplateException(message, _templateName, _source, _offset);
   }
-
 }
 
 const int _EOF = -1;
@@ -381,5 +377,3 @@
 
 const int _UNDERSCORE = 95;
 const int _MINUS = 45;
-
-
diff --git a/lib/src/template.dart b/lib/src/template.dart
index 1753138..2a33b28 100644
--- a/lib/src/template.dart
+++ b/lib/src/template.dart
@@ -6,19 +6,18 @@
 import 'renderer.dart';
 
 class Template implements m.Template {
-
   Template.fromSource(String source,
-       {bool lenient: false,
-        bool htmlEscapeValues : true,
-        String name,
-        m.PartialResolver partialResolver,
-        String delimiters: "{{ }}"})
-       :  source = source,
-          _nodes = parser.parse(source, lenient, name, delimiters),
-          _lenient = lenient,
-          _htmlEscapeValues = htmlEscapeValues,
-          _name = name,
-          _partialResolver = partialResolver;
+      {bool lenient: false,
+      bool htmlEscapeValues: true,
+      String name,
+      m.PartialResolver partialResolver,
+      String delimiters: "{{ }}"})
+      : source = source,
+        _nodes = parser.parse(source, lenient, name, delimiters),
+        _lenient = lenient,
+        _htmlEscapeValues = htmlEscapeValues,
+        _name = name,
+        _partialResolver = partialResolver;
 
   final String source;
   final List<Node> _nodes;
diff --git a/lib/src/template_exception.dart b/lib/src/template_exception.dart
index d4db9c0..94db0a9 100644
--- a/lib/src/template_exception.dart
+++ b/lib/src/template_exception.dart
@@ -3,19 +3,18 @@
 import 'package:mustache/mustache.dart' as m;
 
 class TemplateException implements m.TemplateException {
-
   TemplateException(this.message, this.templateName, this.source, this.offset);
 
   final String message;
   final String templateName;
   final String source;
   final int offset;
-  
+
   bool _isUpdated = false;
   int _line;
   int _column;
   String _context;
-  
+
   int get line {
     _update();
     return _line;
@@ -30,13 +29,13 @@
     _update();
     return _context;
   }
-    
+
   String toString() {
     var list = [];
     if (templateName != null) list.add(templateName);
     if (line != null) list.add(line);
     if (column != null) list.add(column);
-    var location = list.isEmpty ? '' : ' (${list.join(':')})';     
+    var location = list.isEmpty ? '' : ' (${list.join(':')})';
     return '$message$location\n$context';
   }
 
@@ -44,12 +43,11 @@
   void _update() {
     if (_isUpdated) return;
     _isUpdated = true;
-        
-    if (source == null
-        || offset == null
-        || (offset < 0 || offset > source.length))
-      return;
-    
+
+    if (source == null ||
+        offset == null ||
+        (offset < 0 || offset > source.length)) return;
+
     // Find line and character column.
     int lineNum = 1;
     int lineStart = 0;
@@ -68,7 +66,7 @@
         lastWasCR = true;
       }
     }
-    
+
     _line = lineNum;
     _column = offset - lineStart + 1;
 
@@ -105,9 +103,7 @@
     }
     String slice = source.substring(start, end);
     int markOffset = offset - start + prefix.length;
-    
+
     _context = "$prefix$slice$postfix\n${" " * markOffset}^\n";
   }
-
 }
-
diff --git a/lib/src/token.dart b/lib/src/token.dart
index afb42b8..e4d7b59 100644
--- a/lib/src/token.dart
+++ b/lib/src/token.dart
@@ -1,12 +1,10 @@
 library mustache.token;
 
-
 class TokenType {
-  
   const TokenType(this.name);
-  
+
   final String name;
-  
+
   String toString() => '(TokenType $name)';
 
   static const TokenType text = const TokenType('text');
@@ -18,23 +16,20 @@
   static const TokenType sigil = const TokenType('sigil');
   static const TokenType identifier = const TokenType('identifier');
   static const TokenType dot = const TokenType('dot');
-  
+
   static const TokenType changeDelimiter = const TokenType('changeDelimiter');
   static const TokenType whitespace = const TokenType('whitespace');
   static const TokenType lineEnd = const TokenType('lineEnd');
-
 }
 
-
 class Token {
-  
   Token(this.type, this.value, this.start, this.end);
-  
+
   final TokenType type;
   final String value;
-  
+
   final int start;
   final int end;
-  
+
   String toString() => "(Token ${type.name} \"$value\" $start $end)";
 }
diff --git a/test/all.dart b/test/all.dart
index d319eac..253942c 100644
--- a/test/all.dart
+++ b/test/all.dart
@@ -7,4 +7,3 @@
   test.main();
   parser.main();
 }
-
diff --git a/test/mustache_specs.dart b/test/mustache_specs.dart
index c55e376..01c5144 100644
--- a/test/mustache_specs.dart
+++ b/test/mustache_specs.dart
@@ -25,19 +25,17 @@
   defineTests();
 }
 
-defineTests () {
+defineTests() {
   var specs_dir = new Directory('test/spec/specs');
-  specs_dir
-    .listSync()
-    .forEach((f) {
-      if (f is File) {
-        var filename = f.path;
-        if (shouldRun(filename)) {
-          var text = f.readAsStringSync(encoding: UTF8);
-          _defineGroupFromFile(filename, text);
-        }
+  specs_dir.listSync().forEach((f) {
+    if (f is File) {
+      var filename = f.path;
+      if (shouldRun(filename)) {
+        var text = f.readAsStringSync(encoding: UTF8);
+        _defineGroupFromFile(filename, text);
       }
-    });
+    }
+  });
 }
 
 _defineGroupFromFile(filename, text) {
@@ -45,20 +43,21 @@
   var tests = json['tests'];
   filename = filename.substring(filename.lastIndexOf('/') + 1);
   group("Specs of $filename", () {
-    
     //Make sure that we reset the state of the Interpolation - Multiple Calls test
     //as for some reason dart can run the group more than once causing the test
     //to fail the second time it runs
-    tearDown (() =>lambdas['Interpolation - Multiple Calls'].reset());
-    
-    tests.forEach( (t) {
+    tearDown(() => lambdas['Interpolation - Multiple Calls'].reset());
+
+    tests.forEach((t) {
       var testDescription = new StringBuffer(t['name']);
       testDescription.write(': ');
       testDescription.write(t['desc']);
       var template = t['template'];
       var data = t['data'];
-      var templateOneline = template.replaceAll('\n', '\\n').replaceAll('\r', '\\r');
-      var reason = new StringBuffer("Could not render right '''$templateOneline'''");
+      var templateOneline =
+          template.replaceAll('\n', '\\n').replaceAll('\r', '\\r');
+      var reason =
+          new StringBuffer("Could not render right '''$templateOneline'''");
       var expected = t['expected'];
       var partials = t['partials'];
       var partial = (String name) {
@@ -67,7 +66,7 @@
         }
         return partials[name];
       };
-      
+
       //swap the data.lambda with a dart real function
       if (data['lambda'] != null) {
         data['lambda'] = lambdas[t['name']];
@@ -76,8 +75,11 @@
       if (partials != null) {
         reason.write(" and partial: $partials");
       }
-      test(testDescription.toString(), () => expect(render(template, data, partial: partial), expected, reason: reason.toString())); 
-    });            
+      test(
+          testDescription.toString(),
+          () => expect(render(template, data, partial: partial), expected,
+              reason: reason.toString()));
+    });
   });
 }
 
@@ -93,23 +95,27 @@
 //we provide the lambdas at the test here
 class _DummyCallableWithState {
   var _callCounter = 0;
-  
-  call (arg) => "${++_callCounter}";
-  
-  reset () => _callCounter = 0; 
+
+  call(arg) => "${++_callCounter}";
+
+  reset() => _callCounter = 0;
 }
 
-Function wrapLambda(Function f) => (LambdaContext ctx) => ctx.renderSource(f(ctx.source).toString());
+Function wrapLambda(Function f) =>
+    (LambdaContext ctx) => ctx.renderSource(f(ctx.source).toString());
 
 var lambdas = {
-               'Interpolation' : wrapLambda((t) => 'world'),
-               'Interpolation - Expansion': wrapLambda((t) => '{{planet}}'),
-               'Interpolation - Alternate Delimiters': wrapLambda((t) => "|planet| => {{planet}}"),
-               'Interpolation - Multiple Calls': new _DummyCallableWithState(), //function() { return (g=(function(){return this})()).calls=(g.calls||0)+1 }
-               'Escaping': wrapLambda((t) => '>'),
-               'Section': wrapLambda((txt) => txt == "{{x}}" ? "yes" : "no"),
-               'Section - Expansion': wrapLambda((txt) => "$txt{{planet}}$txt"),
-               'Section - Alternate Delimiters': wrapLambda((txt) => "$txt{{planet}} => |planet|$txt"),
-               'Section - Multiple Calls': wrapLambda((t) => "__${t}__"),
-               'Inverted Section': wrapLambda((txt) => false)
+  'Interpolation': wrapLambda((t) => 'world'),
+  'Interpolation - Expansion': wrapLambda((t) => '{{planet}}'),
+  'Interpolation - Alternate Delimiters':
+      wrapLambda((t) => "|planet| => {{planet}}"),
+  'Interpolation - Multiple Calls':
+      new _DummyCallableWithState(), //function() { return (g=(function(){return this})()).calls=(g.calls||0)+1 }
+  'Escaping': wrapLambda((t) => '>'),
+  'Section': wrapLambda((txt) => txt == "{{x}}" ? "yes" : "no"),
+  'Section - Expansion': wrapLambda((txt) => "$txt{{planet}}$txt"),
+  'Section - Alternate Delimiters':
+      wrapLambda((txt) => "$txt{{planet}} => |planet|$txt"),
+  'Section - Multiple Calls': wrapLambda((t) => "__${t}__"),
+  'Inverted Section': wrapLambda((txt) => false)
 };
diff --git a/test/mustache_test.dart b/test/mustache_test.dart
index caa2208..10dd19a 100644
--- a/test/mustache_test.dart
+++ b/test/mustache_test.dart
@@ -12,76 +12,80 @@
 const VALUE_MISSING = 'Value was missing';
 const UNCLOSED_TAG = 'Unclosed tag';
 
-Template parse(String source, {bool lenient: false})
-  => new Template(source, lenient: lenient);
+Template parse(String source, {bool lenient: false}) =>
+    new Template(source, lenient: lenient);
 
 main() {
-	group('Basic', () {
-		test('Variable', () {
-			var output = parse('_{{var}}_')
-				.renderString({"var": "bob"});
-			expect(output, equals('_bob_'));
-		});
-		test('Comment', () {
-			var output = parse('_{{! i am a\n comment ! }}_').renderString({});
-			expect(output, equals('__'));
-		});
-	});
-	group('Section', () {
-		test('Map', () {
-			var output = parse('{{#section}}_{{var}}_{{/section}}')
-				.renderString({"section": {"var": "bob"}});
-			expect(output, equals('_bob_'));
-		});
-		test('List', () {
-			var output = parse('{{#section}}_{{var}}_{{/section}}')
-				.renderString({"section": [{"var": "bob"}, {"var": "jim"}]});
-			expect(output, equals('_bob__jim_'));
-		});
-		test('Empty List', () {
-			var output = parse('{{#section}}_{{var}}_{{/section}}')
-				.renderString({"section": []});
-			expect(output, equals(''));
-		});
-		test('False', () {
-			var output = parse('{{#section}}_{{var}}_{{/section}}')
-				.renderString({"section": false});
-			expect(output, equals(''));
-		});
-		test('Invalid value', () {
-			var ex = renderFail(
-				'{{#section}}_{{var}}_{{/section}}',
-				{"section": 42});
-			expect(ex is TemplateException, isTrue);
-			expect(ex.message, startsWith(BAD_VALUE_SECTION));
-		});
-		test('Invalid value - lenient mode', () {
-			var output = parse('{{#var}}_{{var}}_{{/var}}', lenient: true)
-          .renderString({'var' : 42});
-			expect(output, equals('_42_'));
-		});
+  group('Basic', () {
+    test('Variable', () {
+      var output = parse('_{{var}}_').renderString({"var": "bob"});
+      expect(output, equals('_bob_'));
+    });
+    test('Comment', () {
+      var output = parse('_{{! i am a\n comment ! }}_').renderString({});
+      expect(output, equals('__'));
+    });
+  });
+  group('Section', () {
+    test('Map', () {
+      var output = parse('{{#section}}_{{var}}_{{/section}}').renderString({
+        "section": {"var": "bob"}
+      });
+      expect(output, equals('_bob_'));
+    });
+    test('List', () {
+      var output = parse('{{#section}}_{{var}}_{{/section}}').renderString({
+        "section": [
+          {"var": "bob"},
+          {"var": "jim"}
+        ]
+      });
+      expect(output, equals('_bob__jim_'));
+    });
+    test('Empty List', () {
+      var output = parse('{{#section}}_{{var}}_{{/section}}')
+          .renderString({"section": []});
+      expect(output, equals(''));
+    });
+    test('False', () {
+      var output = parse('{{#section}}_{{var}}_{{/section}}')
+          .renderString({"section": false});
+      expect(output, equals(''));
+    });
+    test('Invalid value', () {
+      var ex = renderFail('{{#section}}_{{var}}_{{/section}}', {"section": 42});
+      expect(ex is TemplateException, isTrue);
+      expect(ex.message, startsWith(BAD_VALUE_SECTION));
+    });
+    test('Invalid value - lenient mode', () {
+      var output = parse('{{#var}}_{{var}}_{{/var}}', lenient: true)
+          .renderString({'var': 42});
+      expect(output, equals('_42_'));
+    });
 
-		test('True', () {
-			var output = parse('{{#section}}_ok_{{/section}}')
-				.renderString({"section": true});
-			expect(output, equals('_ok_'));
-		});
+    test('True', () {
+      var output =
+          parse('{{#section}}_ok_{{/section}}').renderString({"section": true});
+      expect(output, equals('_ok_'));
+    });
 
-		test('Nested', () {
-			var output = parse('{{#section}}.{{var}}.{{#nested}}_{{nestedvar}}_{{/nested}}.{{/section}}')
-				.renderString({"section": {
-					"var": "bob",
-					"nested": [
-						{"nestedvar": "jim"},
-						{"nestedvar": "sally"}
-					]
-				}});
-			expect(output, equals('.bob._jim__sally_.'));
-		});
+    test('Nested', () {
+      var output = parse(
+              '{{#section}}.{{var}}.{{#nested}}_{{nestedvar}}_{{/nested}}.{{/section}}')
+          .renderString({
+        "section": {
+          "var": "bob",
+          "nested": [
+            {"nestedvar": "jim"},
+            {"nestedvar": "sally"}
+          ]
+        }
+      });
+      expect(output, equals('.bob._jim__sally_.'));
+    });
 
     test('isNotEmpty', () {
-      var t = new Template(
-'''{{^ section }}
+      var t = new Template('''{{^ section }}
 Empty.
 {{/ section }}
 {{# section.isNotEmpty }}
@@ -92,66 +96,119 @@
   </ul>
 {{/ section.isNotEmpty }}
 ''');
-      expect(t.renderString({"section": [1, 2 ,3] }), equals(
-'''  <ul>
+      expect(
+          t.renderString({
+            "section": [1, 2, 3]
+          }),
+          equals('''  <ul>
     <li>1</li>
     <li>2</li>
     <li>3</li>
   </ul>
 '''));
-      expect(t.renderString({"section": [] }), equals('Empty.\n'));
+      expect(t.renderString({"section": []}), equals('Empty.\n'));
     });
 
-		test('Whitespace in section tags', () {
-      expect(parse('{{#foo.bar}}oi{{/foo.bar}}').renderString({'foo': {'bar': true}}), equals('oi'));
-      expect(parse('{{# foo.bar}}oi{{/foo.bar}}').renderString({'foo': {'bar': true}}), equals('oi'));
-      expect(parse('{{#foo.bar }}oi{{/foo.bar}}').renderString({'foo': {'bar': true}}), equals('oi'));
-      expect(parse('{{# foo.bar }}oi{{/foo.bar}}').renderString({'foo': {'bar': true}}), equals('oi'));
-      expect(parse('{{#foo.bar}}oi{{/ foo.bar}}').renderString({'foo': {'bar': true}}), equals('oi'));
-      expect(parse('{{#foo.bar}}oi{{/foo.bar }}').renderString({'foo': {'bar': true}}), equals('oi'));
-      expect(parse('{{#foo.bar}}oi{{/ foo.bar }}').renderString({'foo': {'bar': true}}), equals('oi'));
-      expect(parse('{{# foo.bar }}oi{{/ foo.bar }}').renderString({'foo': {'bar': true}}), equals('oi'));
-		});
+    test('Whitespace in section tags', () {
+      expect(
+          parse('{{#foo.bar}}oi{{/foo.bar}}').renderString({
+            'foo': {'bar': true}
+          }),
+          equals('oi'));
+      expect(
+          parse('{{# foo.bar}}oi{{/foo.bar}}').renderString({
+            'foo': {'bar': true}
+          }),
+          equals('oi'));
+      expect(
+          parse('{{#foo.bar }}oi{{/foo.bar}}').renderString({
+            'foo': {'bar': true}
+          }),
+          equals('oi'));
+      expect(
+          parse('{{# foo.bar }}oi{{/foo.bar}}').renderString({
+            'foo': {'bar': true}
+          }),
+          equals('oi'));
+      expect(
+          parse('{{#foo.bar}}oi{{/ foo.bar}}').renderString({
+            'foo': {'bar': true}
+          }),
+          equals('oi'));
+      expect(
+          parse('{{#foo.bar}}oi{{/foo.bar }}').renderString({
+            'foo': {'bar': true}
+          }),
+          equals('oi'));
+      expect(
+          parse('{{#foo.bar}}oi{{/ foo.bar }}').renderString({
+            'foo': {'bar': true}
+          }),
+          equals('oi'));
+      expect(
+          parse('{{# foo.bar }}oi{{/ foo.bar }}').renderString({
+            'foo': {'bar': true}
+          }),
+          equals('oi'));
+    });
 
     test('Whitespace in variable tags', () {
-      expect(parse('{{foo.bar}}').renderString({'foo': {'bar': true}}), equals('true'));
-      expect(parse('{{ foo.bar}}').renderString({'foo': {'bar': true}}), equals('true'));
-      expect(parse('{{foo.bar }}').renderString({'foo': {'bar': true}}), equals('true'));
-      expect(parse('{{ foo.bar }}').renderString({'foo': {'bar': true}}), equals('true'));
+      expect(
+          parse('{{foo.bar}}').renderString({
+            'foo': {'bar': true}
+          }),
+          equals('true'));
+      expect(
+          parse('{{ foo.bar}}').renderString({
+            'foo': {'bar': true}
+          }),
+          equals('true'));
+      expect(
+          parse('{{foo.bar }}').renderString({
+            'foo': {'bar': true}
+          }),
+          equals('true'));
+      expect(
+          parse('{{ foo.bar }}').renderString({
+            'foo': {'bar': true}
+          }),
+          equals('true'));
     });
 
-
-
     test('Odd whitespace in tags', () {
+      render(source, values, output) => expect(
+          parse(source, lenient: true).renderString(values), equals(output));
 
-      render(source, values, output)
-        => expect(parse(source, lenient: true)
-            .renderString(values), equals(output));
+      render("{{\t# foo}}oi{{\n/foo}}", {'foo': true}, 'oi');
 
       render(
-        "{{\t# foo}}oi{{\n/foo}}",
-        {'foo': true},
-        'oi');
+          "{{ # # foo }} {{ oi }} {{ / # foo }}",
+          {
+            '# foo': [
+              {'oi': 'OI!'}
+            ]
+          },
+          ' OI! ');
 
       render(
-        "{{ # # foo }} {{ oi }} {{ / # foo }}",
-        {'# foo': [{'oi': 'OI!'}]},
-        ' OI! ');
+          "{{ #foo }} {{ oi }} {{ /foo }}",
+          {
+            'foo': [
+              {'oi': 'OI!'}
+            ]
+          },
+          ' OI! ');
 
       render(
-        "{{ #foo }} {{ oi }} {{ /foo }}",
-        {'foo': [{'oi': 'OI!'}]},
-        ' OI! ');
+          "{{\t#foo }} {{ oi }} {{ /foo }}",
+          {
+            'foo': [
+              {'oi': 'OI!'}
+            ]
+          },
+          ' OI! ');
 
-      render(
-        "{{\t#foo }} {{ oi }} {{ /foo }}",
-        {'foo': [{'oi': 'OI!'}]},
-        ' OI! ');
-
-      render(
-        "{{{ #foo }}} {{{ /foo }}}",
-        {'#foo': 1, '/foo': 2},
-        '1 2');
+      render("{{{ #foo }}} {{{ /foo }}}", {'#foo': 1, '/foo': 2}, '1 2');
 
 // Invalid - I'm ok with that for now.
 //      render(
@@ -159,25 +216,13 @@
 //        {'{': 1},
 //        '1');
 
-      render(
-        "{{\nfoo}}",
-        {'foo': 'bar'},
-        'bar');
+      render("{{\nfoo}}", {'foo': 'bar'}, 'bar');
 
-      render(
-        "{{\tfoo}}",
-        {'foo': 'bar'},
-        'bar');
+      render("{{\tfoo}}", {'foo': 'bar'}, 'bar');
 
-      render(
-        "{{\t# foo}}oi{{\n/foo}}",
-        {'foo': true},
-        'oi');
+      render("{{\t# foo}}oi{{\n/foo}}", {'foo': true}, 'oi');
 
-      render(
-        "{{{\tfoo\t}}}",
-        {'foo': true},
-        'true');
+      render("{{{\tfoo\t}}}", {'foo': true}, 'true');
 
 //FIXME empty, or error in strict mode.
 //      render(
@@ -199,142 +244,146 @@
     test('Bad tag', () {
       expect(() => new Template('{{{ foo }|'), throwsException);
     });
+  });
 
-	});
+  group('Inverse Section', () {
+    test('Map', () {
+      var output = parse('{{^section}}_{{var}}_{{/section}}').renderString({
+        "section": {"var": "bob"}
+      });
+      expect(output, equals(''));
+    });
+    test('List', () {
+      var output = parse('{{^section}}_{{var}}_{{/section}}').renderString({
+        "section": [
+          {"var": "bob"},
+          {"var": "jim"}
+        ]
+      });
+      expect(output, equals(''));
+    });
+    test('Empty List', () {
+      var output =
+          parse('{{^section}}_ok_{{/section}}').renderString({"section": []});
+      expect(output, equals('_ok_'));
+    });
+    test('False', () {
+      var output = parse('{{^section}}_ok_{{/section}}')
+          .renderString({"section": false});
+      expect(output, equals('_ok_'));
+    });
+    test('Invalid value', () {
+      var ex = renderFail('{{^section}}_{{var}}_{{/section}}', {"section": 42});
+      expect(ex is TemplateException, isTrue);
+      expect(ex.message, startsWith(BAD_VALUE_INV_SECTION));
+    });
+    test('Invalid value - lenient mode', () {
+      var output = parse('{{^var}}_ok_{{/var}}', lenient: true)
+          .renderString({'var': 42});
+      expect(output, equals(''));
+    });
+    test('True', () {
+      var output =
+          parse('{{^section}}_ok_{{/section}}').renderString({"section": true});
+      expect(output, equals(''));
+    });
+  });
 
-	group('Inverse Section', () {
-		test('Map', () {
-			var output = parse('{{^section}}_{{var}}_{{/section}}')
-				.renderString({"section": {"var": "bob"}});
-			expect(output, equals(''));
-		});
-		test('List', () {
-			var output = parse('{{^section}}_{{var}}_{{/section}}')
-				.renderString({"section": [{"var": "bob"}, {"var": "jim"}]});
-			expect(output, equals(''));
-		});
-		test('Empty List', () {
-			var output = parse('{{^section}}_ok_{{/section}}')
-				.renderString({"section": []});
-			expect(output, equals('_ok_'));
-		});
-		test('False', () {
-			var output = parse('{{^section}}_ok_{{/section}}')
-				.renderString({"section": false});
-			expect(output, equals('_ok_'));
-		});
-		test('Invalid value', () {
-			var ex = renderFail(
-				'{{^section}}_{{var}}_{{/section}}',
-				{"section": 42});
-			expect(ex is TemplateException, isTrue);
-			expect(ex.message, startsWith(BAD_VALUE_INV_SECTION));
-		});
-		test('Invalid value - lenient mode', () {
-			var output = parse('{{^var}}_ok_{{/var}}', lenient: true)
-          .renderString({'var' : 42});
-			expect(output, equals(''));
-		});
-		test('True', () {
-			var output = parse('{{^section}}_ok_{{/section}}')
-				.renderString({"section": true});
-			expect(output, equals(''));
-		});
-	});
+  group('Html escape', () {
+    test('Escape at start', () {
+      var output = parse('_{{var}}_').renderString({"var": "&."});
+      expect(output, equals('_&amp;._'));
+    });
 
-	group('Html escape', () {
+    test('Escape at end', () {
+      var output = parse('_{{var}}_').renderString({"var": ".&"});
+      expect(output, equals('_.&amp;_'));
+    });
 
-		test('Escape at start', () {
-			var output = parse('_{{var}}_')
-				.renderString({"var": "&."});
-			expect(output, equals('_&amp;._'));
-		});
+    test('&', () {
+      var output = parse('_{{var}}_').renderString({"var": "&"});
+      expect(output, equals('_&amp;_'));
+    });
 
-		test('Escape at end', () {
-			var output = parse('_{{var}}_')
-				.renderString({"var": ".&"});
-			expect(output, equals('_.&amp;_'));
-		});
+    test('<', () {
+      var output = parse('_{{var}}_').renderString({"var": "<"});
+      expect(output, equals('_&lt;_'));
+    });
 
-		test('&', () {
-			var output = parse('_{{var}}_')
-				.renderString({"var": "&"});
-			expect(output, equals('_&amp;_'));
-		});
+    test('>', () {
+      var output = parse('_{{var}}_').renderString({"var": ">"});
+      expect(output, equals('_&gt;_'));
+    });
 
-		test('<', () {
-			var output = parse('_{{var}}_')
-				.renderString({"var": "<"});
-			expect(output, equals('_&lt;_'));
-		});
+    test('"', () {
+      var output = parse('_{{var}}_').renderString({"var": '"'});
+      expect(output, equals('_&quot;_'));
+    });
 
-		test('>', () {
-			var output = parse('_{{var}}_')
-				.renderString({"var": ">"});
-			expect(output, equals('_&gt;_'));
-		});
+    test("'", () {
+      var output = parse('_{{var}}_').renderString({"var": "'"});
+      expect(output, equals('_&#x27;_'));
+    });
 
-		test('"', () {
-			var output = parse('_{{var}}_')
-				.renderString({"var": '"'});
-			expect(output, equals('_&quot;_'));
-		});
+    test("/", () {
+      var output = parse('_{{var}}_').renderString({"var": "/"});
+      expect(output, equals('_&#x2F;_'));
+    });
+  });
 
-		test("'", () {
-			var output = parse('_{{var}}_')
-				.renderString({"var": "'"});
-			expect(output, equals('_&#x27;_'));
-		});
+  group('Invalid format', () {
+    test('Mismatched tag', () {
+      var source = '{{#section}}_{{var}}_{{/notsection}}';
+      var ex = renderFail(source, {
+        "section": {"var": "bob"}
+      });
+      expectFail(ex, 1, 22, 'Mismatched tag');
+    });
 
-		test("/", () {
-			var output = parse('_{{var}}_')
-				.renderString({"var": "/"});
-			expect(output, equals('_&#x2F;_'));
-		});
+    test('Unexpected EOF', () {
+      var source = '{{#section}}_{{var}}_{{/section';
+      var ex = renderFail(source, {
+        "section": {"var": "bob"}
+      });
+      expectFail(ex, 1, 31, UNEXPECTED_EOF);
+    });
 
-	});
+    test('Bad tag name, open section', () {
+      var source = r'{{#section$%$^%}}_{{var}}_{{/section}}';
+      var ex = renderFail(source, {
+        "section": {"var": "bob"}
+      });
+      expectFail(ex, null, null, BAD_TAG_NAME);
+    });
 
-	group('Invalid format', () {
-		test('Mismatched tag', () {
-			var source = '{{#section}}_{{var}}_{{/notsection}}';
-			var ex = renderFail(source, {"section": {"var": "bob"}});
-			expectFail(ex, 1, 22, 'Mismatched tag');
-		});
+    test('Bad tag name, close section', () {
+      var source = r'{{#section}}_{{var}}_{{/section$%$^%}}';
+      var ex = renderFail(source, {
+        "section": {"var": "bob"}
+      });
+      expectFail(ex, null, null, BAD_TAG_NAME);
+    });
 
-		test('Unexpected EOF', () {
-			var source = '{{#section}}_{{var}}_{{/section';
-			var ex = renderFail(source, {"section": {"var": "bob"}});
-			expectFail(ex, 1, 31, UNEXPECTED_EOF);
-		});
+    test('Bad tag name, variable', () {
+      var source = r'{{#section}}_{{var$%$^%}}_{{/section}}';
+      var ex = renderFail(source, {
+        "section": {"var": "bob"}
+      });
+      expectFail(ex, null, null, BAD_TAG_NAME);
+    });
 
-		test('Bad tag name, open section', () {
-			var source = r'{{#section$%$^%}}_{{var}}_{{/section}}';
-			var ex = renderFail(source, {"section": {"var": "bob"}});
-			expectFail(ex, null, null, BAD_TAG_NAME);
-		});
-
-		test('Bad tag name, close section', () {
-			var source = r'{{#section}}_{{var}}_{{/section$%$^%}}';
-			var ex = renderFail(source, {"section": {"var": "bob"}});
-			expectFail(ex, null, null, BAD_TAG_NAME);
-		});
-
-		test('Bad tag name, variable', () {
-			var source = r'{{#section}}_{{var$%$^%}}_{{/section}}';
-			var ex = renderFail(source, {"section": {"var": "bob"}});
-			expectFail(ex, null, null, BAD_TAG_NAME);
-		});
-
-		test('Missing variable', () {
+    test('Missing variable', () {
       var source = r'{{#section}}_{{var}}_{{/section}}';
       var ex = renderFail(source, {"section": {}});
       expectFail(ex, null, null, VALUE_MISSING);
-		});
+    });
 
-		// Null variables shouldn't be a problem.
+    // Null variables shouldn't be a problem.
     test('Null variable', () {
       var t = new Template('{{#section}}_{{var}}_{{/section}}');
-      var output = t.renderString({"section": {'var': null}});
+      var output = t.renderString({
+        "section": {'var': null}
+      });
       expect(output, equals('__'));
     });
 
@@ -343,33 +392,38 @@
       var ex = renderFail(source, {"section": {}});
       expectFail(ex, null, null, UNCLOSED_TAG);
     });
+  });
 
-	});
-
-	group('Lenient', () {
-		test('Odd section name', () {
-			var output = parse(r'{{#section$%$^%}}_{{var}}_{{/section$%$^%}}', lenient: true)
-				.renderString({r'section$%$^%': {'var': 'bob'}});
-			expect(output, equals('_bob_'));
-		});
-
-		test('Odd variable name', () {
-			var output = parse(r'{{#section}}_{{var$%$^%}}_{{/section}}', lenient: true)
-				.renderString({'section': {r'var$%$^%': 'bob'}});
+  group('Lenient', () {
+    test('Odd section name', () {
+      var output = parse(r'{{#section$%$^%}}_{{var}}_{{/section$%$^%}}',
+          lenient: true).renderString({
+        r'section$%$^%': {'var': 'bob'}
+      });
       expect(output, equals('_bob_'));
-		});
+    });
 
-		test('Null variable', () {
-			var output = parse(r'{{#section}}_{{var}}_{{/section}}', lenient: true)
-				.renderString({'section': {'var': null}});
-			expect(output, equals('__'));
-		});
+    test('Odd variable name', () {
+      var output = parse(r'{{#section}}_{{var$%$^%}}_{{/section}}',
+          lenient: true).renderString({
+        'section': {r'var$%$^%': 'bob'}
+      });
+      expect(output, equals('_bob_'));
+    });
 
-		test('Null section', () {
-			var output = parse('{{#section}}_{{var}}_{{/section}}', lenient: true)
-				.renderString({"section": null});
-			expect(output, equals(''));
-		});
+    test('Null variable', () {
+      var output = parse(r'{{#section}}_{{var}}_{{/section}}', lenient: true)
+          .renderString({
+        'section': {'var': null}
+      });
+      expect(output, equals('__'));
+    });
+
+    test('Null section', () {
+      var output = parse('{{#section}}_{{var}}_{{/section}}', lenient: true)
+          .renderString({"section": null});
+      expect(output, equals(''));
+    });
 
 // Known failure
 //		test('Null inverse section', () {
@@ -377,51 +431,43 @@
 //				.renderString({"section": null}, lenient: true);
 //			expect(output, equals(''));
 //		});
+  });
 
-	});
+  group('Escape tags', () {
+    test('{{{ ... }}}', () {
+      var output = parse('{{{blah}}}').renderString({'blah': '&'});
+      expect(output, equals('&'));
+    });
+    test('{{& ... }}', () {
+      var output = parse('{{{blah}}}').renderString({'blah': '&'});
+      expect(output, equals('&'));
+    });
+  });
 
-	group('Escape tags', () {
-		test('{{{ ... }}}', () {
-			var output = parse('{{{blah}}}')
-				.renderString({'blah': '&'});
-			expect(output, equals('&'));
-		});
-		test('{{& ... }}', () {
-			var output = parse('{{{blah}}}')
-				.renderString({'blah': '&'});
-			expect(output, equals('&'));
-		});
-	});
-
-	group('Partial tag', () {
-
-	  String _partialTest(Map values, Map sources, String renderTemplate, {bool lenient: false}) {
-	    var templates = new Map<String, Template>();
-	    var resolver = (name) => templates[name];
-	    for (var k in sources.keys) {
-	      templates[k] = new Template(sources[k],
-	          name: k, lenient: lenient, partialResolver: resolver);
-	    }
-	    var t = resolver(renderTemplate);
-	    return t.renderString(values);
-	  }
+  group('Partial tag', () {
+    String _partialTest(Map values, Map sources, String renderTemplate,
+        {bool lenient: false}) {
+      var templates = new Map<String, Template>();
+      var resolver = (name) => templates[name];
+      for (var k in sources.keys) {
+        templates[k] = new Template(sources[k],
+            name: k, lenient: lenient, partialResolver: resolver);
+      }
+      var t = resolver(renderTemplate);
+      return t.renderString(values);
+    }
 
     test('basic', () {
-      var output = _partialTest(
-          {'foo': 'bar'},
-          {'root': '{{>partial}}', 'partial': '{{foo}}'},
-          'root');
+      var output = _partialTest({'foo': 'bar'},
+          {'root': '{{>partial}}', 'partial': '{{foo}}'}, 'root');
       expect(output, 'bar');
     });
 
     test('missing partial strict', () {
       var threw = false;
       try {
-        _partialTest(
-          {'foo': 'bar'},
-          {'root': '{{>partial}}'},
-          'root',
-          lenient: false);
+        _partialTest({'foo': 'bar'}, {'root': '{{>partial}}'}, 'root',
+            lenient: false);
       } catch (e) {
         expect(e is TemplateException, isTrue);
         threw = true;
@@ -431,61 +477,55 @@
 
     test('missing partial lenient', () {
       var output = _partialTest(
-          {'foo': 'bar'},
-          {'root': '{{>partial}}'},
-          'root',
+          {'foo': 'bar'}, {'root': '{{>partial}}'}, 'root',
           lenient: true);
       expect(output, equals(''));
     });
 
     test('context', () {
-      var output = _partialTest(
-          {'text': 'content'},
-          {'root': '"{{>partial}}"',
-            'partial': '*{{text}}*'},
-          'root',
-          lenient: true);
+      var output = _partialTest({
+        'text': 'content'
+      }, {
+        'root': '"{{>partial}}"',
+        'partial': '*{{text}}*'
+      }, 'root', lenient: true);
       expect(output, equals('"*content*"'));
     });
 
     test('recursion', () {
-      var output = _partialTest(
-          { 'content': "X", 'nodes': [ { 'content': "Y", 'nodes': [] } ] },
-          {'root': '{{>node}}',
-            'node': '{{content}}<{{#nodes}}{{>node}}{{/nodes}}>'},
-          'root',
-          lenient: true);
+      var output = _partialTest({
+        'content': "X",
+        'nodes': [
+          {'content': "Y", 'nodes': []}
+        ]
+      }, {
+        'root': '{{>node}}',
+        'node': '{{content}}<{{#nodes}}{{>node}}{{/nodes}}>'
+      }, 'root', lenient: true);
       expect(output, equals('X<Y<>>'));
     });
 
-
     test('standalone without previous', () {
       var output = _partialTest(
-          { },
-          {'root':     '  {{>partial}}\n>',
-            'partial': '>\n>'},
-          'root',
+          {}, {'root': '  {{>partial}}\n>', 'partial': '>\n>'}, 'root',
           lenient: true);
       expect(output, equals('  >\n  >>'));
     });
 
-
     test('standalone indentation', () {
-      var output = _partialTest(
-          { 'content': "<\n->" },
-          {'root':     "\\\n {{>partial}}\n\/\n",
-            'partial': "|\n{{{content}}}\n|\n"},
-          'root',
-          lenient: true);
+      var output = _partialTest({
+        'content': "<\n->"
+      }, {
+        'root': "\\\n {{>partial}}\n\/\n",
+        'partial': "|\n{{{content}}}\n|\n"
+      }, 'root', lenient: true);
       expect(output, equals("\\\n |\n <\n->\n |\n\/\n"));
     });
-
-	});
+  });
 
   group('Lambdas', () {
-
-    _lambdaTest({template, lambda, output}) =>
-        expect(parse(template).renderString({'lambda': lambda}), equals(output));
+    _lambdaTest({template, lambda, output}) => expect(
+        parse(template).renderString({'lambda': lambda}), equals(output));
 
     test('basic', () {
       _lambdaTest(
@@ -518,12 +558,14 @@
 
     test("seth's use case", () {
       var template = '<{{#markdown}}{{content}}{{/markdown}}>';
-      var values = {'markdown': (ctx) => ctx.renderString().toLowerCase(), 'content': 'OI YOU!'};
+      var values = {
+        'markdown': (ctx) => ctx.renderString().toLowerCase(),
+        'content': 'OI YOU!'
+      };
       var output = '<oi you!>';
       expect(parse(template).renderString(values), equals(output));
     });
 
-
     test("Lambda v2", () {
       var template = '<{{#markdown}}{{content}}{{/markdown}}>';
       var values = {'markdown': (ctx) => ctx.source, 'content': 'OI YOU!'};
@@ -531,7 +573,6 @@
       expect(parse(template).renderString(values), equals(output));
     });
 
-
     test("Lambda v2...", () {
       var template = '<{{#markdown}}dsfsf dsfsdf dfsdfsd{{/markdown}}>';
       var values = {'markdown': (ctx) => ctx.source};
@@ -540,15 +581,16 @@
     });
 
     test('Alternate Delimiters', () {
-
       // A lambda's return value should parse with the default delimiters.
 
       var template = '{{= | | =}}\nHello, (|&lambda|)!';
 
       //function() { return "|planet| => {{planet}}" }
-      var values = {'planet': 'world',
-                    'lambda': (LambdaContext ctx) => ctx.renderSource(
-                        '|planet| => {{planet}}') };
+      var values = {
+        'planet': 'world',
+        'lambda': (LambdaContext ctx) =>
+            ctx.renderSource('|planet| => {{planet}}')
+      };
 
       var output = 'Hello, (|planet| => world)!';
 
@@ -556,17 +598,17 @@
     });
 
     test('Alternate Delimiters 2', () {
-
       // Lambdas used for sections should parse with the current delimiters.
 
       var template = '{{= | | =}}<|#lambda|-|/lambda|>';
 
       //function() { return "|planet| => {{planet}}" }
-      var values = {'planet': 'Earth',
-                    'lambda': (LambdaContext ctx) {
-                      var txt = ctx.source;
-                      return ctx.renderSource('$txt{{planet}} => |planet|$txt');
-                     }
+      var values = {
+        'planet': 'Earth',
+        'lambda': (LambdaContext ctx) {
+          var txt = ctx.source;
+          return ctx.renderSource('$txt{{planet}} => |planet|$txt');
+        }
       };
 
       var output = '<-{{planet}} => Earth->';
@@ -586,57 +628,56 @@
       t.renderString({'foo': (lc) => lc2 = lc, 'bar': 'jim'});
       expect(() => lc2.lookup('foo'), throwsException);
     });
-
   });
 
-	group('Other', () {
-		test('Standalone line', () {
-			var val = parse('|\n{{#bob}}\n{{/bob}}\n|').renderString({'bob': []});
-			expect(val, equals('|\n|'));
-		});
-	});
+  group('Other', () {
+    test('Standalone line', () {
+      var val = parse('|\n{{#bob}}\n{{/bob}}\n|').renderString({'bob': []});
+      expect(val, equals('|\n|'));
+    });
+  });
 
-	group('Array indexing', () {
-		test('Basic', () {
-			var val = parse('{{array.1}}').renderString({'array': [1, 2, 3]});
-			expect(val, equals('2'));
-		});
-		test('RangeError', () {
-			var error = renderFail('{{array.5}}', {'array': [1, 2, 3]});
-			expect(error, isRangeError);
-		});
-	});
+  group('Array indexing', () {
+    test('Basic', () {
+      var val = parse('{{array.1}}').renderString({
+        'array': [1, 2, 3]
+      });
+      expect(val, equals('2'));
+    });
+    test('RangeError', () {
+      var error = renderFail('{{array.5}}', {
+        'array': [1, 2, 3]
+      });
+      expect(error, isRangeError);
+    });
+  });
 
-	group('Mirrors', () {
+  group('Mirrors', () {
     test('Simple field', () {
-      var output = parse('_{{bar}}_')
-        .renderString(new Foo()..bar = 'bob');
+      var output = parse('_{{bar}}_').renderString(new Foo()..bar = 'bob');
       expect(output, equals('_bob_'));
     });
 
     test('Simple field', () {
-      var output = parse('_{{jim}}_')
-        .renderString(new Foo());
+      var output = parse('_{{jim}}_').renderString(new Foo());
       expect(output, equals('_bob_'));
     });
 
     test('Lambda', () {
-      var output = parse('_{{lambda}}_')
-        .renderString(new Foo()..lambda = (_) => 'yo');
+      var output =
+          parse('_{{lambda}}_').renderString(new Foo()..lambda = (_) => 'yo');
       expect(output, equals('_yo_'));
     });
   });
 
   group('Delimiters', () {
     test('Basic', () {
-      var val = parse('{{=<% %>=}}(<%text%>)')
-          .renderString({'text': 'Hey!'});
+      var val = parse('{{=<% %>=}}(<%text%>)').renderString({'text': 'Hey!'});
       expect(val, equals('(Hey!)'));
     });
 
     test('Single delimiters', () {
-      var val = parse('({{=[ ]=}}[text])')
-          .renderString({'text': 'It worked!'});
+      var val = parse('({{=[ ]=}}[text])').renderString({'text': 'It worked!'});
       expect(val, equals('(It worked!)'));
     });
   });
@@ -650,82 +691,90 @@
   });
 
   group('Lambda context', () {
-
     test("LambdaContext write", () {
       var template = '<{{#markdown}}{{content}}{{/markdown}}>';
-      var values = {'markdown': (ctx) {
-        ctx.write('foo');
-      }};
+      var values = {
+        'markdown': (ctx) {
+          ctx.write('foo');
+        }
+      };
       var output = '<foo>';
       expect(parse(template).renderString(values), equals(output));
     });
 
     test("LambdaContext render", () {
       var template = '<{{#markdown}}{{content}}{{/markdown}}>';
-      var values = {'content': 'bar', 'markdown': (ctx) {
-        ctx.render();
-      }};
+      var values = {
+        'content': 'bar',
+        'markdown': (ctx) {
+          ctx.render();
+        }
+      };
       var output = '<bar>';
       expect(parse(template).renderString(values), equals(output));
     });
 
     test("LambdaContext render with value", () {
       var template = '<{{#markdown}}{{content}}{{/markdown}}>';
-      var values = {'markdown': (LambdaContext ctx) {
-        ctx.render(value: {'content': 'oi!'});
-      }};
+      var values = {
+        'markdown': (LambdaContext ctx) {
+          ctx.render(value: {'content': 'oi!'});
+        }
+      };
       var output = '<oi!>';
       expect(parse(template).renderString(values), equals(output));
     });
 
     test("LambdaContext renderString with value", () {
       var template = '<{{#markdown}}{{content}}{{/markdown}}>';
-      var values = {'markdown': (LambdaContext ctx) {
-        return ctx.renderString(value: {'content': 'oi!'});
-      }};
+      var values = {
+        'markdown': (LambdaContext ctx) {
+          return ctx.renderString(value: {'content': 'oi!'});
+        }
+      };
       var output = '<oi!>';
       expect(parse(template).renderString(values), equals(output));
     });
 
     test("LambdaContext write and return", () {
       var template = '<{{#markdown}}{{content}}{{/markdown}}>';
-      var values = {'markdown': (LambdaContext ctx) {
-        ctx.write('foo');
-        return 'bar';
-      }};
+      var values = {
+        'markdown': (LambdaContext ctx) {
+          ctx.write('foo');
+          return 'bar';
+        }
+      };
       var output = '<foobar>';
       expect(parse(template).renderString(values), equals(output));
     });
 
     test("LambdaContext renderSource with value", () {
       var template = '<{{#markdown}}{{content}}{{/markdown}}>';
-      var values = {'markdown': (LambdaContext ctx) {
-        return ctx.renderSource(ctx.source, value: {'content': 'oi!'});
-      }};
+      var values = {
+        'markdown': (LambdaContext ctx) {
+          return ctx.renderSource(ctx.source, value: {'content': 'oi!'});
+        }
+      };
       var output = '<oi!>';
       expect(parse(template).renderString(values), equals(output));
     });
-
   });
 }
 
 renderFail(source, values) {
-	try {
-		parse(source).renderString(values);
-		return null;
-	} catch (e) {
-		return e;
-	}
+  try {
+    parse(source).renderString(values);
+    return null;
+  } catch (e) {
+    return e;
+  }
 }
 
 expectFail(ex, int line, int column, [String msgStartsWith]) {
-		expect(ex is TemplateException, isTrue);
-		if (line != null)
-			expect(ex.line, equals(line));
-		if (column != null)
-			expect(ex.column, equals(column));
-		if (msgStartsWith != null)
-			expect(ex.message, startsWith(msgStartsWith));
+  expect(ex is TemplateException, isTrue);
+  if (line != null) expect(ex.line, equals(line));
+  if (column != null) expect(ex.column, equals(column));
+  if (msgStartsWith != null) expect(ex.message, startsWith(msgStartsWith));
 }
 
 class Foo {
diff --git a/test/parser_test.dart b/test/parser_test.dart
index 8554348..9600042 100644
--- a/test/parser_test.dart
+++ b/test/parser_test.dart
@@ -7,18 +7,16 @@
 import 'package:mustache/src/token.dart';
 
 main() {
-    
   group('Scanner', () {
-
     test('scan text', () {
       var source = 'abc';
       var scanner = new Scanner(source, 'foo', '{{ }}', lenient: false);
       var tokens = scanner.scan();
-      expectTokens(tokens, [ new Token(TokenType.text, 'abc', 0, 3)]);
+      expectTokens(tokens, [new Token(TokenType.text, 'abc', 0, 3)]);
     });
-    
+
     test('scan tag', () {
-      var source = 'abc{{foo}}def';     
+      var source = 'abc{{foo}}def';
       var scanner = new Scanner(source, 'foo', '{{ }}', lenient: false);
       var tokens = scanner.scan();
       expectTokens(tokens, [
@@ -29,84 +27,83 @@
         new Token(TokenType.text, 'def', 10, 13)
       ]);
     });
-     
-   test('scan tag whitespace', () {
-     var source = 'abc{{ foo }}def';
-     var scanner = new Scanner(source, 'foo', '{{ }}', lenient: false);
-     var tokens = scanner.scan();
-     expectTokens(tokens, [
-       new Token(TokenType.text, 'abc', 0, 3),
-       new Token(TokenType.openDelimiter, '{{', 3, 5),
-       new Token(TokenType.whitespace, ' ', 5, 6),
-       new Token(TokenType.identifier, 'foo', 6, 9),
-       new Token(TokenType.whitespace, ' ', 9, 10),
-       new Token(TokenType.closeDelimiter, '}}', 10, 12),
-       new Token(TokenType.text, 'def', 12, 15)
-     ]);
-   });
-   
-   test('scan tag sigil', () {
-     var source = 'abc{{ # foo }}def';
-     var scanner = new Scanner(source, 'foo', '{{ }}', lenient: false);
-     var tokens = scanner.scan();
-     expectTokens(tokens, [
-       new Token(TokenType.text, 'abc', 0, 3),
-       new Token(TokenType.openDelimiter, '{{', 3, 5),
-       new Token(TokenType.whitespace, ' ', 5, 6),
-       new Token(TokenType.sigil, '#', 6, 7),
-       new Token(TokenType.whitespace, ' ', 7, 8),
-       new Token(TokenType.identifier, 'foo', 8, 11),
-       new Token(TokenType.whitespace, ' ', 11, 12),
-       new Token(TokenType.closeDelimiter, '}}', 12, 14),
-       new Token(TokenType.text, 'def', 14, 17)
-     ]);
-   });
 
-   test('scan tag dot', () {
-     var source = 'abc{{ foo.bar }}def';
-     var scanner = new Scanner(source, 'foo', '{{ }}', lenient: false);
-     var tokens = scanner.scan();
-     expectTokens(tokens, [
-       new Token(TokenType.text, 'abc', 0, 3),
-       new Token(TokenType.openDelimiter, '{{', 3, 5),
-       new Token(TokenType.whitespace, ' ', 5, 6),
-       new Token(TokenType.identifier, 'foo', 6, 9),
-       new Token(TokenType.dot, '.', 9, 10),
-       new Token(TokenType.identifier, 'bar', 10, 13),
-       new Token(TokenType.whitespace, ' ', 13, 14),
-       new Token(TokenType.closeDelimiter, '}}', 14, 16),
-       new Token(TokenType.text, 'def', 16, 19)
-     ]);
-   });
+    test('scan tag whitespace', () {
+      var source = 'abc{{ foo }}def';
+      var scanner = new Scanner(source, 'foo', '{{ }}', lenient: false);
+      var tokens = scanner.scan();
+      expectTokens(tokens, [
+        new Token(TokenType.text, 'abc', 0, 3),
+        new Token(TokenType.openDelimiter, '{{', 3, 5),
+        new Token(TokenType.whitespace, ' ', 5, 6),
+        new Token(TokenType.identifier, 'foo', 6, 9),
+        new Token(TokenType.whitespace, ' ', 9, 10),
+        new Token(TokenType.closeDelimiter, '}}', 10, 12),
+        new Token(TokenType.text, 'def', 12, 15)
+      ]);
+    });
 
-   test('scan triple mustache', () {
-     var source = 'abc{{{foo}}}def';     
-     var scanner = new Scanner(source, 'foo', '{{ }}', lenient: false);
-     var tokens = scanner.scan();
-     expectTokens(tokens, [
-       new Token(TokenType.text, 'abc', 0, 3),
-       new Token(TokenType.openDelimiter, '{{{', 3, 6),
-       new Token(TokenType.identifier, 'foo', 6, 9),
-       new Token(TokenType.closeDelimiter, '}}}', 9, 12),
-       new Token(TokenType.text, 'def', 12, 15)
-     ]);
-   });
+    test('scan tag sigil', () {
+      var source = 'abc{{ # foo }}def';
+      var scanner = new Scanner(source, 'foo', '{{ }}', lenient: false);
+      var tokens = scanner.scan();
+      expectTokens(tokens, [
+        new Token(TokenType.text, 'abc', 0, 3),
+        new Token(TokenType.openDelimiter, '{{', 3, 5),
+        new Token(TokenType.whitespace, ' ', 5, 6),
+        new Token(TokenType.sigil, '#', 6, 7),
+        new Token(TokenType.whitespace, ' ', 7, 8),
+        new Token(TokenType.identifier, 'foo', 8, 11),
+        new Token(TokenType.whitespace, ' ', 11, 12),
+        new Token(TokenType.closeDelimiter, '}}', 12, 14),
+        new Token(TokenType.text, 'def', 14, 17)
+      ]);
+    });
 
-   
-   test('scan triple mustache whitespace', () {
-     var source = 'abc{{{ foo }}}def';
-     var scanner = new Scanner(source, 'foo', '{{ }}', lenient: false);
-     var tokens = scanner.scan();
-     expectTokens(tokens, [
-       new Token(TokenType.text, 'abc', 0, 3),
-       new Token(TokenType.openDelimiter, '{{{', 3, 6),
-       new Token(TokenType.whitespace, ' ', 6, 7),
-       new Token(TokenType.identifier, 'foo', 7, 10),
-       new Token(TokenType.whitespace, ' ', 10, 11),
-       new Token(TokenType.closeDelimiter, '}}}', 11, 14),
-       new Token(TokenType.text, 'def', 14, 17)
-     ]);
-   });
+    test('scan tag dot', () {
+      var source = 'abc{{ foo.bar }}def';
+      var scanner = new Scanner(source, 'foo', '{{ }}', lenient: false);
+      var tokens = scanner.scan();
+      expectTokens(tokens, [
+        new Token(TokenType.text, 'abc', 0, 3),
+        new Token(TokenType.openDelimiter, '{{', 3, 5),
+        new Token(TokenType.whitespace, ' ', 5, 6),
+        new Token(TokenType.identifier, 'foo', 6, 9),
+        new Token(TokenType.dot, '.', 9, 10),
+        new Token(TokenType.identifier, 'bar', 10, 13),
+        new Token(TokenType.whitespace, ' ', 13, 14),
+        new Token(TokenType.closeDelimiter, '}}', 14, 16),
+        new Token(TokenType.text, 'def', 16, 19)
+      ]);
+    });
+
+    test('scan triple mustache', () {
+      var source = 'abc{{{foo}}}def';
+      var scanner = new Scanner(source, 'foo', '{{ }}', lenient: false);
+      var tokens = scanner.scan();
+      expectTokens(tokens, [
+        new Token(TokenType.text, 'abc', 0, 3),
+        new Token(TokenType.openDelimiter, '{{{', 3, 6),
+        new Token(TokenType.identifier, 'foo', 6, 9),
+        new Token(TokenType.closeDelimiter, '}}}', 9, 12),
+        new Token(TokenType.text, 'def', 12, 15)
+      ]);
+    });
+
+    test('scan triple mustache whitespace', () {
+      var source = 'abc{{{ foo }}}def';
+      var scanner = new Scanner(source, 'foo', '{{ }}', lenient: false);
+      var tokens = scanner.scan();
+      expectTokens(tokens, [
+        new Token(TokenType.text, 'abc', 0, 3),
+        new Token(TokenType.openDelimiter, '{{{', 3, 6),
+        new Token(TokenType.whitespace, ' ', 6, 7),
+        new Token(TokenType.identifier, 'foo', 7, 10),
+        new Token(TokenType.whitespace, ' ', 10, 11),
+        new Token(TokenType.closeDelimiter, '}}}', 11, 14),
+        new Token(TokenType.text, 'def', 14, 17)
+      ]);
+    });
 
     test('scan tag with equals', () {
       var source = '{{foo=bar}}';
@@ -130,272 +127,258 @@
         new Token(TokenType.closeDelimiter, '}}', 10, 12),
       ]);
     });
-
   });
-   
+
   group('Parser', () {
-    
-   test('parse variable', () {
-     var source = 'abc{{foo}}def';
-     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
-     var nodes = parser.parse();
-     expectNodes(nodes, [
-       new TextNode('abc', 0, 3),
-       new VariableNode('foo', 3, 10, escape: true),
-       new TextNode('def', 10, 13)
-     ]);
-   });
+    test('parse variable', () {
+      var source = 'abc{{foo}}def';
+      var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
+      var nodes = parser.parse();
+      expectNodes(nodes, [
+        new TextNode('abc', 0, 3),
+        new VariableNode('foo', 3, 10, escape: true),
+        new TextNode('def', 10, 13)
+      ]);
+    });
 
-   test('parse variable whitespace', () {
-     var source = 'abc{{ foo }}def';
-     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
-     var nodes = parser.parse();
-     expectNodes(nodes, [
-       new TextNode('abc', 0, 3),
-       new VariableNode('foo', 3, 12, escape: true),
-       new TextNode('def', 12, 15)
-     ]);
-   });
-   
-   test('parse section', () {
-     var source = 'abc{{#foo}}def{{/foo}}ghi';
-     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
-     var nodes = parser.parse();
-     expectNodes(nodes, [
-       new TextNode('abc', 0, 3),
-       new SectionNode('foo', 3, 11, '{{ }}'),
-       new TextNode('ghi', 22, 25)
-     ]);
-     expectNodes(nodes[1].children, [new TextNode('def', 11, 14)]);
-   });
+    test('parse variable whitespace', () {
+      var source = 'abc{{ foo }}def';
+      var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
+      var nodes = parser.parse();
+      expectNodes(nodes, [
+        new TextNode('abc', 0, 3),
+        new VariableNode('foo', 3, 12, escape: true),
+        new TextNode('def', 12, 15)
+      ]);
+    });
 
-   test('parse section standalone tag whitespace', () {
-     var source = 'abc\n{{#foo}}\ndef\n{{/foo}}\nghi';
-     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
-     var nodes = parser.parse();
-     expectNodes(nodes, [
-       new TextNode('abc\n', 0, 4),
-       new SectionNode('foo', 4, 12, '{{ }}'),
-       new TextNode('ghi', 26, 29)
-     ]);
-     expectNodes(nodes[1].children, [new TextNode('def\n', 13, 17)]);
-   });
+    test('parse section', () {
+      var source = 'abc{{#foo}}def{{/foo}}ghi';
+      var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
+      var nodes = parser.parse();
+      expectNodes(nodes, [
+        new TextNode('abc', 0, 3),
+        new SectionNode('foo', 3, 11, '{{ }}'),
+        new TextNode('ghi', 22, 25)
+      ]);
+      expectNodes(nodes[1].children, [new TextNode('def', 11, 14)]);
+    });
 
-   test('parse section standalone tag whitespace consecutive', () {
-     var source = 'abc\n{{#foo}}\ndef\n{{/foo}}\n{{#foo}}\ndef\n{{/foo}}\nghi';
-     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
-     var nodes = parser.parse();
-     expectNodes(nodes, [
-       new TextNode('abc\n', 0, 4),
-       new SectionNode('foo', 4, 12, '{{ }}'),
-       new SectionNode('foo', 26, 34, '{{ }}'),
-       new TextNode('ghi', 48, 51),
-     ]);
-     expectNodes(nodes[1].children, [new TextNode('def\n', 13, 17)]);
-   });
-   
-   test('parse section standalone tag whitespace on first line', () {
-     var source = '  {{#foo}}  \ndef\n{{/foo}}\nghi';
-     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
-     var nodes = parser.parse();
-     expectNodes(nodes, [
-       new SectionNode('foo', 2, 10, '{{ }}'),
-       new TextNode('ghi', 26, 29)
-     ]);
-     expectNodes(nodes[0].children, [new TextNode('def\n', 13, 17)]);
-   });
+    test('parse section standalone tag whitespace', () {
+      var source = 'abc\n{{#foo}}\ndef\n{{/foo}}\nghi';
+      var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
+      var nodes = parser.parse();
+      expectNodes(nodes, [
+        new TextNode('abc\n', 0, 4),
+        new SectionNode('foo', 4, 12, '{{ }}'),
+        new TextNode('ghi', 26, 29)
+      ]);
+      expectNodes(nodes[1].children, [new TextNode('def\n', 13, 17)]);
+    });
 
-   test('parse section standalone tag whitespace on last line', () {
-     var source = '{{#foo}}def\n  {{/foo}}  ';
-     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
-     var nodes = parser.parse();
-     expectNodes(nodes, [
-       new SectionNode('foo', 0, 8, '{{ }}')
-     ]);
-     expectNodes(nodes[0].children, [new TextNode('def\n', 8, 12)]);
-   });
-   
-   test('parse whitespace', () {
-     var source = 'abc\n   ';
-     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
-     var nodes = parser.parse();
-     expectNodes(nodes, [
-       new TextNode('abc\n   ', 0, 7),
-     ]);
-   });
-   
-   test('parse partial', () {
-     var source = 'abc\n   {{>foo}}def';
-     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
-     var nodes = parser.parse();
-     expectNodes(nodes, [
-       new TextNode('abc\n   ', 0, 7),
-       new PartialNode('foo', 7, 15, '   '),
-       new TextNode('def', 15, 18)
-     ]);
-   });
+    test('parse section standalone tag whitespace consecutive', () {
+      var source = 'abc\n{{#foo}}\ndef\n{{/foo}}\n{{#foo}}\ndef\n{{/foo}}\nghi';
+      var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
+      var nodes = parser.parse();
+      expectNodes(nodes, [
+        new TextNode('abc\n', 0, 4),
+        new SectionNode('foo', 4, 12, '{{ }}'),
+        new SectionNode('foo', 26, 34, '{{ }}'),
+        new TextNode('ghi', 48, 51),
+      ]);
+      expectNodes(nodes[1].children, [new TextNode('def\n', 13, 17)]);
+    });
 
-   test('parse change delimiters', () {
-     var source = '{{= | | =}}<|#lambda|-|/lambda|>';
-     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
-     var nodes = parser.parse();
-     expect(nodes[1].delimiters, equals('| |'));
-     expectNodes(nodes, [
-       new TextNode('<', 11, 12),
-       new SectionNode('lambda', 12, 21, '| |'),
-       new TextNode('>', 31, 32),
-     ]);
-     expectNodes(nodes[1].children, [new TextNode('-', 21, 22)]);
-   });   
-   
-   test('corner case strict', () {
-     var source = "{{{ #foo }}} {{{ /foo }}}";
-     var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
-     try {
-      parser.parse();
-      fail('Should fail.');
-     } catch (e) {
-       expect(e is TemplateException, isTrue);
-     }
-   });
+    test('parse section standalone tag whitespace on first line', () {
+      var source = '  {{#foo}}  \ndef\n{{/foo}}\nghi';
+      var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
+      var nodes = parser.parse();
+      expectNodes(nodes, [
+        new SectionNode('foo', 2, 10, '{{ }}'),
+        new TextNode('ghi', 26, 29)
+      ]);
+      expectNodes(nodes[0].children, [new TextNode('def\n', 13, 17)]);
+    });
 
-   test('corner case lenient', () {
-     var source = "{{{ #foo }}} {{{ /foo }}}";
-     var parser = new Parser(source, 'foo', '{{ }}', lenient: true);
-     var nodes = parser.parse();
-     expectNodes(nodes, [
-       new VariableNode('#foo', 0, 12, escape: false),
-       new TextNode(' ', 12, 13),
-       new VariableNode('/foo', 13, 25, escape: false)
-     ]);     
-   });
-   
-   test('toString', () {
-     new TextNode('foo', 1, 3).toString();
-     new VariableNode('foo', 1, 3).toString();
-     new PartialNode('foo', 1, 3, ' ').toString();
-     new SectionNode('foo', 1, 3, '{{ }}').toString();
-     new Token(TokenType.closeDelimiter, 'foo', 1, 3).toString();
-     TokenType.closeDelimiter.toString();
-   });
-   
-   test('exception', () {
-     var source = "'{{ foo }} sdfffffffffffffffffffffffffffffffffffffffffffff "
-         "dsfsdf sdfdsa fdsfads fsdfdsfadsf dsfasdfsdf sdfdsfsadf sdfadsfsdf ";
-       var ex = new TemplateException('boom!', 'foo.mustache', source, 2);
-       ex.toString();
-   });
-   
-  parseFail(source) {
-     try {
-       var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
-       parser.parse();
-       fail('Did not throw.');
-       return null;
-     } catch (ex, st) {
-       if (ex is! TemplateException) {
-        print(ex);
-        print(st);
-       }
-       return ex;
-     }
-   }
-   
-   test('parse eof', () {
-     expectTemplateEx(ex) => expect(ex is TemplateException, isTrue);
-     
-     expectTemplateEx(parseFail('{{#foo}}{{bar}}{{/foo}'));
-     expectTemplateEx(parseFail('{{#foo}}{{bar}}{{/foo'));
-     expectTemplateEx(parseFail('{{#foo}}{{bar}}{{/'));
-     expectTemplateEx(parseFail('{{#foo}}{{bar}}{{'));
-     expectTemplateEx(parseFail('{{#foo}}{{bar}}{'));
-     expectTemplateEx(parseFail('{{#foo}}{{bar}}'));
-     expectTemplateEx(parseFail('{{#foo}}{{bar}'));
-     expectTemplateEx(parseFail('{{#foo}}{{bar'));
-     expectTemplateEx(parseFail('{{#foo}}{{'));
-     expectTemplateEx(parseFail('{{#foo}}{'));
-     expectTemplateEx(parseFail('{{#foo}}'));
-     expectTemplateEx(parseFail('{{#foo}'));
-     expectTemplateEx(parseFail('{{#'));
-     expectTemplateEx(parseFail('{{'));
-     expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ / foo }'));
-     expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ / foo '));
-     expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ / foo'));
-     expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ / '));
-     expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ /'));
-     expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ '));
-     expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{'));
-     expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{'));
-     expectTemplateEx(parseFail('{{ # foo }}{{ bar }}'));
-     expectTemplateEx(parseFail('{{ # foo }}{{ bar }'));
-     expectTemplateEx(parseFail('{{ # foo }}{{ bar '));
-     expectTemplateEx(parseFail('{{ # foo }}{{ bar'));
-     expectTemplateEx(parseFail('{{ # foo }}{{ '));
-     expectTemplateEx(parseFail('{{ # foo }}{{'));
-     expectTemplateEx(parseFail('{{ # foo }}{'));
-     expectTemplateEx(parseFail('{{ # foo }}'));
-     expectTemplateEx(parseFail('{{ # foo }'));
-     expectTemplateEx(parseFail('{{ # foo '));
-     expectTemplateEx(parseFail('{{ # foo'));
-     expectTemplateEx(parseFail('{{ # '));
-     expectTemplateEx(parseFail('{{ #'));
-     expectTemplateEx(parseFail('{{ '));
-     expectTemplateEx(parseFail('{{'));
-     
-     expectTemplateEx(parseFail('{{= || || =}'));
-     expectTemplateEx(parseFail('{{= || || ='));
-     expectTemplateEx(parseFail('{{= || || '));
-     expectTemplateEx(parseFail('{{= || ||'));
-     expectTemplateEx(parseFail('{{= || |'));
-     expectTemplateEx(parseFail('{{= || '));
-     expectTemplateEx(parseFail('{{= ||'));
-     expectTemplateEx(parseFail('{{= |'));
-     expectTemplateEx(parseFail('{{= '));
-     expectTemplateEx(parseFail('{{='));
-   });
-   
+    test('parse section standalone tag whitespace on last line', () {
+      var source = '{{#foo}}def\n  {{/foo}}  ';
+      var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
+      var nodes = parser.parse();
+      expectNodes(nodes, [new SectionNode('foo', 0, 8, '{{ }}')]);
+      expectNodes(nodes[0].children, [new TextNode('def\n', 8, 12)]);
+    });
+
+    test('parse whitespace', () {
+      var source = 'abc\n   ';
+      var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
+      var nodes = parser.parse();
+      expectNodes(nodes, [new TextNode('abc\n   ', 0, 7),]);
+    });
+
+    test('parse partial', () {
+      var source = 'abc\n   {{>foo}}def';
+      var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
+      var nodes = parser.parse();
+      expectNodes(nodes, [
+        new TextNode('abc\n   ', 0, 7),
+        new PartialNode('foo', 7, 15, '   '),
+        new TextNode('def', 15, 18)
+      ]);
+    });
+
+    test('parse change delimiters', () {
+      var source = '{{= | | =}}<|#lambda|-|/lambda|>';
+      var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
+      var nodes = parser.parse();
+      expect(nodes[1].delimiters, equals('| |'));
+      expectNodes(nodes, [
+        new TextNode('<', 11, 12),
+        new SectionNode('lambda', 12, 21, '| |'),
+        new TextNode('>', 31, 32),
+      ]);
+      expectNodes(nodes[1].children, [new TextNode('-', 21, 22)]);
+    });
+
+    test('corner case strict', () {
+      var source = "{{{ #foo }}} {{{ /foo }}}";
+      var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
+      try {
+        parser.parse();
+        fail('Should fail.');
+      } catch (e) {
+        expect(e is TemplateException, isTrue);
+      }
+    });
+
+    test('corner case lenient', () {
+      var source = "{{{ #foo }}} {{{ /foo }}}";
+      var parser = new Parser(source, 'foo', '{{ }}', lenient: true);
+      var nodes = parser.parse();
+      expectNodes(nodes, [
+        new VariableNode('#foo', 0, 12, escape: false),
+        new TextNode(' ', 12, 13),
+        new VariableNode('/foo', 13, 25, escape: false)
+      ]);
+    });
+
+    test('toString', () {
+      new TextNode('foo', 1, 3).toString();
+      new VariableNode('foo', 1, 3).toString();
+      new PartialNode('foo', 1, 3, ' ').toString();
+      new SectionNode('foo', 1, 3, '{{ }}').toString();
+      new Token(TokenType.closeDelimiter, 'foo', 1, 3).toString();
+      TokenType.closeDelimiter.toString();
+    });
+
+    test('exception', () {
+      var source = "'{{ foo }} sdfffffffffffffffffffffffffffffffffffffffffffff "
+          "dsfsdf sdfdsa fdsfads fsdfdsfadsf dsfasdfsdf sdfdsfsadf sdfadsfsdf ";
+      var ex = new TemplateException('boom!', 'foo.mustache', source, 2);
+      ex.toString();
+    });
+
+    parseFail(source) {
+      try {
+        var parser = new Parser(source, 'foo', '{{ }}', lenient: false);
+        parser.parse();
+        fail('Did not throw.');
+        return null;
+      } catch (ex, st) {
+        if (ex is! TemplateException) {
+          print(ex);
+          print(st);
+        }
+        return ex;
+      }
+    }
+
+    test('parse eof', () {
+      expectTemplateEx(ex) => expect(ex is TemplateException, isTrue);
+
+      expectTemplateEx(parseFail('{{#foo}}{{bar}}{{/foo}'));
+      expectTemplateEx(parseFail('{{#foo}}{{bar}}{{/foo'));
+      expectTemplateEx(parseFail('{{#foo}}{{bar}}{{/'));
+      expectTemplateEx(parseFail('{{#foo}}{{bar}}{{'));
+      expectTemplateEx(parseFail('{{#foo}}{{bar}}{'));
+      expectTemplateEx(parseFail('{{#foo}}{{bar}}'));
+      expectTemplateEx(parseFail('{{#foo}}{{bar}'));
+      expectTemplateEx(parseFail('{{#foo}}{{bar'));
+      expectTemplateEx(parseFail('{{#foo}}{{'));
+      expectTemplateEx(parseFail('{{#foo}}{'));
+      expectTemplateEx(parseFail('{{#foo}}'));
+      expectTemplateEx(parseFail('{{#foo}'));
+      expectTemplateEx(parseFail('{{#'));
+      expectTemplateEx(parseFail('{{'));
+      expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ / foo }'));
+      expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ / foo '));
+      expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ / foo'));
+      expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ / '));
+      expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ /'));
+      expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{ '));
+      expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{{'));
+      expectTemplateEx(parseFail('{{ # foo }}{{ bar }}{'));
+      expectTemplateEx(parseFail('{{ # foo }}{{ bar }}'));
+      expectTemplateEx(parseFail('{{ # foo }}{{ bar }'));
+      expectTemplateEx(parseFail('{{ # foo }}{{ bar '));
+      expectTemplateEx(parseFail('{{ # foo }}{{ bar'));
+      expectTemplateEx(parseFail('{{ # foo }}{{ '));
+      expectTemplateEx(parseFail('{{ # foo }}{{'));
+      expectTemplateEx(parseFail('{{ # foo }}{'));
+      expectTemplateEx(parseFail('{{ # foo }}'));
+      expectTemplateEx(parseFail('{{ # foo }'));
+      expectTemplateEx(parseFail('{{ # foo '));
+      expectTemplateEx(parseFail('{{ # foo'));
+      expectTemplateEx(parseFail('{{ # '));
+      expectTemplateEx(parseFail('{{ #'));
+      expectTemplateEx(parseFail('{{ '));
+      expectTemplateEx(parseFail('{{'));
+
+      expectTemplateEx(parseFail('{{= || || =}'));
+      expectTemplateEx(parseFail('{{= || || ='));
+      expectTemplateEx(parseFail('{{= || || '));
+      expectTemplateEx(parseFail('{{= || ||'));
+      expectTemplateEx(parseFail('{{= || |'));
+      expectTemplateEx(parseFail('{{= || '));
+      expectTemplateEx(parseFail('{{= ||'));
+      expectTemplateEx(parseFail('{{= |'));
+      expectTemplateEx(parseFail('{{= '));
+      expectTemplateEx(parseFail('{{='));
+    });
   });
-  
 }
 
 nodeEqual(a, b) {
   if (a is TextNode) {
-    return b is TextNode
-        && a.text == b.text
-        && a.start == b.start
-        && a.end == b.end;
-  
+    return b is TextNode &&
+        a.text == b.text &&
+        a.start == b.start &&
+        a.end == b.end;
   } else if (a is VariableNode) {
-    return a is VariableNode
-        && a.name == b.name
-        && a.escape == b.escape
-        && a.start == b.start
-        && a.end == b.end;
-
+    return a is VariableNode &&
+        a.name == b.name &&
+        a.escape == b.escape &&
+        a.start == b.start &&
+        a.end == b.end;
   } else if (a is SectionNode) {
-    return a is SectionNode
-        && a.name == b.name
-        && a.delimiters == b.delimiters
-        && a.inverse == b.inverse
-        && a.start == b.start
-        && a.end == b.end;
-    
+    return a is SectionNode &&
+        a.name == b.name &&
+        a.delimiters == b.delimiters &&
+        a.inverse == b.inverse &&
+        a.start == b.start &&
+        a.end == b.end;
   } else if (a is PartialNode) {
-    return a is PartialNode
-        && a.name == b.name
-        && a.indent == b.indent;
-    
+    return a is PartialNode && a.name == b.name && a.indent == b.indent;
   } else {
     return false;
   }
 }
 
-tokenEqual(Token a, Token b) {    
-  return a is Token
-      && a.type == b.type
-      && a.value == b.value
-      && a.start == b.start
-      && a.end == b.end;
+tokenEqual(Token a, Token b) {
+  return a is Token &&
+      a.type == b.type &&
+      a.value == b.value &&
+      a.start == b.start &&
+      a.end == b.end;
 }
 
 expectTokens(List<Token> a, List<Token> b) {
