parseFrontmatter function

({String body, Map<String, dynamic> frontmatter}) parseFrontmatter(
  1. String content
)

Splits markdown content into YAML frontmatter and body.

Implementation

({Map<String, dynamic> frontmatter, String body}) parseFrontmatter(
  String content,
) {
  const separator = '---';
  if (!content.startsWith('$separator\n') &&
      !content.startsWith('$separator\r\n')) {
    return (frontmatter: <String, dynamic>{}, body: content);
  }
  final endIndex = content.indexOf('\n$separator', separator.length);
  if (endIndex == -1) return (frontmatter: <String, dynamic>{}, body: content);
  final frontYaml = content.substring(separator.length + 1, endIndex).trim();
  final body = content.substring(endIndex + separator.length + 2).trim();
  try {
    final parsed = yaml.loadYaml(frontYaml);
    if (parsed is Map) {
      return (
        frontmatter: Map<String, dynamic>.fromEntries(
          parsed.entries.map(
            (e) => MapEntry<String, dynamic>(e.key.toString(), e.value),
          ),
        ),
        body: body,
      );
    }
  } on Object {
    // ignore: invalid frontmatter, fall through
  }
  return (frontmatter: <String, dynamic>{}, body: content);
}