Set contentStart/End on SectionNode
diff --git a/lib/src/lambda_context.dart b/lib/src/lambda_context.dart
index 13f8f6a..465dc65 100644
--- a/lib/src/lambda_context.dart
+++ b/lib/src/lambda_context.dart
@@ -60,17 +60,15 @@
     
     if (_node is! SectionNode) return '';
     
-    var nodes = (_node as SectionNode).children;
+    SectionNode node = _node;
+    
+    var nodes = node.children;
     
     if (nodes.isEmpty) return '';
     
-    if (nodes.length == 1 && nodes.first is TextNode)
-      return nodes.first.text;
+    if (nodes.length == 1 && nodes.first is TextNode) return nodes.first.text;
     
-    var source = _context.source.substring(
-        _node.contentStart, _node.contentEnd);
-    
-    return source;
+    return _context.source.substring(node.contentStart, node.contentEnd);
   }
 
   /// Evaluate the string as a mustache template using the current context.
diff --git a/lib/src/node.dart b/lib/src/node.dart
index 5228486..670f453 100644
--- a/lib/src/node.dart
+++ b/lib/src/node.dart
@@ -33,11 +33,7 @@
   // or inverse section, then this stores the start of the content of the
   // section.
   final int start;
-  final int end;
-  
-  int contentStart;
-  int contentEnd;
-  
+  final int end;  
 }
 
 
@@ -157,16 +153,17 @@
   
   SectionNode(this.name, int start, int end, this.delimiters,
       {this.inverse: false})
-    : super(start, end);
+    : contentStart = end,
+      super(start, end);
   
   final String name;
   final String delimiters;
   final bool inverse;
-  int contentStart;
-  int contentEnd;
+  final int contentStart;
+  int contentEnd; // Set in parser when close tag is parsed.
   final List<Node> children = <Node>[];
 
-  toString() => '(SectionNode $name inverse: $inverse)';
+  toString() => '(SectionNode $name inverse: $inverse $start $end)';
   
   // TODO Only used for testing.
   //FIXME use deepequals in test for comparing children.
@@ -175,7 +172,8 @@
       && name == o.name
       && delimiters == o.delimiters
       && inverse == o.inverse
-      && contentStart == o.contentEnd;
+      && start == o.start
+      && end == o.end;
   
   // TODO hashcode. import quiver.
 
diff --git a/lib/src/parser.dart b/lib/src/parser.dart
index cd55bce..68c330c 100644
--- a/lib/src/parser.dart
+++ b/lib/src/parser.dart
@@ -96,9 +96,10 @@
       // Close section tag
       case '/':
         if (tag.name != _stack.last.name) throw 'boom!'; //TODO error message.
-        _stack.removeLast();
-        break;
-      
+        var node = _stack.removeLast();
+        node.contentEnd = tag.start;
+        break;        
+        
       default:
         if (node != null) _stack.last.children.add(node);
     }
@@ -113,7 +114,10 @@
     _currentDelimiters = _delimiters;
     
     _stack.add(new SectionNode('root', 0, 0, _delimiters));    
-        
+  
+    // Handle standalone tag on first line.
+    _parseLine();
+    
     for (var token = _peek(); token != null; token = _peek()) {
       switch(token.type) {
         
@@ -134,8 +138,6 @@
           _currentDelimiters = token.value;
           break;
           
-        //TODO think about this. It looks like this loop will usually just call
-        // into parseLine(). May be able to simplify the logic.
         case TokenType.lineEnd:
           //TODO the first line can be a standalone line too, and there is
           // no lineEnd. Perhaps _parseLine(firstLine: true)?
@@ -168,8 +170,11 @@
     //TODO handle EOFs. i.e. check for null return from peek.
     //TODO make this EOF handling clearer.
     
-    assert(_peek().type == TokenType.lineEnd); //TODO expect.
-    var precedingLineEnd = _read();
+    assert(_peek().type == TokenType.lineEnd || _i == 0); //TODO expect.
+
+    //TODO _readIf(TokenType) helper.
+    var precedingLineEnd = _peek() != null && _peek().type == TokenType.lineEnd
+        ? _read() : null;
     
     // The scanner guarantees that there will only be a single whitespace token,
     // there are never consecutive whitespace tokens.
@@ -197,7 +202,7 @@
       
       // This is a standalone line, so do not create text nodes for whitespace,
       // or the following newline.
-
+      _read();
       _appendTag(tag, tagNode);
       
     } else {
diff --git a/test/parser_test.dart b/test/parser_test.dart
index 4914886..d51ea6d 100644
--- a/test/parser_test.dart
+++ b/test/parser_test.dart
@@ -152,7 +152,7 @@
      var nodes = parser.parse();
      expect(nodes, orderedEquals([
        new TextNode('abc\n', 0, 4),
-       new SectionNode('foo', 4, 25, '{{ }}'),
+       new SectionNode('foo', 4, 12, '{{ }}'),
        new TextNode('ghi', 26, 29)
      ]));
      expect(nodes[1].children, orderedEquals([new TextNode('def\n', 13, 17)]));