Skip to main content

multimark

PyPI Python versions Downloads MIT License CI

The multimark package has Python bindings to cmark-gfm, the C reference implementation of CommonMark with GitHub Flavored Markdown extensions.

Renders Markdown to HTML, LaTeX, groff man, XML, and normalized CommonMark: all from a single, lightweight package.

Installation

pip install multimark

Wheels are available for Linux, macOS, and Windows (Python 3.9+). No system dependencies required.

Quick Start

from multimark import markdown_to_html, markdown_to_latex

html = markdown_to_html("**Hello**, *world*!")
# '<p><strong>Hello</strong>, <em>world</em>!</p>\n'

latex = markdown_to_latex("**Hello**, *world*!")
# '\\textbf{Hello}, \\emph{world}!\n'

Renderers

Function Output Format
markdown_to_html() HTML
markdown_to_latex() LaTeX
markdown_to_man() groff man page
markdown_to_commonmark() Normalized CommonMark
markdown_to_xml() XML (AST representation)

Options

Use named boolean keyword arguments for common settings:

from multimark import markdown_to_html, markdown_to_latex

# Smart punctuation (curly quotes, em-dashes)
markdown_to_html('"Hello" -- world...', smart=True)
# '<p>\u201cHello\u201d \u2013 world\u2026</p>\n'

# Allow raw HTML passthrough (safe mode is the default)
markdown_to_html('<div>hi</div>', unsafe=True)
# '<div>hi</div>\n'

# Source position attributes
markdown_to_html('**Hello**', sourcepos=True)
# '<p data-sourcepos="1:1-1:9"><strong>Hello</strong></p>\n'

# Line wrapping (LaTeX, man, and commonmark renderers)
markdown_to_latex('**Hello**, *world*!', width=80)
# '\\textbf{Hello}, \\emph{world}!\n'

# Footnotes
markdown_to_html('Text[^1]\n\n[^1]: A footnote\n', footnotes=True)
# '<p>Text<sup class="footnote-ref">...</sup></p>\n<section class="footnotes">...\n'

Or compose flags with the Options bitmask:

from multimark import markdown_to_html, Options

html = markdown_to_html(text, options=Options.SMART | Options.UNSAFE)

GFM Extensions

Enable GitHub Flavored Markdown extensions by name:

from multimark import markdown_to_html

# Tables
markdown_to_html('| A | B |\n|---|---|\n| 1 | 2 |\n', extensions=["table"])
# '<table>\n<thead>\n<tr>\n<th>A</th>\n<th>B</th>\n</tr>...\n'

# Strikethrough
markdown_to_html('~~deleted~~', extensions=["strikethrough"])
# '<p><del>deleted</del></p>\n'

# Multiple extensions
html = markdown_to_html(text, extensions=["table", "strikethrough", "autolink", "tasklist", "tagfilter"])

Available extensions: table, strikethrough, autolink, tagfilter, tasklist.

All Renderer Parameters

Every renderer accepts:

  • text: Markdown string
  • options: raw bitmask (default 0)
  • extensions: list of GFM extension names (default ())
  • smart: smart punctuation
  • hardbreaks: render soft breaks as <br>
  • unsafe: allow raw HTML
  • normalize: consolidate adjacent text nodes
  • footnotes: enable footnote syntax

Additional parameters:

  • sourcepos: Source position attributes (HTML and XML only)
  • width: Line wrap column (LaTeX, man, and commonmark only; 0 = no wrap)

Why multimark?

Several Python packages wrap cmark or provide CommonMark parsing. Here's how they compare:

multimark cmarkgfm commonmark.py
Engine cmark-gfm (C, vendored) cmark-gfm (C, vendored) Pure Python
Output formats HTML, LaTeX, man, XML, CommonMark HTML only HTML only
GFM extensions
Safe by default
Convenience kwargs smart=True, unsafe=True, etc. Raw bitmask only N/A
Performance Fastest (14% faster than cmarkgfm) Fast ~31× slower
Maintained Active (2026) Active (2025) Unmaintained (2019)

multimark uses the same battle-tested C library as cmarkgfm but exposes all five of cmark's output formats (not just HTML). The API is designed around keyword arguments rather than opaque bitmasks, and unsafe content is blocked by default so the safe choice requires no extra configuration.

Thanks to extension pointer caching and reduced Python-side overhead, multimark is the fastest Python Markdown-to-HTML library. Take a look at the benchmarks for more detail on this.

License

MIT and BSD-2-Clause (cmark-gfm).

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

multimark-0.3.1-cp39-abi3-musllinux_1_2_x86_64.whl (497.3 kB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ x86-64

multimark-0.3.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (495.4 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ x86-64

multimark-0.3.1-cp39-abi3-macosx_11_0_arm64.whl (145.1 kB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

multimark-0.3.1-cp39-abi3-macosx_10_9_x86_64.whl (149.4 kB view details)

Uploaded CPython 3.9+macOS 10.9+ x86-64

File details

Details for the file multimark-0.3.1-cp39-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for multimark-0.3.1-cp39-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4472e44a3a9b1ff6a944e9d09689d75ac939976a40fe269a0922c60cd0154600
MD5 6264c222a0202eae2f886a2562023303
BLAKE2b-256 2d9da98d2ffefc217730d9f7a7a520475348d5b0ca2f16ae1f3d4892e16208f5

See more details on using hashes here.

File details

Details for the file multimark-0.3.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for multimark-0.3.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3e7a339af51fa77b018aca2a5603cb74e1d868abea3a7893d50d365323c0c99e
MD5 7ff53eb8ddcaa3bd7f1d7efb86519dca
BLAKE2b-256 c212e49d2b5eeb596248e13e83f98799ec8dd9126d004e90f8ee7f89ea471446

See more details on using hashes here.

File details

Details for the file multimark-0.3.1-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for multimark-0.3.1-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 94a41675e83a106e759b561332bc8c9f5a846f556abb5fd6edc9a9c0b3aa0973
MD5 0730d9be35356caa02c5bb30346af341
BLAKE2b-256 5b8a7ab6ab38992a483c879e8209188c48ae3f85cbc419c8d58a1368cee030bb

See more details on using hashes here.

File details

Details for the file multimark-0.3.1-cp39-abi3-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for multimark-0.3.1-cp39-abi3-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 74840278d07352812c6fe9e41f2d33cced7bbd4f9c90cdec0176799b228d6358
MD5 a636e5f3e770ded16d1056faa4cd3c2c
BLAKE2b-256 e4cfdf867ab12388411ed889eabe62f628e186551e398c3466ce605b89b0d8e0

See more details on using hashes here.

Release history Release notifications | RSS feed

0.3.2

6 files

This release

0.3.1 This release

4 files

0.3.0

4 files

0.2.0

26 files

0.1.3

26 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page