LoginSignup
2
1

More than 5 years have passed since last update.

Python Markdown の CodeHilite エクステンションを有効にしてみた

Last updated at Posted at 2018-02-16

※2016年6月27日に書いたブログ記事からの転記です。

Jinja2 で HTML を吐き出すときにカスタムフィルターで Markdown を HTML に変換する際、<code> タグの内容に自動でシンタックス・ハイライトされるように Python Markdown の CodeHilite エクステンションを有効にしてみました。

Python Markdown を Jinja2 のカスタムフィルターとして使う方法は「Jinja2でMarkdown記法をHTMLに変換するカスタムフィルター」の記事でご紹介していますので参考にしてください。

CodeHilite エクステンションは Python Markdown のライブラリにデフォルトで含まれていますので、普通にインストール(またはフォルダを配置してインポート)している場合はそのまま使います。

ただし、CodeHilite エクステンションは Pygments というライブラリを使っているので、それはインストール(またはフォルダを配置)しておく必要があります。

自分の場合は以下のようにフォルダを配置しました。

app_id/
  app.yaml
    appengine_config.py
      main.py
      lib/
        markdown
        pygments

App Engine アプリケーションで lib を PYTHONPATH に加える方法については「appengine_config.pyでパッケージ置き場のパスを通す」の記事を参考にしてください。

次に Jinja2 のカスタムフィルターに少し手を加えます。

import markdown
from markdown.extensions.codehilite import CodeHiliteExtension

def markdown2html(value):
    return markdown.Markdown(
        extensions=[CodeHiliteExtension()]
    ).convert(value)

markdown.Markdown() のオプション引数 extensions に、Python Markdown の extensions の中の codehilite というモジュールの CodeHiliteExtension というクラスのインスタンスを渡してあげます(複数のエクステンションを渡せるよう引数はリスト型)

ここまですると、Jinja2 テンプレートの中で

{{ text | markdown2html | safe }}

としてあげるだけで Jinja2 が吐き出した HTML の code タグの中身が細かく span タグでマークアップされます。

この span タグの各クラスに対応して文字を装飾するスタイルシートを当ててあげれば、キレイにハイライトされるようになるというカラクリです。

スタイルシートは Pygments のドキュメントを読んで Pygments から出力させてもいいですし、Pygments のクラスに対応したサードパーティ製のスタイルシートを拾ってきて使うのも手だと思います。

自分はGitHub - richleland/pygments-css: css files created from pygment's built-in stylesの中から github.css というスタイルシートを拝借しました。

以上です。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1