MDEx

MDEx logo
Hex VersionHex DocsMIT

Fast and Extensible Markdown for Elixir.

Features

Examples

Livebook examples are available at Pages / Examples

Installation

Add :mdex dependency:

def deps do
[
{:mdex, "~> 0.8"}
]
end

Or use Igniter:

mix igniter.install mdex

Usage

iex> MDEx.to_html!("# Hello :smile:", extension: [shortcodes: true])
"<h1>Hello πŸ˜„</h1>"
iex> import MDEx.Sigil
iex> ~MD[
...> # Hello :smile:
...> ]HTML
"<h1>Hello πŸ˜„</h1>"
iex> import MDEx.Sigil
iex> ~MD[
...> # Hello :smile:
...> ]
%MDEx.Document{nodes: [%MDEx.Heading{nodes: [%MDEx.Text{literal: "Hello "}, %MDEx.ShortCode{code: "smile", emoji: "πŸ˜„"}], level: 1, setext: false}]}

Foundation

The library is built on top of:

Used By

Are you using MDEx and want to list your project here? Please send a PR!

Motivation

MDEx was born out of the necessity of parsing CommonMark files, to parse hundreds of files quickly, and to be easily extensible by consumers of the library.

Comparison

FeatureMDExEarmarkmdcmark
Activeβœ…βœ…βœ…βŒ
Pure ElixirβŒβœ…βœ…βŒ
Extensibleβœ…βœ…βœ…βŒ
Syntax Highlightingβœ…βŒβŒβŒ
Code Block Decoratorsβœ…βŒβŒβŒ
ASTβœ…βœ…βœ…βŒ
AST to Markdownβœ…βš οΈΒ²βŒβŒ
To HTMLβœ…βœ…βœ…βœ…
To JSONβœ…βŒβŒβŒ
To XMLβœ…βŒβŒβœ…
To ManpageβŒβŒβŒβœ…
To LaTeXβŒβŒβŒβœ…
Emojiβœ…βŒβŒβŒ
GFMΒ³βœ…βœ…βŒβŒ
GitLab⁴⚠️¹❌❌❌
Discord⁡⚠️¹❌❌❌
  1. Partial support
  2. Possible with earmark_reversal
  3. GitHub Flavored Markdown
  4. GitLab Flavored Markdown
  5. Discord Flavored Markdown

Benchmark

A simple script is available to compare existing libs:

Name ips average deviation median 99th %
cmark 7.17 K 0.139 ms Β±4.20% 0.138 ms 0.165 ms
mdex 2.71 K 0.37 ms Β±7.95% 0.36 ms 0.45 ms
md 0.196 K 5.11 ms Β±2.51% 5.08 ms 5.55 ms
earmark 0.0372 K 26.91 ms Β±2.09% 26.77 ms 30.25 ms
Comparison:
cmark 7.17 K
mdex 2.71 K - 2.65x slower +0.23 ms
md 0.196 K - 36.69x slower +4.98 ms
earmark 0.0372 K - 193.04x slower +26.77 ms

The most performance gain is using the ~MD sigil to compile the Markdown instead of parsing it at runtime, prefer using it when possible:

Comparison:
mdex_sigil_MD 176948.46 K
cmark 31.47 K - 5622.76x slower +31.77 ΞΌs
mdex_to_html/1 7.32 K - 24184.36x slower +136.67 ΞΌs
md 2.05 K - 86176.93x slower +487.01 ΞΌs
earmark 0.21 K - 855844.67x slower +4836.68 ΞΌs

To finish, a friendly reminder that all libs have their own strengths and trade-offs so use the one that better suits your needs.

Acknowledgements