dogrunjp
5/24/2015 - 12:57 PM

PythonのテンプレートエンジンJinja2にMarkdownを読み込みレンダリングする方法

PythonのテンプレートエンジンJinja2にMarkdownを読み込みレンダリングする方法

PythonのテンプレートエンジンJinja2にMarkdownを読み込みレンダリングする方法

タイトルの通りのことを色々試していたのでメモしておきます。

1)テンプレートフィルタの利用

Jinja2とMarkdownで検索して、 最初に見つけたのがDjango+Jinja2でMarkdown用のカスタムフィルタを使う方法。 テンプレートに関する部分はだいたいJinja2なので、Djangoに関係なくMarkdownを扱えます。

from jinja2 import Environment, FileSystemLoader, Markup

...
def render():
    env = Environment(loader=FileSystemLoader(template_path, encoding='utf8'))
  
    # filterをEnviromentに追加してテンプレートからカスタムフィルタが見えるようにします
    env.filters['markup'] = markup  
    
    content = urllib2.urlopen(markdown_url).read()
    tmp = env.get_template(template_file)
    html = tmp.render(content = content).encode(‘utf-8’)
...

# Jinja2.Markup()したコンテンツを返すカスタムフィルタを記述します
def markup(text):
    return jinja2.Markup(markdown.markdown(text)) 

Jinja2のテンプレートでmarkdownコンテンツをパイプでフィルタに渡せば、 マークアップされ返ってきます。

<div> {{ content | markup }} </div>

2)マークアップした要素をテンプレートに渡す方法

はじめのテンプレートフィルタで問題ないのですが、 手間を掛けすぎている感じがしないではないです。 テンプレートをレンダリングする前に一行Markup()を挟めばマークアップ済みの要素が テンプレートに渡されるので、こちらの方がすっきりしている気がします。

from jinja2 import Enviroment, FileSystemLoader
import markdown
...
def render():
    env = Environment(loader=FileSystemLoader(template_path, encoding='utf8'))
  
    response = urllib2.urlopen(markdown_url).read()
    content = Markup(markdown.markdown(response))

    tmp = env.get_template(template_file)
    html = tmp.render(content = content).encode(‘utf-8’)

こちらの方法ではフィルタを使わないので、テンプレートの記述も若干シンプルに。

<div> {{ content }} </div>

Markdownを取り込んだツールは現在進行形で色々作られていると思うので もっと良い方法が見つかるかもしれませんが、今のところ 2)が良いかなと考えています。