Yet another markdown parser, inspired by marked in JavaScript.
- Pure Python. Tested in Python 2.6+, Python 3.3+ and PyPy.
- Very Fast. It is the fastest in all pure Python markdown parsers.
- More Features. Table, footnotes, autolink, fenced code etc.
View the benchmark results.
Installing mistune with pip:
$ pip install mistune
If pip is not available, try easy_install:
$ easy_install mistune
Mistune can be faster, if you compile with cython:
$ pip install cython mistune
A simple API that render a markdown formatted text:
import mistune mistune.markdown('I am using **markdown**') # output: <p>I am using <strong>markdown</strong></p>
Mistune has all features by default. You don't have to configure anything.
Like misaka/sundown, you can influence the rendering by custom renderers. All you need to do is subclassing a Renderer class.
Here is an example of code highlighting:
import mistune from pygments import highlight from pygments.lexers import get_lexer_by_name from pygments.formatters import HtmlFormatter class MyRenderer(mistune.Renderer): def block_code(self, code, lang): if not lang: return '\n<pre><code>%s</code></pre>\n' % \ mistune.escape(code) lexer = get_lexer_by_name(lang, stripall=True) formatter = HtmlFormatter() return highlight(code, lexer, formatter) renderer = MyRenderer() md = mistune.Markdown(renderer=renderer) print(md.render('Some Markdown text.'))
Here is a list of block level renderer API:
block_code(code, language=None) block_quote(text) block_html(html) header(text, level, raw=None) hrule() list(body, ordered=True) list_item(text) paragraph(text) table(header, body) table_row(content) table_cell(content, **flags)
The flags tells you whether it is header with flags['header']
. And it
also tells you the align with flags['align']
.
Here is a list of span level renderer API:
autolink(link, is_email=False) codespan(text) double_emphasis(text) emphasis(text) image(src, title, alt_text) linebreak() link(link, title, content) raw_html(raw_html) strikethrough(text)
Here is a list of all options that will affect the rendering results:
mistune.markdown(text, escape=True) md = mistune.Markdown(escape=True) md.render(text)
- escape: if set to True, all raw html tags will be escaped.
- use_xhtml: if set to True, all tags will be in xhtml, for example:
<hr />
.