ironmark
Fast Markdown to HTML/AST parser written in Rust with zero third-party parsing dependencies. Fully compliant with CommonMark 0.31.2 (652/652 spec tests pass). Available as a Rust crate and as an npm package via WebAssembly, with both HTML and AST output APIs.
Options
Extensions
All extension options default to true.
| Option | JS (camelCase) |
Rust (snake_case) |
Description |
|---|---|---|---|
| Hard breaks | hardBreaks |
hard_breaks |
Every newline becomes <br /> |
| Highlight | enableHighlight |
enable_highlight |
==text== → <mark> |
| Strikethrough | enableStrikethrough |
enable_strikethrough |
~~text~~ → <del> |
| Underline | enableUnderline |
enable_underline |
++text++ → <u> |
| Tables | enableTables |
enable_tables |
Pipe table syntax |
| Autolink | enableAutolink |
enable_autolink |
Bare URLs & emails → <a> |
| Task lists | enableTaskLists |
enable_task_lists |
- [ ] / - [x] checkboxes |
Security
| Option | JS (camelCase) |
Rust (snake_case) |
Default | Description |
|---|---|---|---|---|
| Disable raw HTML | disableRawHtml |
disable_raw_html |
false |
Escape HTML blocks & inline HTML instead of passing through |
| Max nesting | — | max_nesting_depth |
128 |
Limit blockquote/list nesting depth (DoS prevention) |
| Max input size | — | max_input_size |
0 (no limit) |
Truncate input beyond this byte count |
In the WASM build,
max_nesting_depthis fixed at128andmax_input_sizeat10 MB.
Dangerous URI schemes (javascript:, vbscript:, data: except data:image/…) are always stripped from link and image destinations, regardless of options.
JavaScript / TypeScript
# or
Node.js
WASM is embedded and loaded synchronously — no init() needed:
import { parse } from "ironmark";
const html = parse("# Hello\n\nThis is **fast**.");
// safe mode for untrusted input
const safe = parse(userInput, { disableRawHtml: true });
AST Output
Use parseToAst() when you need the block-level document structure instead of rendered HTML.
import { parseToAst } from "ironmark";
const astJson = parseToAst("# Hello\n\n- [x] done");
const ast = JSON.parse(astJson);
parseToAst() returns a JSON string for portability across JS runtimes and WASM boundaries.
Browser / Bundler
Call init() once before using parse(). It's idempotent and optionally accepts a custom .wasm URL.
import { init, parse } from "ironmark";
await init();
const html = parse("# Hello\n\nThis is **fast**.");
Vite
import { init, parse } from "ironmark";
import wasmUrl from "ironmark/ironmark.wasm?url";
await init(wasmUrl);
const html = parse("# Hello\n\nThis is **fast**.");
Rust
use ;
AST Output
parse_to_ast() returns the typed Rust AST (Block) directly:
use ;
Exported AST types:
BlockListKindTableDataTableAlignment
Benchmarks
Development
This project uses pnpm for package management.
Build from source
| Command | Description |
|---|---|
pnpm setup:wasm |
Install prerequisites |
pnpm build |
Release WASM build |
pnpm build:dev |
Debug WASM build |
pnpm test |
Run Rust tests |
pnpm check |
Format check |
pnpm clean |
Remove build artifacts |
Troubleshooting
wasm32-unknown-unknown target not found or wasm-bindgen not found — run pnpm setup:wasm to install all prerequisites.