-
Notifications
You must be signed in to change notification settings - Fork 11
Description
Summary
YAML front matter (delimited by ---) is widely used in static site generators (Hugo, Jekyll, etc.) and documentation tools. Currently, nextjournal/markdown parses front matter as regular markdown content, producing incorrect results.
Current behavior
(require '[nextjournal.markdown :as md])
(md/parse "---
title: My Post
date: 2024-01-01
---
## Actual Heading")Produces:
- A
:rulernode (from the opening---) - An h2 heading with text "title: My Post" (incorrectly parsed as markdown heading)
- A paragraph with "date: 2024-01-01"
- Another
:rulernode (from the closing---) - The actual h2 heading
Expected behavior
Front matter should be:
- Recognized and excluded from markdown parsing, OR
- Parsed and included as a separate
:front-matternode with the YAML content
Example of option 2:
{:type :doc
:front-matter {:title "My Post" :date "2024-01-01"}
:content [{:type :heading :heading-level 2 :content [...]}]}Workaround
Users currently need to strip front matter before calling parse, which is error-prone and loses the metadata.
Implementation note
The underlying commonmark-java library already has a YamlFrontMatterExtension in the commonmark-ext-yaml-front-matter artifact with YamlFrontMatterVisitor for extracting metadata. Using this extension at the commonmark-java level (rather than preprocessing the string) would have the advantage that other features like source line numbers (#64) would work correctly for free, since the parser would know where the actual content starts.
References: