This is the first beta release of the stable v1.x series.
There are four notable (and breaking) changes:
- The code has been synchronised with the upstream Markdown-It v12.0.4. In particular, this update alters the parsing of tables to be consistent with the GFM specification: https://github.github.com/gfm/#tables-extension- A number of parsing performance and validation improvements are also included.
Token.attrsare now stored as dictionaries, rather than a list of lists. This is a departure from upstream Markdown-It, allowed by Pythons guarantee of ordered dictionaries (see #142), and is the more natural representation. NoteattrGet,attrSet,attrPushandattrJoinmethods remain identical to those upstream, andToken.as_dict(as_upstream=True)will convert the token back to a directly comparable dict.- The use of
AttrDicthas been replaced: Forenvany Python mutable mapping is now allowed, and so attribute access to keys is not (differing from the Javascript dictionary). ForMarkdownIt.optionsit is now set as anOptionsDict, which is a dictionary sub-class, with attribute access only for core MarkdownIt configuration keys. - Introduction of the
SyntaxTreeNode. This is a more comprehensive replacement fornest_tokensandNestedTokens(which are now deprecated). It allows for theTokenstream to be converted to/from a nested tree structure, with opening/closing tokens collapsed into a singleSyntaxTreeNodeand the intermediate tokens set as children. See Creating a syntax tree documentation for details.
- Fix exception due to empty lines after blockquote+footnote
- Fix linkify link nesting levels
- Fix the use of
Ruler.atfor plugins - Avoid fenced token mutations during rendering
- Fix CLI version info and correct return of exit codes
This release brings Markdown-It-Py inline with Markdown-It v11.0.1 (2020-09-14), applying two fixes:
Thanks to @hukkinj1!
This release provides some improvements to the code base:
- 🐛 FIX: Do not resolve backslash escapes inside auto-links
- 🐛 FIX: Add content to image tokens
- 👌 IMPROVE: Add more type annotations, thanks to @hukkinj1
🗑 DEPRECATE: Move plugins to mdit_py_plugins
Plugins (in markdown_it.extensions) have now been moved to executablebooks/mdit-py-plugins.
This will allow for their maintenance to occur on a different cycle to the core code, facilitating the release of a v1.0.0 for this package
🔧 MAINTAIN: Add mypy type-checking, thanks to @hukkinj1.
✨ NEW: Add linkify, thanks to @tsutsu3.
This extension uses linkify-it-py to identify URL links within text:
github.com-><a href="http://github.com">github.com</a>
Important: To use this extension you must install linkify-it-py; pip install markdown-it-py[linkify]
It can then be activated by:
from markdown_it import MarkdownIt
md = MarkdownIt().enable("linkify")
md.options["linkify"] = True✨ NEW: Add smartquotes, thanks to @tsutsu3.
This extension will convert basic quote marks to their opening and closing variants:
- 'single quotes' -> ‘single quotes’
- "double quotes" -> “double quotes”
It can be activated by:
from markdown_it import MarkdownIt
md = MarkdownIt().enable("smartquotes")
md.options["typographer"] = True✨ NEW: Add markdown-it-task-lists plugin, thanks to @wna-se.
This is a port of the JS markdown-it-task-lists,
for building task/todo lists out of markdown lists with items starting with [ ] or [x].
For example:
- [ ] An item that needs doing
- [x] An item that is completeThis plugin can be activated by:
from markdown_it import MarkdownIt
from markdown_it.extensions.tasklists import tasklists_plugin
md = MarkdownIt().use(tasklists_plugin)🐛 Various bug fixes, thanks to @hukkinj1:
- Do not copy empty
envarg inMarkdownIt.render _Entities.__contains__fix return data- Parsing of unicode ordinals
- Handling of final character in
skipSpacesBackandskipCharsBackmethods - Avoid exception when document ends in heading/blockquote marker
🧪 TESTS: Add CI for Python 3.9 and PyPy3
-
✨ NEW: Add simple typographic replacements, thanks to @tsutsu3: This allows you to add the
typographeroption to the parser, to replace particular text constructs:(c),(C)→ ©(tm),(TM)→ ™(r),(R)→ ®(p),(P)→ §+-→ ±...→ …?....→ ?..!....→ !..????????→ ???!!!!!→ !!!,,,→ ,--→ &ndash---→ &mdash
md = MarkdownIt().enable("replacements") md.options["typographer"] = True
-
📚 DOCS: Improve documentation for CLI, thanks to @westurner
-
👌 IMPROVE: Use
re.sub()instead ofre.subn()[0], thanks to @hukkinj1 -
🐛 FIX: An exception raised by having multiple blank lines at the end of some files
👌 IMPROVE: Add store_labels option.
This allows for storage of original reference label in link/image token's metadata, which can be useful for renderers.
✨ NEW: Add anchors_plugin for headers, which can produce:
<h1 id="title-string">Title String <a class="header-anchor" href="#title-string">¶</a></h1>🐛 Fixed an undefined variable in the reference block.
🐛 Fixed an IndexError in container_plugin, when there is no newline on the closing tag line.
⬆️ UPGRADE: attrs -> v20
This is not breaking, since it only deprecates Python 3.4 (see CHANGELOG.rst)
deflistanddollarmathplugins (see plugins list).
- Added benchmarking tests and CI (see https://executablebooks.github.io/markdown-it-py/dev/bench/)
- Improved performance of computing ordinals (=> 10-15% parsing speed increase). Thanks to @sildar!
- Stopped empty lines at the end of the document, after certain list blocks, raising an exception (#36).
- Allow myst-role to accept names containing digits (0-9).
containersplugin (see plugins list)
- Plugins and improved contributing section