python Markdown の出力フォーマット を、sublime markdown preview の出力フォーマットと一致させる


Blog の Markdown Editor に、mezzanine-pagedown 1.0 : Python Package Index を使っていて、Markdown の記述は SublimeText で作成し、sublimetext-markdown-previewで体裁を確認後、投稿しています。
MarkdownPreview 側の設定と、Blog の Markdown Editor の設定が異なるのか同一レイアウトにならず、崩れて修正するのが手間でしたので、双方の設定を合わせてみました。


前提

以下の環境で実行しています。

  • OS
    CentOS release 6.9 (Final)

  • Python Version
    Python 2.7.8

  • Package (必要そうなものだけ抜粋)
    Django (1.10.7) Mezzanine (4.2.3) mezzanine-pagedown (1.0)


どちらに寄せるか?

Sublime の markdown preview の設定に合わせます。
markdown preview plugin も内部で、Markdown を使用しており、sublimetext-markdown-preview/MarkdownPreview.py at master · revolunet/sublimetext-markdown-preview に設定が記載されています。

  • MarkdownPreview.py の抜粋
    DEFAULT_EXT = [
        "extra", "github", "toc",
        "meta", "sane_lists", "smarty", "wikilinks",
        "admonition"
        ]
    

github という Markdown の extention にはない extention が含まれています。


github extention について

github extention について検索したところ、facelessuser/pymdown-extensions がヒットします。
markdown preview plugin は、pymdown-extentions の extention を markdown に組み込んで使っているようです。1
[1] markdownのextentionsパッケージ内に、pymdown-extentions のスクリプトが組み込まれています。
この拡張を使うと何が起こるかというと、ネストされた Fenced Code Block が ネストされて表示されるようになります。
Markdown の Fenced Code Blocks のドキュメントを見てみたら、しっかり、「ネストされたコードブロックには対応していない」旨が記載されています。Fenced Code Blocks Extension — Python Markdown


Markdown Editor の設定変更

mezzanine-pagedown の設定を markdown preview の設定に合わせます。
pymdown-extentions が必要になりますので、インストールします。

  • pymdown-extensions のインストール

    pip install pymdown-extensions
    

  • settings.py の編集
    PAGEDOWN_MARKDOWN_EXTENSIONS を markdown preview の DEFAULT_EXT と合わせます。
    github はパッケージが異なるので、pymdownx.github となります。

    PAGEDOWN_MARKDOWN_EXTENSIONS = ("extra", "pymdownx.github", "toc",
        "meta", "sane_lists", "smarty", "wikilinks",'codehilite',
        "admonition")
    

発生したエラー

上記設定完了後の動作確認時に、以下のエラーが発生しました。

  File "/usr/local/lib/python2.7/site-packages/pymdownx/highlight.py", line 148, in get_lexer
    lexer = guess_lexer(src)
  File "/usr/local/lib/python2.7/site-packages/pygments/lexers/__init__.py", line 252, in guess_lexer
    raise ClassNotFound('no lexer matching the text found')
ClassNotFound: no lexer matching the text found
pygments 内でエラーが発生しており、pygments の upgrade を実施したところエラーは解消されました。
Markdown と、pymdown-extensionspygments version を記載しておきます。

% pip list | grep Markdown
Markdown (2.6.8)

% pip list | grep pymdown
pymdown-extensions (4.0)

% pip list | grep Pygments
Pygments (2.2.0)

これで、ローカルと、Blog側のmarkdown設定を一致させることができました。
厳密にはバージョンが異なるのですが、表示体裁での手戻りは少なくなるので、精神衛生上は良いかなと思います。
以上です。

コメント