parseMarkdown function

List<BlockNode> parseMarkdown(
  1. String text
)

Implementation

List<BlockNode> parseMarkdown(String text) {
  List<String> lines = text.split('\n');
  List<BlockNode> blocks = [];
  int i = 0;
  while (i < lines.length) {
    String line = lines[i].trim();
    if (line.startsWith('#')) {
      int level = 0;
      while (level < line.length && line[level] == '#') {
        level++;
      }
      if (level < line.length && line[level] == ' ') {
        String headerText = line.substring(level + 1);
        blocks.add(HeaderBlock(level, headerText));
        i++;
        continue;
      }
    } else if (line.startsWith('---')) {
      blocks.add(HorizontalRuleBlock());
      i++;
      continue;
    } else if (line.startsWith('- ')) {
      List<String> items = [];
      while (i < lines.length && lines[i].trim().startsWith('- ')) {
        items.add(lines[i].trim().substring(2));
        i++;
      }
      blocks.add(ListBlock(items));
      continue;
    } else if (line.isNotEmpty) {
      // Paragraph
      String para = '';
      while (i < lines.length &&
          lines[i].trim().isNotEmpty &&
          !lines[i].trim().startsWith('#') &&
          !lines[i].trim().startsWith('- ')) {
        para += '${lines[i]}\n';
        i++;
      }
      para = para.trim();
      if (para.isNotEmpty) {
        List<InlineNode> inlines = parseInlines(para);
        blocks.add(ParagraphBlock(inlines));
      }
      continue;
    }
    i++;
  }
  return blocks;
}