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.0-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.0-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.0-cp39-abi3-macosx_11_0_arm64.whl (145.1 kB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

multimark-0.3.0-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.0-cp39-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for multimark-0.3.0-cp39-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 7b3865a9eaded063731546da8d38b5ef08c6a14f70bd9746eca9d861d197d02e
MD5 f33b56c6afbd3287a3ac90fb85fd1ecb
BLAKE2b-256 bc889c842006b0ba3d55c5123dbd40d661506c5e11856f9fa3b5b9e58d8c77f5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for multimark-0.3.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7d80b9160d79867399e9ddacbeecad51e742bd29d5733cdbb61cec1e974cabb5
MD5 3b8db8d8c3e8c8c3eb558c027692a448
BLAKE2b-256 65d99086f5d0c654e0776817d004600be7f960aa489f223316e07a1c74613c79

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for multimark-0.3.0-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2b0dcaac38294d5a9509f68221598b57006cc326f7fcd17aacf8e8b41539c84b
MD5 eb1cdd5bd17b7df8addfcbf5f9c2feac
BLAKE2b-256 4822528d9610aa2774fc31cb31b0d24cdddd14ef7d051120730e12d94203747d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for multimark-0.3.0-cp39-abi3-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1ee5256c5af294a2838341b61156e2b251635b92a23788a52bade99951cb9a18
MD5 b3411ca046cf6f09850a39c2a06f28d6
BLAKE2b-256 db0ae4be885b0409715c2b75e6337e16ac3ce9d0d8d80c1b64b2df14268984c7

See more details on using hashes here.

Release history Release notifications | RSS feed

0.3.2

6 files

0.3.1

4 files

This release

0.3.0 This release

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