in lib/src/inline_parser.dart [1223:1294]
InlineLink? _parseInlineBareDestinationLink(InlineParser parser) {
// According to
// [CommonMark](http://spec.commonmark.org/0.28/#link-destination):
//
// > A link destination consists of [...] a nonempty sequence of
// > characters [...], and includes parentheses only if (a) they are
// > backslash-escaped or (b) they are part of a balanced pair of
// > unescaped parentheses.
//
// We need to count the open parens. We start with 1 for the paren that
// opened the destination.
var parenCount = 1;
var buffer = StringBuffer();
while (true) {
var char = parser.charAt(parser.pos);
switch (char) {
case $backslash:
parser.advanceBy(1);
if (parser.isDone) return null; // EOF. Not a link.
var next = parser.charAt(parser.pos);
// Parentheses may be escaped.
//
// http://spec.commonmark.org/0.28/#example-467
if (next != $backslash && next != $lparen && next != $rparen) {
buffer.writeCharCode(char);
}
buffer.writeCharCode(next);
break;
case $space:
case $lf:
case $cr:
case $ff:
var destination = buffer.toString();
var title = _parseTitle(parser);
if (title == null &&
(parser.isDone || parser.charAt(parser.pos) != $rparen)) {
// This looked like an inline link, until we found this $space
// followed by mystery characters; no longer a link.
return null;
}
// [_parseTitle] made sure the title was follwed by a closing `)`
// (but it's up to the code here to examine the balance of
// parentheses).
parenCount--;
if (parenCount == 0) {
return InlineLink(destination, title: title);
}
break;
case $lparen:
parenCount++;
buffer.writeCharCode(char);
break;
case $rparen:
parenCount--;
if (parenCount == 0) {
var destination = buffer.toString();
return InlineLink(destination);
}
buffer.writeCharCode(char);
break;
default:
buffer.writeCharCode(char);
}
parser.advanceBy(1);
if (parser.isDone) return null; // EOF. Not a link.
}
}