目前都是基於 CommonMark 上面再去增加語法或限制,疊在 CommonMark 上面新增的規格稱為 extension。
Extension 在函式庫看起來作法大概是這樣:
-
解析部份目前都是產生 AST 再去生成輸出,大概有兩種讓 extension 介入解析的方式:
- 讓 extension 實作註冊關注的字元,再去觸發解析與 AST 加工。
- 掃出來的 AST 整個讓 extension 實作再去解析與加工。
- 完成 AST 之後再進行 render 來產生輸出,看起來多半是讓 extension 註冊處理所屬 token 型別的輸出函式,在 render 時呼叫來處理生成輸出的作業。
直接從 Markdown 產生 HTML 的方式因為比較難擴充的關係,即使有機會比較快,但現在看起來比較不流行了。
Ref:
- GitHub (GFM) 的規格: https://github.github.com/gfm/
- Visual Studio Code 用的引擎: https://github.com/markdown-it/markdown-it
- CommonMark: https://spec.commonmark.org/
- Go: https://github.com/gomarkdown/markdown
- Go: https://gitlab.com/golang-commonmark/markdown
- 規格的範例本身可以當成 test suite: https://github.com/commonmark/commonmark-spec
- 在 CommonMark.org 首頁提到的 test suite: https://github.com/michelf/mdtest
- Markdown Guide 有一些最佳建議實踐與常見的 extension 使用說明: https://www.markdownguide.org/
- GFM 規格發表公告,有說明所謂「移轉到 CommonMark 上」的背景: https://github.blog/2017-03-14-a-formal-spec-for-github-markdown/