anchor.diff:        choice([whitespace, htmlEntity, inlineCode, autolink, rawInlineHtml, escapedChar, _linkLabelStr]).manyUntil(char(']')).record) ^
         (String label) => label.substring(0, label.length - 1);
   
  +
     Parser get linkBalancedParenthesis => ((char("(") > (noneOf('&\\\n ()') | escapedChar1 | htmlEntity1 | oneOf('&\\')).many1) <
       char(')')) ^ (i) => "(${i.join()})";
  +
   
     Parser get linkInlineDestination => (
         ((char("<") > noneOf("<>\n").many) < char(">")) |
         (noneOf("&\\\n ()") | escapedChar1 | htmlEntity1 | linkBalancedParenthesis | oneOf('&\\')).many
     ) ^ (i) => i.join();
   
  +
     Parser get linkBlockDestination => (
         ((char("<") > noneOf("<>\n").many1) < char(">")) |
         (noneOf("&\\\n ()") | escapedChar1 | htmlEntity1 | linkBalancedParenthesis | oneOf('&\\')).many1
     ) ^ (i) => i.join();
  +
   
     Parser get linkTitle => (
         ((char("'") > (noneOf("'&\\\n") | escapedChar1 | htmlEntity1 | oneOf('&\\')).many) < char("'")) |
  
positive.code: 
    static final Parser whitespace = spaceChar ^ (_) => [new Space()];
  
    // TODO better escaped chars support
    Parser escapedChar1 = (char('\\') > oneOf("!\"#\$%&'()*+,-./:;<=>?@[\\]^_`{|}~")) % "escaped char";
    Parser get escapedChar => escapedChar1 ^ (char) => [new Str(char)];
  
    //
    // html entities
  
negative.code:   bool operator==(obj) => obj is _UnparsedInlines &&
      raw == obj.raw;
  }
  
  
  String _normalizeReference(String s) {
    return s.trim()
  