parse method
Parses Markdown content with layout metadata extraction.
Returns a LayoutAwareParseResult containing both the parsed data map and key-level metadata for preserving layout information.
markdown - The Markdown string to parse
Implementation
LayoutAwareParseResult parse(String markdown) {
if (markdown.isEmpty) {
return const LayoutAwareParseResult(data: {});
}
final lineEnding = _detectLineEnding(markdown);
final lines = markdown.split(RegExp(r'\r?\n'));
final data = <String, dynamic>{};
final keyMeta = <String, dynamic>{};
var currentIndex = 0;
// Parse YAML frontmatter if present
if (lines.isNotEmpty &&
lines[0].trim() == _MarkdownPatterns.frontmatterDelimiter) {
final frontmatterResult =
_parseFrontmatter(lines, currentIndex, lineEnding);
currentIndex = frontmatterResult.nextIndex;
data.addAll(frontmatterResult.data);
if (frontmatterResult.meta.isNotEmpty) {
keyMeta.addAll(frontmatterResult.meta);
}
}
// Track leading whitespace for the document
final leadingNewlines = _countLeadingNewlines(lines, currentIndex);
if (leadingNewlines > 0) {
currentIndex += leadingNewlines;
}
// Parse body content
final bodyResult = _parseBody(lines, currentIndex, lineEnding);
if (bodyResult.data.isNotEmpty) {
data.addAll(bodyResult.data);
}
if (bodyResult.meta.isNotEmpty) {
keyMeta.addAll(bodyResult.meta);
}
// Add document-level whitespace metadata
keyMeta['_document'] = KeyMetadata(
whitespace: WhitespaceMeta(
leadingNewlines: leadingNewlines,
lineEnding: lineEnding,
),
).toJson();
return LayoutAwareParseResult(
data: data,
keyMeta: keyMeta.isEmpty ? null : keyMeta,
);
}