# Changelog This log documents all Python API or CLI breaking backwards incompatible changes. Note that there is currently no guarantee for a stable Markdown formatting style across versions. ## 0.7.22 - Performance - Improved import time and performance of CLI invocations that do not format Markdown. - Fixed - No longer mutate cached TOML options or `_conf.DEFAULT_OPTS`. This should avoid some hard to debug issues in plugins' tests. - Added - `cache_toml` keyword argument to `_cli.run` for disabling TOML caching. This is useful in tests written for plugins. ## 0.7.21 - Fixed - Circular import in plugins that import from `mdformat.renderer`. ## 0.7.20 **NOTE:** This release was yanked from PyPI. - Deprecated - `mdformat.codepoints.ASCII_WHITESPACE`. CommonMark no longer defines this since v0.30. - Added - `--no-validate` flag for disabling the AST safety check. Thank you, [Kyle King](https://github.com/KyleKing), for the PR. - Added the delete control character to `mdformat.codepoints.ASCII_CTRL` as per CommonMark v0.30 - Fixed - The AST safety check not triggering when a code formatter plugin is in use, two or more code blocks are in the same file, and unsafe formatting happens in between the code blocks. ## 0.7.19 - Deprecated - Plugin interface: `mdformat.plugins.ParserExtensionInterface.add_cli_options`. The replacing interface is `mdformat.plugins.ParserExtensionInterface.add_cli_argument_group`. - Fixed - Incorrect line wrap on lines right after a hard break. Thank you, [MDW](https://github.com/mdeweerd), for the issue. - Adding an extra leading space to paragraphs that start with space in line wrap modes. - An error on empty paragraph (Unicode space only) surrounded by non-paragraph elements. Thank you, [Nico Schlömer](https://github.com/nschloe), for the issue. - Added - Plugin interface: `mdformat.plugins.ParserExtensionInterface.add_cli_argument_group`. With this plugins can now read CLI arguments merged with values from `.mdformat.toml`. - Option to select enabled (and required) extensions and code formatter languages (`--extensions` and `--codeformatters` on the CLI, and `extensions` and `codeformatters` keys in TOML). - Improved plugin list at the end of `--help` output: List languages supported by codeformatter plugin distributions, and parser extensions added by parser extension distributions. - Changed - Style: No longer escape square bracket enclosures. - Style: No longer escape less than sign followed by space character. - Style: Convert tabs to spaces. Reduce space sequences to one space. - Improved - Plugin interface: A trailing newline is added to fenced code blocks if a plugin fails to add it. ## 0.7.18 - Added - Option to exclude file paths using Unix-style glob patterns (`--exclude` on the CLI and `exclude` key in TOML). This feature is Python 3.13+ only. Thank you, [J. Sebastian Paez](https://github.com/jspaezp), for the issue. - Removed - Python 3.8 support ## 0.7.17 - Added - Do not update mtime if formatting result is identical to the file. Thank you, [Pierre Augier](https://github.com/paugier), for the issue and the PR. - Fixed - An error on empty paragraph (Unicode space only). Thank you, [Nico Schlömer](https://github.com/nschloe), for the issue. - File write fails if no permissions to write to the directory. Fixed by removing atomic writes. Thank you, [Guy Kisel](https://github.com/guykisel), for the issue. - File permissions change on rewrite. Thank you, [Keiichi Watanabe](https://github.com/keiichiw), for the issue. - Removed - Python 3.7 support ## 0.7.16 - Added - Option to keep line ending sequence from source file (`--end-of-line=keep`). Thank you, [Mark Tsuchida](https://github.com/marktsuchida), for the issue and [Jan Wille](https://github.com/Cube707) for the PR. - Fixed - `--check` not working with `--end-of-line=crlf`. Thank you, [Jan Wille](https://github.com/Cube707), for the issue. - Insignificant Unicode whitespace causing unstable formatting. Thank you, [Yamada_Ika](https://github.com/Yamada-Ika), for the issue. ## 0.7.15 - Fixed - `--wrap` converts Unicode whitespace to regular spaces and line feeds. Thank you, [Nico Schlömer](https://github.com/nschloe), for the issue. - Packaging - Use `setuptools` as build backend ## 0.7.14 - Added - Accept `os.PathLike[str]` as `mdformat.file` input. - Improved - Add filepath to warning message on code formatter plugin error. - Use `tomllib` in Python 3.11+. - Changed - Style: Sort numeric link references numerically. Thank you [Ryan Delaney](https://github.com/rpdelaney) for the PR. ## 0.7.13 - Fixed - Don't indent inline HTML that looks like type 7 block HTML. Thank you [Philip May](https://github.com/PhilipMay) for the issue. ## 0.7.12 - Fixed - Fix unstable formatting when a paragraph line starts with inline HTML. Thank you [Gabriel Nützi](https://github.com/gabyx) for the issue. ## 0.7.11 - Added - Support for `markdown-it-py` v2 - Fixed - Fix an error when a code fence info string starts with a tilde or a backtick. Thank you [Jonathan Newnham](https://github.com/jnnnnn) for the issue. ## 0.7.10 - Added - Support for configuration in a `.mdformat.toml` file - Removed - Python 3.6 support ## 0.7.9 - Fixed - Fix an error when an autolink contains URL encoded spaces. Thank you [Chris Butler](https://github.com/butler54) for the issue. ## 0.7.8 - Fixed - Fix a case where indented Markdown nested inside indented raw HTML tags would alter AST. Thank you [Jirka Borovec](https://github.com/Borda) for the issue. ## 0.7.7 - Fixed - Output `lf` line endings on all platforms. Thank you [Scott Gudeman](https://github.com/DragonCrafted87) for the issue and the PR. - Added - Configuration option for outputting `crlf` line endings: `--end-of-line=crlf` - Resolve symlinks and modify the link destination file only. ## 0.7.6 - Changed - Style: Reduce wrap width by indent size in lists and quotes ## 0.7.5 - Fixed - Error rendering a hard break in a heading - Some obscure leading/trailing whitespace issues - Style: Convert image description newlines to spaces in wrap altering modes ## 0.7.4 - Added - `mdformat.renderer.WRAP_POINT` for plugins to show where word wrap is allowed to occur. - `mdformat.renderer.RenderContext.do_wrap` for plugins to check whether word wrap is enabled. - Changed - Style: Emphasis and strong emphasis are now wrapped. - Style: Word wrap width target is now respected more precisely in a few edge cases. ## 0.7.3 - Fixed - Style: Convert link text newlines to spaces in wrap altering modes. - Changed - Style: No longer escape line starting hashes not followed by a space. ## 0.7.2 - Fixed - Style: Stop adding a newline character to empty documents. ## 0.7.1 - Added - `RenderContext.with_default_renderer_for`: A convenience method for copying a render context with a set of renderers set to defaults ## 0.7.0 **NOTE:** Parser extension plugin API has changed in this release. - Added - `POSTPROCESSORS` mapping to parser extension plugin API (i.e. `ParserExtensionInterface`), providing a way for plugins to render syntax collaboratively. - `Postprocess` type alias to `mdformat.renderer.typing` - `mdformat.renderer.RenderContext`: a context object passed as input to `Render` and `Postprocess` functions - Changed - Renamed `ParserExtensionInterface.RENDERER_FUNCS` as `ParserExtensionInterface.RENDERERS` - Renamed `mdformat.renderer.typing.RendererFunc` as `mdformat.renderer.typing.Render` - `mdformat.renderer.typing.Render` signature changed. Now takes `RenderContext` as input. - Renamed `mdformat.renderer.DEFAULT_RENDERER_FUNCS` as `mdformat.renderer.DEFAULT_RENDERERS` ## 0.6.4 - Fixed - Warnings being printed twice when wrap mode is other than "keep" ([#167](https://github.com/hukkin/mdformat/pull/167)) - An extra newline being added when consecutive lines' width equals wrap width ([#166](https://github.com/hukkin/mdformat/pull/166)) ## 0.6.3 - Added - A list of installed plugins and their versions in the output of `--help` and `--version` CLI commands - `mdformat.codepoints` as public API ## 0.6.2 - Added - Sphinx docs - Atomic file writes. Markdown content now stays on disk every nanosecond of the formatting process. ## 0.6.1 - Fixed - A line starting blockquote marker (">") is now escaped. ## 0.6.0 **NOTE:** Parser extension plugin API has changed in this release. - Removed - `mdformat.renderer.MARKERS` - `mdformat.plugins.ParserExtensionInterface.render_token` - `start` and `stop` keyword arguments removed from `mdformat.renderer.MDRenderer.render`. Use `mdformat.renderer.MDRenderer.render_tree` to render a part of a Markdown document. - Added - Modes for setting a word wrap width and removing word wrap - `mdformat.plugins.ParserExtensionInterface.RENDERER_FUNCS` - A class for representing linear `markdown-it` token stream as a tree: `mdformat.renderer.RenderTreeNode` - `mdformat.renderer.MDRenderer.render_tree` for rendering a `RenderTreeNode` ## 0.5.7 - Fixed - CLI crash when formatting standard error output and the operating system reports a terminal window width of zero or less ([#131](https://github.com/hukkin/mdformat/issues/131)). Thank you [ehontoria](https://github.com/ehontoria) for the issue. ## 0.5.6 - Changed - Style: Reduce asterisk escaping ([#120](https://github.com/hukkin/mdformat/issues/120)) - Style: Reduce underscore escaping ([#119](https://github.com/hukkin/mdformat/issues/119)). Thank you [dustinmichels](https://github.com/dustinmichels) for the issue. ## 0.5.5 - Changed - Style: Don't convert shortcut reference links into full reference links ([#111](https://github.com/hukkin/mdformat/issues/111)) ## 0.5.4 - Changed - Style: Reduce hash (`#`) escaping ## 0.5.0 - Changed - Style: Convert list marker types. Prefer "-" for bullet lists and "." for ordered lists. - Style: Remove trailing whitespace from empty list items. ## 0.4.0 - Changed - Style: Only surround link destination with angle brackets if required by CommonMark spec - Style: Thematic breaks are now 70 characters wide ## 0.3.5 - Fixed - Markdown equality validation falsely triggering when code formatter plugins were used. Thanks [chrisjsewell](https://github.com/chrisjsewell) for writing the tests to find the bug. ## 0.3.3 - Added - `CHANGES_AST` to extension plugin API. The feature allows plugins that alter Markdown AST to skip validation ([#49](https://github.com/hukkin/mdformat/pull/49)). ## 0.3.2 - Changed - Style: Keep reference links as reference links ([#32](https://github.com/hukkin/mdformat/issues/32)). Thank you [chrisjsewell](https://github.com/chrisjsewell) for the issue and the PR. - Added - Option to number ordered list items consecutively using the `--number` flag ([#33](https://github.com/hukkin/mdformat/issues/33)). Thank you [chrisjsewell](https://github.com/chrisjsewell) for the issue and the PR. - Parser extension plugins can now add their own CLI / Python API options ([#35](https://github.com/hukkin/mdformat/pull/35)). Thanks [chrisjsewell](https://github.com/chrisjsewell) for the PR. - Fixed - Image links that require surrounding angle brackets no longer break formatting ([#40](https://github.com/hukkin/mdformat/issues/40)). ## 0.3.1 - Added - Plugin system for extending the parser ([#13](https://github.com/hukkin/mdformat/issues/13)). Thank you [chrisjsewell](https://github.com/chrisjsewell) for the issue and the PR. - Exported `mdformat.renderer.MDRenderer` and `mdformat.renderer.MARKERS` ## 0.3.0 - Changed - Code formatter plugin function signature changed to `Callable[[str, str], str]`. The second input argument is full info string of the code block. ## 0.2.0 - Changed - Style: Use backtick for code fences whenever possible ## 0.1.2 - Added - Support for code formatter plugins ## 0.1.0 - Added - Initial mdformat release