anchor.diff:      return _imageTextCache;
     }
   
  -  static final String _linkLabelStrSpecialChars = " *_`!<\\";
  -  static final Parser<List<Inline>> _linkLabelStr =
  -      (noneOf(_linkLabelStrSpecialChars + "[]\n").many1 ^
  -              (List<String> chars) => _transformString(chars.join())) |
  -          (oneOf(_linkLabelStrSpecialChars) ^
  -              (String chars) => _transformString(chars)) |
  -          (char("\n").notFollowedBy(spnl) ^ (String _) => [new Str("\n")]);
  +  static final Set<String> _linkLabelStrSpecialChars =
  +      new Set.from(" *_`!<\\".split(""));
  +  static final Parser<List<Inline>> _linkLabelStr = choiceSimple([
  +    noneOfSet(new Set.from(_linkLabelStrSpecialChars)..addAll(["[", "]", "\n"]))
  +            .many1
  +            .record ^
  +        (String str) => _transformString(str),
  +    oneOfSet(_linkLabelStrSpecialChars) ^
  +        (String char) => _transformString(char),
  +    char("\n").notFollowedBy(spnl) ^ (_) => [new Str("\n")]
  +  ]);
   
     static final Parser<String> linkLabel = (char('[') >
  -          choice([
  +          choiceSimple([
               whitespace,
               htmlEntity,
               inlineCode,
  
positive.code:       (expectations != null) ? expectations : new Expectations.empty(position);
    return new ParseResult /*<any>*/ (
        text, exps, position, false, committed, null);
  }
  
  class _UnparsedInlines extends Inlines {
  
negative.code:     StringBuffer str = new StringBuffer();
      Position position = openRes.position;
      while (true) {
        ParseResult<String> res = _inlineCode2.run(s, position);
        if (!res.isSuccess) {
          return res;
        }
        str.write(res.value);
        position = res.position;
  
        // Checking for paragraph end
  