NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #279 most downloaded on PyPI
Python implementation of John Gruber's Markdown.
Last release 9 days ago
25 Sep 2026
Ships fairly regularly
a new release about every 2 months
Some releases are documented
notes for 24 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
19 years old
62 releases · first in 2008
Nothing published for this version
Fix SetextHeaderProcessor regex to prevent mixed = and - chars in setext-style headers ( #1606 ).
One column per quarter.
Fix a regression related to comment handling ( #1590 ).
Ensure nested elements inside inline comments are properly unescaped ( #1571 ).
Nothing published for this version
Nothing published for this version
Fix codecs deprecation in Python 3.14.
codecs deprecation in Python 3.14.<foo and Python 3.14.Fix codecs deprecation in Python 3.14 ( #1537 ).
Fix issue with unclosed comment parsing in Python 3.14 ( #1537 ).
Fix issue with unclosed declarations in Python 3.14 ( #1537 ).
Fix issue with unclosed HTML tag <foo and Python 3.14 ( #1537 ).
Ensure incomplete markup declaration in raw HTML doesn't crash parser ( #1534 ).
DRY fix in abbr extension by introducing method create_element ( #1483 ).
abbr extension by introducing method create_element (#1483).attr_list on toc (#1493).md_in_html processes content inside "markdown" blocks as they aremd_in_html handle tags within inline code blocks better (#1075).md_in_html fix handling of one-liner block HTML handling (#1074).<center> is treated like a block-level element (#1481).abbr extension respects AtomicString and does not processsmarty extension correctly renders nested closing quotes (#1514).A new AbbrTreeprocessor has been introduced, which replaces the now deprecated AbbrInlineProcessor . Abbreviation processing now happens after Attribu…
abbr ExtensionA new AbbrTreeprocessor has been introduced, which replaces the now deprecated
AbbrInlineProcessor. Abbreviation processing now happens after Attribute Lists,
avoiding a conflict between the two extensions (#1460).
The AbbrPreprocessor class has been renamed to AbbrBlockprocessor, which
better reflects what it is. AbbrPreprocessor has been deprecated.
A call to Markdown.reset() now clears all previously defined abbreviations.
Abbreviations are now sorted by length before executing AbbrTreeprocessor
to ensure that multi-word abbreviations are implemented even if an abbreviation
exists for one of those component words. (#1465)
Abbreviations without a definition are now ignored. This avoids applying
abbr tags to text without a title value.
Added an optional glossary configuration option to the abbreviations extension.
This provides a simple and efficient way to apply a dictionary of abbreviations
to every page.
Abbreviations can now be disabled by setting their definition to "" or ''.
This can be useful when using the glossary option.
The functions get_name and stashedHTML2text defined in the toc extension are both deprecated . Instead, third party extensions should use some combina…
striptags is provided to convert headings to plain text.markupsafe implementation, HTML entities are not unescaped.name, rich html, and unescaped raw data-toc-label aretoc_tokens, allowing users to access the full rich text content oftoc_tokens.data-toc-label is sanitized separate from heading contentname. This fixes a bug which allowed markup throughtoken['data-toc-label'] directly.html.unescape call is made just prior to calling slugify so thatslugify only operates on Unicode characters. Note that html.unescape isname, html, or data-toc-label.get_name and stashedHTML2text defined in the toc extensionrun_postprocessors, render_inner_html andstriptags.scripts/*.py in the generated source tarballs (#1430).^) and square brackets (]) but explicitly exclude\) from abbreviations (#1444).attr_list, fenced_code), quoted attribute values are}) (#1414).Fix type annotations for convertFile - it accepts only bytes-based buffers. Also remove legacy checks from Python 2
Fix type annotations for convertFile - it accepts only bytes-based buffers. Also remove legacy checks from Python 2 ( #1400 )
Remove legacy import needed only in Python 2 ( #1403 )
Fix typo that left the attribute AdmonitionProcessor.content_indent unset ( #1404 )
Fix edge-case crash in InlineProcessor with AtomicString ( #1406 ).
Fix edge-case crash in codehilite with an empty code tag ( #1405 ).
Improve and expand type annotations in the code base ( #1401 ).
Fix handling of bogus comments ( #1425 ).
Fix a performance problem with HTML extraction where large HTML input could trigger quadratic line counting behavior ( #1392 ).
Fix a performance problem with HTML extraction where large HTML input could trigger quadratic line counting behavior ( #1392 ).
Improve and expand type annotations in the code base ( #1394 ).
Nothing published for this version
Add a special case for initial 's to smarty extension ( #1305 ).
Add a special case for initial 's to smarty extension ( #1305 ).
Unescape any backslash escaped inline raw HTML ( #1358 ).
Unescape backslash escaped TOC token names ( #1360 ).
Restore console script ( #1327 ).
Officially support Python 3.11.
Officially support Python 3.11.
Improve standalone * and _ parsing ( #1300 ).
Consider <html> HTML tag a block-level element ( #1309 ).
Switch from setup.py to pyproject.toml .
Fix an import issue with importlib.util ( #1274 ).
Nothing published for this version
Disallow square brackets in reference link ids ( #1209 ).
Disallow square brackets in reference link ids ( #1209 ).
Retain configured pygments_style after first code block ( #1240 ).
Ensure fenced code attributes are properly escaped ( #1247 ).
Fix a dependency issue ( #1195 , #1196 ).
Make the slugify_unicode function not remove diacritical marks ( #1118 ).
Make the slugify_unicode function not remove diacritical marks ( #1118 ).
Fix [toc] detection when used with nl2br extension ( #1160 ).
Re-use compiled regex for block level checks ( #1169 ).
Don’t process shebangs in fenced code blocks when using CodeHilite ( #1156 ).
Improve email address validation for Automatic Links ( #1165 ).
Ensure <summary> tags are parsed correctly ( #1079 ).
Support Python 3.10 ( #1124 ).
Properly parse unclosed tags in code spans ( #1066 ).
Properly parse unclosed tags in code spans ( #1066 ).
Properly parse processing instructions in md_in_html ( #1070 ).
Properly parse code spans in md_in_html ( #1069 ).
Preserve text immediately before an admonition ( #1092 ).
Simplified regex for HTML placeholders ( #928 ) addressing ( #932 ).
Ensure permalinks and anchorlinks are not restricted by toc_depth ( #1107 ).
Fix corner cases with lists under admonitions ( #1102 ).
Unify all block-level tags ( #1047 ).
Unify all block-level tags ( #1047 ).
Fix issue where some empty elements would have text rendered as None when using md_in_html ( #1049 ).
Avoid catastrophic backtracking in hr regex ( #1055 ).
Fix hr HTML handling ( #1053 ).
Properly parse inline HTML in md_in_html ( #1040 & #1045 ).
Properly parse inline HTML in md_in_html ( #1040 & #1045 ).
Avoid crashing when md_in_html fails ( #1040 ).
Correctly parse raw script and style tags ( #1036 ).
Correctly parse raw script and style tags ( #1036 ).
Ensure consistent class handling by fenced_code and codehilite ( #1032 ).
Nothing published for this version
Add checklinks tox environment to ensure all links in documentation are good.
Add checklinks tox environment to ensure all links in documentation are good.
Refactor extension API documentation ( #729 ).
Load entry_points (for extensions) only once using importlib.metadata .
Do not double escape entities in TOC.
Correctly report if an extension raises a TypeError ( #939 ).
Raise a KeyError when attempting to delete a nonexistent key from the extension registry ( #939 ).
Remove import of packaging (or pkg_resources fallback) entirely.
Remove setuptools as a run-time dependency ( install_required ).
The name property in toc_tokens from the TOC extension now escapes HTML special characters ( < , > , and & ).
Nothing published for this version
Fixed import failure in setup.py when the source directory is not on sys.path ( #823 ).
Fixed import failure in setup.py when the source directory is not on sys.path ( #823 ).
Prefer public packaging module to pkg_resources’ private copy of it ( #825 ).
Nothing published for this version
Brought back the version and version_info variables ( #709 ).
Brought back the version and version_info variables ( #709 ).
Added support for hexadecimal HTML entities ( #712 ).
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →