in lib/src/block_parser.dart [956:1022]
Element _parseRow(
BlockParser parser, List<String?> alignments, String cellType) {
var line = parser.current;
var cells = <String>[];
var index = _walkPastOpeningPipe(line);
var cellBuffer = StringBuffer();
while (true) {
if (index >= line.length) {
// This row ended without a trailing pipe, which is fine.
cells.add(cellBuffer.toString().trimRight());
cellBuffer.clear();
break;
}
var ch = line.codeUnitAt(index);
if (ch == $backslash) {
if (index == line.length - 1) {
// A table row ending in a backslash is not well-specified, but it
// looks like GitHub just allows the character as part of the text of
// the last cell.
cellBuffer.writeCharCode(ch);
cells.add(cellBuffer.toString().trimRight());
cellBuffer.clear();
break;
}
var escaped = line.codeUnitAt(index + 1);
if (escaped == $pipe) {
// GitHub Flavored Markdown has a strange bit here; the pipe is to be
// escaped before any other inline processing. One consequence, for
// example, is that "| `\|` |" should be parsed as a cell with a code
// element with text "|", rather than "\|". Most parsers are not
// compliant with this corner, but this is what is specified, and what
// GitHub does in practice.
cellBuffer.writeCharCode(escaped);
} else {
// The [InlineParser] will handle the escaping.
cellBuffer.writeCharCode(ch);
cellBuffer.writeCharCode(escaped);
}
index += 2;
} else if (ch == $pipe) {
cells.add(cellBuffer.toString().trimRight());
cellBuffer.clear();
// Walk forward past any whitespace which leads the next cell.
index++;
index = _walkPastWhitespace(line, index);
if (index >= line.length) {
// This row ended with a trailing pipe.
break;
}
} else {
cellBuffer.writeCharCode(ch);
index++;
}
}
parser.advance();
var row = [
for (var cell in cells) Element(cellType, [UnparsedContent(cell)])
];
for (var i = 0; i < row.length && i < alignments.length; i++) {
if (alignments[i] == null) continue;
row[i].attributes['style'] = 'text-align: ${alignments[i]};';
}
return Element('tr', row);
}