Ferromark / Shared reference
Feature Comparison
CommonMark defines everyday Markdown: headings, lists, links, emphasis, and code. GFM (GitHub Flavored Markdown) adds features such as tables and checklists. The groups below spell out those names and show useful extras. Footnotes and alert boxes are listed separately from the published GFM extensions. The FFM guide explains Ferromark's opt-in authoring syntax with examples and configuration names.
✓ = built in, possibly requiring an option or Cargo feature. — = no built-in support. Qualifiers describe narrower support. This is a capability inventory, not a claim of identical output or complete specification conformance. It covers the native cores from the benchmark plus markdown-rs and micromark, with v2 updated to the current local core; these are not the options enabled during timing. Ext. means a separately installed micromark extension; Companion means an additional AST package. Exact versions, source references, and scope.
Scroll sideways for more columns.
| Feature / what it does | Ferromark v1 | Ferromark v2 | OX-Content | pulldown-cmark | md4c | Bun native | markdown-rs | micromark |
|---|---|---|---|---|---|---|---|---|
| CommonMark — everyday Markdown | ||||||||
Headings — # Title through ###### Title | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Paragraphs and line breaks | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Bold and italic — **bold**, *italic* | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Numbered, bulleted, and nested lists | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Block quotes — > quoted text | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Horizontal separators — --- | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Links, images, and reusable reference links | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Inline code, fenced code blocks, and indented code | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Raw HTML inside Markdown — <details>…</details> | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| GFM — GitHub-style extensions | ||||||||
| Tables with left/center/right column alignment | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | Ext. |
Checklists — - [x] done, - [ ] pending | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | Ext. |
Crossed-out text — ~~removed~~ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | Ext. |
Single-tilde crossed-out text — ~removed~ | — | ✓ | — | ✓ | ✓ | ✓ | ✓ | Ext. |
Turn bare URLs/emails into links — www.example.com | ✓ | ✓ | ✓ | — | ✓ | ✓ | ✓ | Ext. |
| GFM HTML tag filter — filter its specified tag list | ✓ | ✓ | ✓ | — | — | ✓ | ✓ | Ext. |
| Writing extras — beyond CommonMark/GFM | ||||||||
Reference footnotes — [^note] plus a definition | ✓ | ✓ | ✓ | ✓ | ✓ | — | ✓ | Ext. |
Inline footnotes — ^[note written here] | ✓ | ✓ | — | — | — | — | — | — |
Definition lists — a term followed by : explanation | ✓ | ✓ | ✓ | ✓ | — | — | — | — |
Math notation — $x^2$, $$…$$ | Syntax | Syntax | Syntax | Syntax | Syntax | Syntax | Syntax | Ext. syntax |
Superscript — x^2^ | ✓ | ✓ | ✓ | ✓ | ✓ | — | — | — |
Subscript — H~2~O | ✓ | ✓ | ✓ | ✓ | ✓ | — | — | — |
Highlighted text — ==important== | ✓ | ✓ | — | — | ✓ | — | — | — |
Inserted text — ++added++ (opt-in) | — | ✓ | — | — | — | — | — | — |
Wiki links — [[Page]] | — | — | ✓ | ✓ | Custom tag | Custom tag | — | — |
| Smart punctuation — curly quotes and ellipses | — | — | ✓ | ✓ | — | — | — | — |
ASCII guillemet digraphs — <<quote>> with locale typography | — | Opt-in parser | — | — | — | — | — | — |
Extract frontmatter — metadata between --- or +++ | ✓ | ✓ | — | ✓ | — | — | AST | Ext. / companion |
Source-only line comments — hide // note lines from HTML | ✓ | ✓ | — | — | — | — | — | — |
| Table layout — beyond GFM | ||||||||
| Merged table cells — one cell spans several columns | ✓ | ✓ | — | — | — | — | — | — |
| Numeric column-width hints — proportions from delimiter dashes | ✓ | — | — | — | — | — | — | — |
| Table IDs/classes — style a whole table with CSS | — | ✓ | — | — | — | — | — | — |
| Table captions — a label with inline Markdown formatting | — | ✓ | — | — | — | — | — | — |
Column classes for CSS widths — col-1, col-2, etc. | — | ✓ | — | — | — | — | — | — |
Column names from headers — “Netto Preis” → col-name-netto-preis | — | ✓ | — | — | — | — | — | — |
| Documentation and navigation | ||||||||
| Automatic heading IDs — link directly to a section | ✓ | ✓ | ✓ | — | — | ✓ | — | — |
Explicit heading IDs/classes — # Title {#id .class} | — | ✓ | ✓ | ✓ | — | — | — | — |
Alert boxes — > [!NOTE], > [!WARNING] | ✓ | ✓ | ✓ | ✓ | ✓ | — | — | — |
| MDX — components and expressions mixed with Markdown | ||||||||
Recognize JSX, {expressions}, and imports/exports | Limited | Limited | Limited | — | — | — | Syntax / callbacks | Ext. / callbacks |
| Application integration | ||||||||
| Inspect/transform the parsed document | Events | Tree (AST) | Tree (AST) | Events | Callbacks | Callbacks | Tree (mdast) | Companion (mdast) |
| Customize generated output | Code hook / events | HTML hooks | HTML hooks | Event transforms | Renderer callbacks | Renderer callbacks | AST / own renderer | HTML extensions |
Math support preserves formula notation; an application supplies mathematical typesetting. “Custom tag” wiki links also need application-side routing/rendering. Frontmatter support extracts metadata text, rather than parsing YAML/TOML values. Trees expose nested document nodes; events/callbacks expose elements in sequence. The Ferromark and OX MDX entries cover bounded syntax handling. markdown-rs and micromark provide MDX syntax support; ESM and JavaScript-aware expression validation require parser callbacks (typically Acorn for micromark). None of these entries denotes a complete MDX compiler or JavaScript runtime. Single-tilde strikethrough and subscript compete for the same syntax; enabling subscript gives it priority.
markdown-rs is the Rust markdown crate, reviewed at 1.0.0; micromark is
reviewed at 4.0.2. They are sibling implementations. micromark extensions
supply GFM, footnotes, math, frontmatter, and MDX. Its mdast tree API comes from
mdast-util-from-markdown; the core exposes tokens and HTML compilation.
markdown-rs provides to_mdast directly, but customizing HTML beyond its options
requires application-side AST processing/rendering. Frontmatter recognition
preserves metadata without parsing YAML/TOML values.
Reviewed sources and extension scope.
Node.js projects
The homepage includes the main HTML converters and parser ecosystems: marked, markdown-it, remark / unified, micromark, Showdown, and commonmark.js. The benchmark pins their versions and compares complete Markdown-to-HTML string calls, including Ferromark's Node binding overhead. These projects cover both direct converters and AST/plugin pipelines; their rows do not imply identical feature sets or document agreement sets.
Scroll sideways for more columns.
| Capability | marked | markdown-it | remark / unified | micromark | Showdown | commonmark.js |
|---|---|---|---|---|---|---|
| HTML string output | ✓ | ✓ | HTML pipeline | ✓ | ✓ | HTML renderer |
| Tables | ✓ | ✓ | Ext. | Ext. | Opt-in | — |
| Strikethrough | ✓ | ✓ | Ext. | Ext. | Opt-in | — |
| Task lists | ✓ | Ext. | Ext. | Ext. | Opt-in | — |
| Public syntax representation | Tokens | Tokens | mdast / hast | Tokens; mdast companion | — | AST |
“HTML pipeline” means remark + remark-rehype + rehype-stringify; remark alone
serializes Markdown. “Ext.” means separately installed plugins/extensions.
The measured pipeline enables only table, strikethrough, and task-list syntax,
without remark-gfm's additional autolinks or footnotes. markdown-it retains
its <s> spelling and task-list plugin classes; Showdown retains its task-list
styles and extra fenced-code classes. These differences are not removed to
enlarge the agreement set.
commonmark.js enables CommonMark only in both engines on every corpus input.
Exact versions, adapters, and measurement scope.
react-markdown belongs to the remark/unified ecosystem and returns React elements; MDX compiles Markdown with JSX to JavaScript. Those operations need their own workload rather than a second HTML-string throughput row. Their project links are included here so readers can find the framework integrations alongside the parser comparison.
The native overview also lists Comrak, cmark, and cmark-gfm. Matched native measurements for all three are retained in the completed platform report. No factor is inferred from another implementation or another runtime.
Optional writing syntax
Scroll sideways for more columns.
| Behavior | Rust ParserOptions | Node option | Default |
|---|---|---|---|
==marked text== renders as <mark> | highlight | highlight | false |
++inserted text++ renders as <ins> | insertions | insertions | false |
^[inline note] creates a footnote | inline_footnotes | inlineFootnotes | false |
| Resolve full, collapsed, and shortcut reference links/images | allow_link_refs | allowLinkRefs | true |
| Image ID and class suffixes | image_attributes | imageAttributes | false |
| Separate image figure captions | image_captions | imageCaptions | false |
| Block quote figure attributions | blockquote_attributions | blockquoteAttributions | false |
| Shared key/value attributes | extended_attributes | extendedAttributes | false |
| Bracketed inline spans | bracketed_spans | bracketedSpans | false |
Inline notes accept inline formatting and work independently of reference footnotes. Disabling reference links preserves definitions as visible Markdown; inline links and images continue to work. Marked text is separate from code syntax highlighting. Rust and Node examples, syntax, and defaults.
The existing highlight and inline-note measurements found no material slowdown on representative documents with those options disabled. Enabling them on documents without matching syntax still costs several percent, and literal marker-heavy inputs cost more. Disabling reference links can skip parsing work, but its benefit depends on the parser profile and changes the output of actual references. See the measured costs and limitations.
Insertions have a separate default-off measurement. A 120-input base-versus-PR
comparison found identical HTML and AST output; fresh rendering measured 0.4%
slower and parse-only 1.3% slower. The same-binary control varied from 0.7%
slower to 2.1% faster parse-only as host load increased, so the small difference
is noisy. The disabled parser path is not byte-for-byte identical to main.
See the measurement details.
Other extension policies
Reference footnotes have document-wide scope, including definitions in lists, block quotes, and Markdown blocks inside MDX components. References can precede their definitions. Code and raw HTML cannot define footnotes.
V2 preserves authored punctuation by default. An optional, locale-aware
typography pass is available after parsing in Rust and through the Node.js
typography option. It never guesses a language. See the typography guide
for configuration and protected syntax; the former English-oriented parser
option remains removed.
Enable ParserOptions::front_matter to extract a leading --- (YAML) or +++
(TOML) metadata block into document.front_matter. It exposes the format, raw
content, and original source spans. The block is omitted from HTML and cannot
define Markdown links or footnotes. The option is off in every preset.
Frontmatter syntax and Rust example.
Enable ParserOptions::line_comments to omit // note source lines from HTML.
Comments may have up to three leading spaces and do not separate paragraphs.
Code blocks, raw HTML blocks, and explicitly prefixed lines such as > // text
remain literal. The option is off by default; the FFM preset enables it.
Syntax, examples, and source-span behavior.
V1 derives numeric column-width hints from delimiter dash counts. V2 instead
supports table IDs/classes, inline captions, and generated colgroup columns
whose widths are set in external CSS. Optional header-derived classes such
as col-name-netto-preis use the heading slug rules and retain positional classes.
Both versions use adjacent pipes for horizontal spans (|| spans two columns).
All V2 table extras are opt-in. The FFM preset enables spans and table
attributes; generated colgroup columns stay a renderer choice. The table-layout rows
describe built-in handling of Markdown tables; raw HTML and custom rendering can
provide additional layouts in any engine.
Syntax, options, and a runnable CSS example.