MDExNative.Comrak (MDExNative v0.1.0)

Copy Markdown View Source

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

anchor()

@type anchor() :: String.t()

Heading anchor generated from text.

ast_node()

@type ast_node() :: struct()

Parsed MDExNative.Comrak AST node.

code_fence_info()

@type code_fence_info() :: %{
  language: String.t(),
  metadata: String.t(),
  attributes: %{required(String.t()) => String.t() | true}
}

Parsed fenced code block info string.

extension_options()

@type extension_options() :: keyword()

MDExNative.Comrak extension options.

html()

@type html() :: String.t()

Rendered HTML.

list_style()

@type list_style() :: :dash | :plus | :star

MDExNative.Comrak list marker style used by CommonMark rendering.

markdown()

@type markdown() :: String.t()

Markdown source text.

options()

@type options() :: keyword()

Comrak options accepted by markdown_to_html/2 and markdown_to_xml/2.

parse_options()

@type parse_options() :: keyword()

MDExNative.Comrak parse options.

render_options()

@type render_options() :: keyword()

MDExNative.Comrak render options.

xml()

@type xml() :: String.t()

Rendered CommonMark XML.

Functions

anchorize(text)

@spec anchorize(String.t()) :: anchor()

Converts text to a heading anchor.

Examples

iex> MDExNative.Comrak.anchorize("Hello World")
"hello-world"

document_to_commonmark(document, options \\ [])

@spec document_to_commonmark(MDExNative.Comrak.Document.t(), options()) :: markdown()

Converts a generic MDExNative.Comrak document to CommonMark.

document_to_html(document, options \\ [])

@spec document_to_html(MDExNative.Comrak.Document.t(), options()) :: html()

Converts a generic MDExNative.Comrak document to HTML.

document_to_xml(document, options \\ [])

@spec document_to_xml(MDExNative.Comrak.Document.t(), options()) :: xml()

Converts a generic MDExNative.Comrak document to XML.

markdown_to_html(markdown, options \\ [])

@spec markdown_to_html(markdown(), options()) :: html()

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.Comrak ExtensionOptions options, for example tasklist: true, table: true, autolink: true, or header_id_prefix: "prefix-".
  • :parse - MDExNative.Comrak ParseOptions options, for example smart: true.
  • :render - MDExNative.Comrak RenderOptions options, for example unsafe: true, hardbreaks: true, or sourcepos: true.
  • :syntax_highlight - syntax highlighting options produced by MDExNative.Lumis. When present, the native Rust LumisAdapter is installed as Comrak's SyntaxHighlighterAdapter for 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"

markdown_to_xml(markdown, options \\ [])

@spec markdown_to_xml(markdown(), options()) :: xml()

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"

parse_code_fence_info(info)

@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: %{}}

parse_document(markdown, options \\ [])

@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}}
}