extractCodeBlocks function
List<({String code, int endLine, String language, int startLine})>
extractCodeBlocks(
- String markdown
Extract all code blocks from markdown text.
Implementation
List<({String language, String code, int startLine, int endLine})>
extractCodeBlocks(String markdown) {
final blocks =
<({String language, String code, int startLine, int endLine})>[];
final lines = markdown.split('\n');
var i = 0;
while (i < lines.length) {
final line = lines[i];
final fenceMatch = RegExp(r'^(`{3,}|~{3,})\s*(\w*)').firstMatch(line);
if (fenceMatch != null) {
final fence = fenceMatch.group(1)!;
final language = fenceMatch.group(2) ?? '';
final fenceChar = fence[0];
final fenceLen = fence.length;
final startLine = i + 1;
final codeLines = <String>[];
i++;
while (i < lines.length) {
final closeFence = RegExp(
'^$fenceChar{$fenceLen,}\\s*\$',
).firstMatch(lines[i]);
if (closeFence != null) {
break;
}
codeLines.add(lines[i]);
i++;
}
blocks.add((
language: language,
code: codeLines.join('\n'),
startLine: startLine,
endLine: i,
));
}
i++;
}
return blocks;
}