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,re
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.8.2.tar.gz (58.4 kB view details)

Uploaded Source

Built Distribution

mistune-0.8.2-py2.py3-none-any.whl (16.1 kB view details)

Uploaded Python 2 Python 3

File details

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

File metadata

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

File hashes

Hashes for mistune-0.8.2.tar.gz
Algorithm Hash digest
SHA256 c50f2fb3a058120c5696f08af9d57877a9c76e879f19af5835fb2c6a4e56a67b
MD5 5ed49a227ef93543e42bbdf8e9521ffd
BLAKE2b-256 863e5915e3597dc30c5295e7b16b3320dde80a05cef83e0ba36098226510c55c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mistune-0.8.2-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 74c8bee5aba17f37d394c58df6a8d4ccc306ea7990fbea0aa338572fd8f7aa1c
MD5 261d6f179662387b44620a230272a1a6
BLAKE2b-256 d5f8177f311bc9366a22c815f4b9179c63520f0f2cb373333998252be25ba777

See more details on using hashes here.

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