Skip to main content

The fastest markdown parser in pure Python

Project description

The fastest markdown parser in pure Python with renderer features, inspired by marked.

Donate lepture Wheel Status Conda Version Latest Version Travis CI Status Coverage Status App Veyor CI Status

Features

  • 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.

Installation

Installing mistune with pip:

$ pip install mistune

Mistune can be faster, if you compile with cython:

$ pip install cython mistune

Basic Usage

A simple API that render a markdown formatted text:

import mistune

mistune.markdown('I am using **mistune markdown parser**')
# output: <p>I am using <strong>mistune markdown parser</strong></p>

If you care about performance, it is better to re-use the Markdown instance:

import mistune

markdown = mistune.Markdown()
markdown('I am using **mistune markdown parser**')

Mistune has enabled all features by default. You don’t have to configure anything. But there are options for you to change the parser behaviors.

Options

Here is a list of all options that will affect the rendering results, configure them with mistune.Renderer:

renderer = mistune.Renderer(escape=True, hard_wrap=True)
# use this renderer instance
markdown = mistune.Markdown(renderer=renderer)
markdown(text)
  • escape: if set to False, all raw html tags will not be escaped.

  • hard_wrap: if set to True, it will has GFM line breaks feature. All new lines will be replaced with <br> tag

  • use_xhtml: if set to True, all tags will be in xhtml, for example: <hr />.

  • parse_block_html: parse text only in block level html.

  • parse_inline_html: parse text only in inline level html.

When using the default renderer, you can use one of the following shortcuts:

mistune.markdown(text, escape=True, hard_wrap=True)

markdown = mistune.Markdown(escape=True, hard_wrap=True)
markdown(text)

Renderer

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 html

class HighlightRenderer(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 = html.HtmlFormatter()
        return highlight(code, lexer, formatter)

renderer = HighlightRenderer()
markdown = mistune.Markdown(renderer=renderer)
print(markdown('```python\nassert 1 == 1\n```'))

Find more renderers in mistune-contrib.

Block Level

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'].

Span Level

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()
newline()
link(link, title, content)
strikethrough(text)
text(text)
inline_html(text)

Footnotes

Here is a list of renderers related to footnotes:

footnote_ref(key, index)
footnote_item(key, text)
footnotes(text)

Lexers

Sometimes you want to add your own rules to Markdown, such as GitHub Wiki links. You can’t achieve this goal with renderers. You will need to deal with the lexers, it would be a little difficult for the first time.

We will take an example for GitHub Wiki links: [[Page 2|Page 2]]. It is an inline grammar, which requires custom InlineGrammar and InlineLexer:

import copy
from mistune import Renderer, InlineGrammar, InlineLexer

class WikiLinkRenderer(Renderer):
    def wiki_link(self, alt, link):
        return '<a href="%s">%s</a>' % (link, alt)

class WikiLinkInlineLexer(InlineLexer):
    def enable_wiki_link(self):
        # add wiki_link rules
        self.rules.wiki_link = re.compile(
            r'\[\['                   # [[
            r'([\s\S]+?\|[\s\S]+?)'   # Page 2|Page 2
            r'\]\](?!\])'             # ]]
        )

        # Add wiki_link parser to default rules
        # you can insert it some place you like
        # but place matters, maybe 3 is not good
        self.default_rules.insert(3, 'wiki_link')

    def output_wiki_link(self, m):
        text = m.group(1)
        alt, link = text.split('|')
        # you can create an custom render
        # you can also return the html if you like
        return self.renderer.wiki_link(alt, link)

You should pass the inline lexer to Markdown parser:

renderer = WikiLinkRenderer()
inline = WikiLinkInlineLexer(renderer)
# enable the feature
inline.enable_wiki_link()
markdown = Markdown(renderer, inline=inline)
markdown('[[Link Text|Wiki Link]]')

It is the same with block level lexer. It would take a while to understand the whole mechanism. But you won’t do the trick a lot.

Contribution & Extensions

Mistune itself doesn’t accept any extension. It will always be a simple one file script.

If you want to add features, you can head over to mistune-contrib.

Here are some extensions already in mistune-contrib:

  • Math/MathJax features

  • Highlight Code Renderer

  • TOC table of content features

  • MultiMarkdown Metadata parser

Get inspired with the contrib repository.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mistune-0.7.4.tar.gz (49.3 kB view details)

Uploaded Source

Built Distributions

mistune-0.7.4-py2.py3-none-any.whl (24.5 kB view details)

Uploaded Python 2 Python 3

mistune-0.7.4-cp36-cp36m-macosx_10_12_x86_64.whl (235.1 kB view details)

Uploaded CPython 3.6m macOS 10.12+ x86-64

mistune-0.7.4-cp27-cp27mu-macosx_10_12_x86_64.whl (257.4 kB view details)

Uploaded CPython 2.7mu macOS 10.12+ x86-64

File details

Details for the file mistune-0.7.4.tar.gz.

File metadata

  • Download URL: mistune-0.7.4.tar.gz
  • Upload date:
  • Size: 49.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for mistune-0.7.4.tar.gz
Algorithm Hash digest
SHA256 8517af9f5cd1857bb83f9a23da75aa516d7538c32a2c5d5c56f3789a9e4cd22f
MD5 92d01cb717e9e74429e9bde9d29ac43b
BLAKE2b-256 25a412a584c0c59c9fed529f8b3c47ca8217c0cf8bcc5e1089d3256410cfbdbc

See more details on using hashes here.

Provenance

File details

Details for the file mistune-0.7.4-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for mistune-0.7.4-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 94b9f0c3c7f2bae302009d8bec2bb803daec8879e0ea2102630f5ea7ade2c96b
MD5 16b8021660d25894983dce1fd5494bbc
BLAKE2b-256 7babe71dd1ca31addcd0268c54859eaf75414a10fbc48c79078f7c3066e6ed0d

See more details on using hashes here.

Provenance

File details

Details for the file mistune-0.7.4-cp36-cp36m-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for mistune-0.7.4-cp36-cp36m-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 9d21a8ad203c6d7253492518fde7e633c561fecd544301017ab4a5929452955b
MD5 f3529c06d7e985f0d74a3953d7ab89e6
BLAKE2b-256 61aa9bf8ce2ebf17f40e5cb78c814fcd811f02067a268a4774b20fff88b08832

See more details on using hashes here.

Provenance

File details

Details for the file mistune-0.7.4-cp27-cp27mu-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for mistune-0.7.4-cp27-cp27mu-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 4ee2350e750acab4c4ae2fb16197f9f27b9a4740e87ed4ad9f7ecdc987bed9bc
MD5 72c6d2f7dc21a310964a49ebd807e0ec
BLAKE2b-256 09f7d4a4ed8238ea3e07ce5be0040b4f4c106136395d1e1fade184e4c9771c15

See more details on using hashes here.

Provenance

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page