Skip to content
Ferromark

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.

Feature / what it doesFerromark v1Ferromark v2OX-Contentpulldown-cmarkmd4cBun nativemarkdown-rsmicromark
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$, $$…$$SyntaxSyntaxSyntaxSyntaxSyntaxSyntaxSyntaxExt. syntax
Superscript — x^2^✓✓✓✓✓———
Subscript — H~2~O✓✓✓✓✓———
Highlighted text — ==important==✓✓——✓———
Inserted text — ++added++ (opt-in)—✓——————
Wiki links — [[Page]]——✓✓Custom tagCustom tag——
Smart punctuation — curly quotes and ellipses——✓✓————
ASCII guillemet digraphs — <<quote>> with locale typography—Opt-in parser——————
Extract frontmatter — metadata between --- or +++✓✓—✓——ASTExt. / 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/exportsLimitedLimitedLimited———Syntax / callbacksExt. / callbacks
Application integration
Inspect/transform the parsed documentEventsTree (AST)Tree (AST)EventsCallbacksCallbacksTree (mdast)Companion (mdast)
Customize generated outputCode hook / eventsHTML hooksHTML hooksEvent transformsRenderer callbacksRenderer callbacksAST / own rendererHTML 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.

Capabilitymarkedmarkdown-itremark / unifiedmicromarkShowdowncommonmark.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 representationTokensTokensmdast / hastTokens; 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

BehaviorRust ParserOptionsNode optionDefault
==marked text== renders as <mark>highlighthighlightfalse
++inserted text++ renders as <ins>insertionsinsertionsfalse
^[inline note] creates a footnoteinline_footnotesinlineFootnotesfalse
Resolve full, collapsed, and shortcut reference links/imagesallow_link_refsallowLinkRefstrue
Image ID and class suffixesimage_attributesimageAttributesfalse
Separate image figure captionsimage_captionsimageCaptionsfalse
Block quote figure attributionsblockquote_attributionsblockquoteAttributionsfalse
Shared key/value attributesextended_attributesextendedAttributesfalse
Bracketed inline spansbracketed_spansbracketedSpansfalse

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.