Github: https://github.com/lepture/mistune
ミスチューン
純粋な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_wrap : Trueに設定すると、GFM改行機能があります。 すべての新しい行が
<br>
タグで置き換えられます - use_xhtml : Trueに設定すると、すべてのタグは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]]
。 これはインライン文法であり、カスタムInlineGrammar
とInlineLexer
が必要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リポジトリに触発されてください。