Markdown parsing and rendering powered by the Rust comrak crate.
This package provides Elixir bindings for MDExNative.Comrak. It returns rendered HTML/XML directly and keeps the native NIF behind the public API.
Options mirror Rust comrak::Options
and can be passed as keyword lists. Nested :extension, :parse, and
:render options are validated in Elixir before crossing the NIF boundary.
Examples
iex> MDExNative.Comrak.markdown_to_html("# Hello")
"<h1>Hello</h1>\n"
iex> MDExNative.Comrak.markdown_to_html("- [x] done", extension: [tasklist: true])
"<ul>\n<li><input type=\"checkbox\" checked=\"\" disabled=\"\" /> done</li>\n</ul>\n"
iex> MDExNative.Comrak.anchorize("Hello World")
"hello-world"
Summary
Types
Heading anchor generated from text.
Parsed MDExNative.Comrak AST node.
Parsed fenced code block info string.
MDExNative.Comrak extension options.
Rendered HTML.
MDExNative.Comrak list marker style used by CommonMark rendering.
Markdown source text.
Comrak options accepted by markdown_to_html/2 and markdown_to_xml/2.
MDExNative.Comrak parse options.
MDExNative.Comrak render options.
Rendered CommonMark XML.
Functions
Converts text to a heading anchor.
Converts a generic MDExNative.Comrak document to CommonMark.
Converts a generic MDExNative.Comrak document to HTML.
Converts a generic MDExNative.Comrak document to XML.
Converts Markdown to HTML.
Converts Markdown to XML.
Parses a fenced code block info string into generic parts.
Parses Markdown into a generic MDExNative.Comrak AST.
Types
@type anchor() :: String.t()
Heading anchor generated from text.
@type ast_node() :: struct()
Parsed MDExNative.Comrak AST node.
@type code_fence_info() :: %{
language: String.t(),
metadata: String.t(),
attributes: %{required(String.t()) => String.t() | true}
}
Parsed fenced code block info string.
@type extension_options() :: keyword()
MDExNative.Comrak extension options.
@type html() :: String.t()
Rendered HTML.
@type list_style() :: :dash | :plus | :star
MDExNative.Comrak list marker style used by CommonMark rendering.
@type markdown() :: String.t()
Markdown source text.
@type options() :: keyword()
Comrak options accepted by markdown_to_html/2 and markdown_to_xml/2.
@type parse_options() :: keyword()
MDExNative.Comrak parse options.
@type render_options() :: keyword()
MDExNative.Comrak render options.
@type xml() :: String.t()
Rendered CommonMark XML.
Functions
@spec anchorize(String.t()) :: anchor()
Converts text to a heading anchor.
Examples
iex> MDExNative.Comrak.anchorize("Hello World")
"hello-world"
@spec document_to_commonmark(MDExNative.Comrak.Document.t(), options()) :: markdown()
Converts a generic MDExNative.Comrak document to CommonMark.
@spec document_to_html(MDExNative.Comrak.Document.t(), options()) :: html()
Converts a generic MDExNative.Comrak document to HTML.
@spec document_to_xml(MDExNative.Comrak.Document.t(), options()) :: xml()
Converts a generic MDExNative.Comrak document to XML.
Converts Markdown to HTML.
Options
Pass Comrak options as a keyword list matching Rust
comrak::Options,
with any of these top-level keys:
:extension- MDExNative.ComrakExtensionOptionsoptions, for exampletasklist: true,table: true,autolink: true, orheader_id_prefix: "prefix-".:parse- MDExNative.ComrakParseOptionsoptions, for examplesmart: true.:render- MDExNative.ComrakRenderOptionsoptions, for exampleunsafe: true,hardbreaks: true, orsourcepos: true.:syntax_highlight- syntax highlighting options produced byMDExNative.Lumis. When present, the native RustLumisAdapteris installed as Comrak'sSyntaxHighlighterAdapterfor fenced code blocks.
The accepted option keys are defined by options/0, extension_options/0,
parse_options/0, and render_options/0.
Examples
iex> MDExNative.Comrak.markdown_to_html("**bold**")
"<p><strong>bold</strong></p>\n"
iex> MDExNative.Comrak.markdown_to_html("- [x] done", extension: [tasklist: true])
"<ul>\n<li><input type=\"checkbox\" checked=\"\" disabled=\"\" /> done</li>\n</ul>\n"
Converts Markdown to XML.
Examples
iex> MDExNative.Comrak.markdown_to_xml("# Hello")
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE document SYSTEM \"CommonMark.dtd\">\n<document xmlns=\"http://commonmark.org/xml/1.0\">\n <heading level=\"1\">\n <text xml:space=\"preserve\">Hello</text>\n </heading>\n</document>\n"
iex> MDExNative.Comrak.markdown_to_xml("# Hello", render: [sourcepos: true])
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE document SYSTEM \"CommonMark.dtd\">\n<document sourcepos=\"1:1-1:7\" xmlns=\"http://commonmark.org/xml/1.0\">\n <heading sourcepos=\"1:1-1:7\" level=\"1\">\n <text sourcepos=\"1:3-1:7\" xml:space=\"preserve\">Hello</text>\n </heading>\n</document>\n"
@spec parse_code_fence_info(String.t() | nil) :: code_fence_info()
Parses a fenced code block info string into generic parts.
The first word is returned as the language, the remaining text is preserved as metadata, and shell-like tokens in the metadata are exposed as attributes.
Examples
iex> MDExNative.Comrak.parse_code_fence_info(~s(elixir pre_class="demo" highlight_lines=2 include_highlights))
%{
language: "elixir",
metadata: ~s(pre_class="demo" highlight_lines=2 include_highlights),
attributes: %{
"pre_class" => "demo",
"highlight_lines" => "2",
"include_highlights" => true
}
}
iex> MDExNative.Comrak.parse_code_fence_info("")
%{language: "", metadata: "", attributes: %{}}
@spec parse_document(markdown(), options()) :: MDExNative.Comrak.Document.t()
Parses Markdown into a generic MDExNative.Comrak AST.
Examples
iex> MDExNative.Comrak.parse_document("# Hello")
%MDExNative.Comrak.Document{
nodes: [
%MDExNative.Comrak.Heading{
nodes: [
%MDExNative.Comrak.Text{literal: "Hello", sourcepos: %MDExNative.Comrak.Sourcepos{start: {1, 3}, end: {1, 7}}}
],
level: 1,
setext: false,
sourcepos: %MDExNative.Comrak.Sourcepos{start: {1, 1}, end: {1, 7}}
}
],
sourcepos: %MDExNative.Comrak.Sourcepos{start: {1, 1}, end: {1, 7}}
}