in lib/src/block_parser.dart [1101:1178]
List<String>? _extractReflinkDefinitions(
BlockParser parser, List<String> lines) {
bool lineStartsReflinkDefinition(int i) =>
lines[i].startsWith(_reflinkDefinitionStart);
var i = 0;
loopOverDefinitions:
while (true) {
// Check for reflink definitions.
if (!lineStartsReflinkDefinition(i)) {
// It's paragraph content from here on out.
break;
}
var contents = lines[i];
var j = i + 1;
while (j < lines.length) {
// Check to see if the _next_ line might start a new reflink definition.
// Even if it turns out not to be, but it started with a '[', then it
// is not a part of _this_ possible reflink definition.
if (lineStartsReflinkDefinition(j)) {
// Try to parse [contents] as a reflink definition.
if (_parseReflinkDefinition(parser, contents)) {
// Loop again, starting at the next possible reflink definition.
i = j;
continue loopOverDefinitions;
} else {
// Could not parse [contents] as a reflink definition.
break;
}
} else {
contents = contents + '\n' + lines[j];
j++;
}
}
// End of the block.
if (_parseReflinkDefinition(parser, contents)) {
i = j;
break;
}
// It may be that there is a reflink definition starting at [i], but it
// does not extend all the way to [j], such as:
//
// [link]: url // line i
// "title"
// garbage
// [link2]: url // line j
//
// In this case, [i, i+1] is a reflink definition, and the rest is
// paragraph content.
while (j >= i) {
// This isn't the most efficient loop, what with this big ole'
// Iterable allocation (`getRange`) followed by a big 'ole String
// allocation, but we
// must walk backwards, checking each range.
contents = lines.getRange(i, j).join('\n');
if (_parseReflinkDefinition(parser, contents)) {
// That is the last reflink definition. The rest is paragraph
// content.
i = j;
break;
}
j--;
}
// The ending was not a reflink definition at all. Just paragraph
// content.
break;
}
if (i == lines.length) {
// No paragraph content.
return null;
} else {
// Ends with paragraph content.
return lines.sublist(i);
}
}