anchor.diff:    static final Parser spnl = (skipSpaces > newline);
     static final Parser indent = waitForIndent(tabStop);
   
  -  static Parser atMostIndent(int indent, {bool fromLineStart: true}) =>
  -      new Parser((String s, Position pos) {
  -        if (fromLineStart && pos.character != 1) {
  -          return fail.run(s, pos);
  -        }
  -        var startCharacter = pos.character;
  -        var maxEndCharacter = indent + startCharacter;
  -        Position position = pos;
  -        while (position.character <= maxEndCharacter) {
  -          var res = whitespaceChar.run(s, position);
  -          if (!res.isSuccess || res.position.character > maxEndCharacter) {
  -            return success(position.character - startCharacter)
  -                .run(s, position);
  -          }
  -          position = res.position;
  -        }
  -        return success(position.character - startCharacter).run(s, position);
  -      });
  -
  -  static Parser waitForIndent(int length) =>
  -      new Parser((String s, Position pos) {
  +  static Map<int, Parser> _atMostIndentCache = {};
  +  static Map<int, Parser> _atMostIndentStartCache = {};
  +  static Parser atMostIndent(int indent, {bool fromLineStart: true}) {
  +    if (fromLineStart && _atMostIndentStartCache[indent] != null) {
  +      return _atMostIndentStartCache[indent];
  +    }
  +    if (!fromLineStart && _atMostIndentCache[indent] != null) {
  +      return _atMostIndentCache[indent];
  +    }
  +
  +    var p = new Parser((String s, Position pos) {
  +      if (fromLineStart && pos.character != 1) {
  +        return fail.run(s, pos);
  +      }
  +      var startCharacter = pos.character;
  +      var maxEndCharacter = indent + startCharacter;
  +      Position position = pos;
  +      while (position.character <= maxEndCharacter) {
  +        var res = whitespaceChar.run(s, position);
  +        if (!res.isSuccess || res.position.character > maxEndCharacter) {
  +          return _success(position.character - startCharacter, s, position);
  +        }
  +        position = res.position;
  +      }
  +      return _success(position.character - startCharacter, s, position);
  +    });
  +    if (fromLineStart) {
  +      _atMostIndentStartCache[indent] = p;
  +    } else {
  +      _atMostIndentCache[indent] = p;
  +    }
  +    return p;
  +  }
  +
  +  static Map<int, Parser> _waitForIndentCache = {};
  +  static Parser waitForIndent(int length) {
  +    if (_waitForIndentCache[length] == null) {
  +      _waitForIndentCache[length] = new Parser((String s, Position pos) {
           if (pos.character != 1) {
             return fail.run(s, pos);
           }
  
positive.code: 
    // Can't be static
    Parser _scanDelimsCache;
    Parser get scanDelims {
      if (_scanDelimsCache == null) {
        Parser testParser = oneOf(_inlineDelimiters.join()).lookAhead;
  
negative.code:     do {
        var blanklineRes = blankline.run(s, position);
        if (blanklineRes.isSuccess) {
          return _success(new HtmlRawBlock(content), s, blanklineRes.position);
        }
        lineRes = anyLine.run(s, position);
        if (!lineRes.isSuccess) {
          // eof
          return _success(new HtmlRawBlock(content), s, position);
        }
        content += lineRes.value + '\n';
        position = lineRes.position;
  