parseFrontmatter function

ParsedMarkdown parseFrontmatter(
  1. String markdown, {
  2. String? sourcePath,
})

Parse markdown content to extract frontmatter and body.

Implementation

ParsedMarkdown parseFrontmatter(String markdown, {String? sourcePath}) {
  final match = frontmatterRegex.firstMatch(markdown);

  if (match == null) {
    return ParsedMarkdown(frontmatter: {}, content: markdown);
  }

  final frontmatterText = match.group(1) ?? '';
  final content = markdown.substring(match.end);

  FrontmatterData frontmatter = {};
  try {
    final parsed = _parseSimpleYaml(frontmatterText);
    if (parsed is Map<String, dynamic>) {
      frontmatter = parsed;
    }
  } catch (_) {
    // YAML parsing failed - try again after quoting
    try {
      final quotedText = _quoteProblematicValues(frontmatterText);
      final parsed = _parseSimpleYaml(quotedText);
      if (parsed is Map<String, dynamic>) {
        frontmatter = parsed;
      }
    } catch (retryError) {
      final location = sourcePath != null ? ' in $sourcePath' : '';
      stderr.writeln('Failed to parse YAML frontmatter$location: $retryError');
    }
  }

  return ParsedMarkdown(frontmatter: frontmatter, content: content);
}