parseFrontmatter function
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);
}