GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

lepture

mistune – 純粋なPythonのレンダラー機能を備えた最速のマークダウンパーサー

投稿日:

純粋なPythonのレンダラー機能を備えた最速のマークダウンパーサーです。 http://mistune.readthedocs.io/

ミスチューン

純粋なPythonでの最も速いマークダウンパーサーで、レンダリング機能があり、 マークれています。

特徴

  • 純粋なPython Python 2.7、Python 3.5+、およびPyPyでテストされています。
  • 非常に速い すべての純粋なPythonマークダウンパーサーで最も速いです。
  • その他の機能 テーブル、脚注、オートリンク、フェンスコードなど

ベンチマーク結果を表示します

インストール

pipとミューズンをインストールする:

$ pip install mistune

cythonでコンパイルすると、Mistuneはもっと速くなります:

$ pip install cython mistune

基本的な使用法

書式設定されたマークアップをレンダリングする簡単なAPI:

import mistune

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

パフォーマンスが気になる場合は、Markdownインスタンスを再利用する方がいいでしょう。

import mistune

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

Mistuneはデフォルトですべての機能を有効にしています。 何も設定する必要はありません。 しかしパーサーの振る舞いを変更するオプションがあります。

オプション

レンダリング結果に影響を与えるすべてのオプションのリストをmistune.Rendererます。それらをmistune.Rendererで構成します。 mistune.Renderer

renderer = mistune.Renderer(escape=True, hard_wrap=True)
# use this renderer instance
markdown = mistune.Markdown(renderer=renderer)
markdown(text)
  • エスケープFalseに設定すると、生のHTMLタグはすべてエスケープされません。
  • hard_wrapTrueに設定すると、GFM改行機能があります。 すべての新しい行が<br>タグで置き換えられます
  • use_xhtmlTrueに設定すると、すべてのタグはxhtmlになります(例: <hr />
  • parse_block_html :ブロックレベルのHTMLでのみテキストを解析します。
  • parse_inline_html :インラインレベルのHTMLでのみテキストを解析します。

デフォルトレンダラを使用する場合は、次のショートカットのいずれかを使用できます。

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

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

レンダラー

misaka / sundownのように、カスタムレンダラによるレンダリングに影響を与えることができます。 Rendererクラスをサブクラス化するだけです。

コードハイライトの例を次に示します。

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```'))

mistune-contribのレンダラーをもっと探す

ブロックレベル

ブロックレベルレンダラー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)

フラグは、それがヘッダーであるかどうかをflags['header']ます。 また、 flags['align']との整列を指示します。

スパンレベル

スパンレベルレンダラー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)

脚注

脚注に関連するレンダラーのリストは次のとおりです。

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

レクサー

GitHub Wikiリンクなど、独自のルールをMarkdownに追加したいことがあります。 レンダラーでこの目標を達成することはできません。 あなたはレクサーに対処する必要があります、それは少し難しいでしょう初めて。

GitHub Wikiリンクの例を取り上げます: [[Page 2|Page 2]] これはインライン文法であり、カスタムInlineGrammarInlineLexerが必要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)

インラインレクサーをMarkdownパーサに渡す必要があります:

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

これはブロックレベルのレクサーと同じです。 メカニズム全体を理解するにはしばらく時間がかかります。 しかし、あなたは多くのトリックをしません。

投稿と拡張

Mistune自体は拡張子を受け入れません。 これは、常に単純な1つのファイルスクリプトになります。

フィーチャを追加したい場合は、 mistune-contribに頭を向けることができます。

mistune-contribには既にいくつかの拡張があります:

  • 数学/ MathJaxの機能
  • コードレンダラーをハイライトする
  • コンテンツ機能のTOCテーブル
  • マルチマークダウンメタデータパーサー

contribリポジトリに触発されてください。







-lepture

執筆者: