
Security News
Feross on TBPN: How North Korea Hijacked Axios
Socket CEO Feross Aboukhadijeh breaks down how North Korea hijacked Axios and what it means for the future of software supply chain security.
flatmarkdown-ast2html
Advanced tools
Renders a flatmarkdown JSON AST to HTML in TypeScript.
The flatmarkdown Rust crate exposes markdown_to_ast() which converts Markdown into a JSON AST. This library takes that AST and produces HTML — no Rust toolchain needed at render time.
bun add flatmarkdown-ast2html
# or
npm install flatmarkdown-ast2html
A minified IIFE build is included for non-module environments (plain <script> tags, WebView2, Electron, etc.).
<script src="https://unpkg.com/flatmarkdown-ast2html@0.1.2/dist/index.global.js"></script>
<script>
var html = FmAst2Html.renderToHtml(astJson);
document.getElementById('content').innerHTML = html;
</script>
The global FmAst2Html object exposes renderToHtml(ast, options?).
To pin a specific version, use @0.1.2 in the URL. Without a version tag, unpkg serves the latest.
npm install
npm run build # outputs dist/ with ESM, CJS, IIFE, and .d.ts
npm test # runs vitest
npm publush #
import { renderToHtml } from 'flatmarkdown-ast2html';
// From a parsed AST object
const ast = {
type: 'document',
children: [
{
type: 'paragraph',
children: [
{ type: 'text', value: 'Hello ' },
{ type: 'strong', children: [{ type: 'text', value: 'world' }] },
],
},
],
};
const html = renderToHtml(ast);
// => '<p>Hello <strong>world</strong></p>\n'
// From a JSON string (e.g. directly from flatmarkdown CLI/WASM output)
const json = '{"type":"document","children":[{"type":"paragraph","children":[{"type":"text","value":"Hi"}]}]}';
const html2 = renderToHtml(json);
// => '<p>Hi</p>\n'
renderToHtml(ast, options?)function renderToHtml(ast: AstNode | string, options?: RenderOptions): string;
| Parameter | Type | Description |
|---|---|---|
ast | AstNode | string | Parsed AST object or JSON string |
options | RenderOptions | Optional rendering configuration |
Returns an HTML string.
RenderOptionsinterface RenderOptions {
wikilink?: WikiLinkOptions;
}
WikiLinkOptionsCustomize how [[wikilinks]] are rendered. This makes the output compatible with any routing library or framework.
interface WikiLinkOptions {
tagName?: string; // default: 'a'
urlAttr?: string; // default: 'href'
urlPrefix?: string; // default: ''
attrs?: Record<string, string>; // default: { 'data-wikilink': 'true' }
}
| Field | Default | Description |
|---|---|---|
tagName | 'a' | HTML/component tag name. Use 'Link' for React Router, 'A' for SolidJS, etc. |
urlAttr | 'href' | Attribute name for the URL. Use 'to' for React Router, 'routerLink' for Angular. |
urlPrefix | '' | String prepended to the wikilink URL value. |
attrs | { 'data-wikilink': 'true' } | Extra attributes on the tag. Replaces defaults when provided. |
Default — [[page-name|label]] renders as:
<a href="page-name" data-wikilink="true">label</a>
React Router:
renderToHtml(ast, {
wikilink: {
tagName: 'Link',
urlAttr: 'to',
urlPrefix: '/wiki/',
attrs: { className: 'wikilink', 'data-wikilink': 'true' },
},
});
<Link to="/wiki/page-name" className="wikilink" data-wikilink="true">label</Link>
URL prefix only:
renderToHtml(ast, {
wikilink: { urlPrefix: '/docs/' },
});
<a href="/docs/page-name" data-wikilink="true">label</a>
AST type | HTML |
|---|---|
document | Children concatenated (no wrapper) |
paragraph | <p>…</p> (omitted in tight lists) |
heading | <h1>–<h6> based on level |
code_block | <pre><code class="language-{info}">…</code></pre> |
block_quote | <blockquote>…</blockquote> |
multiline_block_quote | <blockquote>…</blockquote> |
list (bullet) | <ul>…</ul> |
list (ordered) | <ol start="{start}">…</ol> |
item | <li>…</li> |
task_item | <li><input type="checkbox" checked="" disabled="" />…</li> |
table | <table>…</table> |
table_row | <tr>…</tr> |
table_cell | <td>…</td> or <th>…</th> (header row), with align attr |
thematic_break | <hr /> |
html_block | Raw passthrough |
footnote_definition | <div class="footnote" id="fn-{name}">…</div> |
description_list | <dl>…</dl> |
description_term | <dt>…</dt> |
description_details | <dd>…</dd> |
alert | <div class="alert alert-{type}">…</div> |
front_matter | Skipped (not rendered) |
AST type | HTML |
|---|---|
text | HTML-escaped text |
softbreak | \n |
linebreak | <br /> |
emph | <em>…</em> |
strong | <strong>…</strong> |
strikethrough | <del>…</del> |
underline | <u>…</u> |
highlight | <mark>…</mark> |
superscript | <sup>…</sup> |
subscript | <sub>…</sub> |
spoilered_text | <span class="spoiler">…</span> |
code | <code>…</code> |
link | <a href="{url}" title="{title}">…</a> |
image | <img src="{url}" alt="…" title="{title}" /> |
wikilink | <a href="{url}" data-wikilink="true">…</a> (configurable) |
footnote_reference | <sup><a href="#fn-{name}">[{n}]</a></sup> |
shortcode | Emoji character directly |
math (inline) | <code class="math math-inline">…</code> |
math (display) | <pre><code class="math math-display">…</code></pre> |
html_inline | Raw passthrough |
escaped | Skipped |
escaped_tag | HTML-escaped value |
46 node types total, matching the flatmarkdown Rust crate output.
Block (23): document, paragraph, heading, code_block, block_quote, multiline_block_quote, list, item, task_item, table, table_row, table_cell, thematic_break, html_block, footnote_definition, description_list, description_item, description_term, description_details, alert, front_matter, heex_block, subtext
Inline (23): text, softbreak, linebreak, emph, strong, strikethrough, underline, highlight, superscript, subscript, spoilered_text, code, link, image, footnote_reference, shortcode, math, html_inline, heex_inline, raw, escaped, escaped_tag, wikilink
All node types are exported as individual TypeScript interfaces, plus the AstNode discriminated union.
MIT
FAQs
A library to convert FlatMarkdown AST to HTML.
We found that flatmarkdown-ast2html demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Socket CEO Feross Aboukhadijeh breaks down how North Korea hijacked Axios and what it means for the future of software supply chain security.

Security News
OpenSSF has issued a high-severity advisory warning open source developers of an active Slack-based campaign using impersonation to deliver malware.

Research
/Security News
Malicious packages published to npm, PyPI, Go Modules, crates.io, and Packagist impersonate developer tooling to fetch staged malware, steal credentials and wallets, and enable remote access.