anchor.diff:        ) ^ (a, Option b) => new Target(a, b.asNullable))
     ) < char(')');
   
  +  bool _isContainsLink(Inlines inlines) => inlines.any((Inline inline) {
  +    if (inline is Link) {
  +      return true;
  +    }
  +    if (inline is Emph) {
  +      return _isContainsLink(inline.contents);
  +    }
  +    if (inline is Strong) {
  +      return _isContainsLink(inline.contents);
  +    }
  +    if (inline is Image) {
  +      return _isContainsLink(inline.label);
  +    }
  +    return false;
  +  });
  +
     Parser<List<Inline>> get link => new Parser((String s, Position pos) {
       ParseResult testRes = char('[').run(s, pos);
       if (!testRes.isSuccess) {
  
positive.code:   static final Parser str = (noneOf(_strSpecialChars).many1 ^ (chars) => [new Str(chars.join())]) |
      (oneOf(_strSpecialChars) ^ (chars) => [new Str(chars)]);
  
    Parser<List<Inline>> inline({bool noLinks: false}) => choice([
        lineBreak,
        whitespace,
        escapedChar,
        htmlEntity,
        inlineCode,
        emphasis,
        noLinks ? fail : link,
        image,
        autolink,
        rawInlineHtml,
        str
    ]);
  
    Parser<Inlines> inlines({bool noLinks: false}) => inline(noLinks: noLinks).manyUntil(eof) ^ (res) => processParsedInlines(res);
  
    //
    // Blocks
  
negative.code:           break;
          }
  
          res = inline.run(s, position);
          if (!res.isSuccess) {
            break mainloop;
          }
  