PythonのテンプレートエンジンJinja2にMarkdownを読み込みレンダリングする方法
タイトルの通りのことを色々試していたのでメモしておきます。
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>
はじめのテンプレートフィルタで問題ないのですが、 手間を掛けすぎている感じがしないではないです。 テンプレートをレンダリングする前に一行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)が良いかなと考えています。