anchor.diff:      return _success(result, s, newPos);
     });
   
  -  static final Parser<String> whitespaceChar = oneOf(" \t");
  -  static final Parser<String> nonSpaceChar = noneOf("\t\n \r");
  +  static final Parser<String> whitespaceChar = oneOf2(" ", "\t");
  +  static final Parser<String> nonSpaceChar = noneOf4("\t", "\n", " ", "\r");
     static final Parser<dynamic> skipSpaces = whitespaceChar.skipMany;
     static final Parser<String> blankline = skipSpaces > newline;
     static final Parser<List<String>> blanklines = blankline.many1;
  
positive.code:   // whitespace
    //
  
    static final Parser<List<Inline>> whitespace = (char(' ') ^
            (String _) => [new Space()]) |
        (char('\t') ^ (String _) => [new Tab()]);
  
    // TODO better escaped chars support
    static final Parser<String> escapedChar1 =
        (char('\\') > oneOf("!\"#\$%&'()*+,-./:;<=>?@[\\]^_`{|}~"));
    static final Parser<List<Inline>> escapedChar =
        escapedChar1 ^ (String char) => [new Str(char)];
  
  
negative.code:   Parser<List<Inline>> _strCache;
    Parser<List<Inline>> get str {
      if (_strCache == null) {
        _strCache = choiceSimple([
          noneOfSet(new Set.from(_strSpecialChars)..add("\n")).many1.record ^
              (String chars) => _transformString(chars),
          oneOfSet(_strSpecialChars) ^ (String chars) => _transformString(chars),
          char("\n").notFollowedBy(spnl) ^ (_) => [new Str("\n")]
        ]);
      }
      return _strCache;
    }
  