extractCodeBlocks function

List<({String code, int endLine, String language, int startLine})> extractCodeBlocks(
  1. 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;
}