Flask 最近書いてるんだけれども、今更閉じタグなんて書きたくないんじゃ!ということで、様々HTML Template触った結果最も書きやすかったHamlを使いたい。
ということで hamlish-jinja を使う。
使い方の基本
Flaskのdefault template engineであるjinjaのoptionsに、hamlish-jinjaを渡したclassを生成して実行する。
from flask import Flask, render_template from werkzeug import ImmutableDict class FlaskWithHamlish(Flask): jinja_options = ImmutableDict( extensions=['jinja2.ext.autoescape', 'jinja2.ext.with_', 'hamlish_jinja.HamlishExtension'] ) app = FlaskWithHamlish(__name__) @app.route('/') def index(): return render_template('index.haml') if __name__ == '__main__': app.run()
オプション
hamlish-jinjaには幾つかのオプションが用意されている。 以下はその一例。
- app.jinja_env.hamlish_enable_div_shortcut = True
- divタグを省略可能にする。div.classname を .classnameだけで記述可能になる
- app.jinja_env.hamlish_mode = 'indented'
- 出力HTMLにインデントをつける。開発中はこちらが良いだろう。
https://github.com/Pitmairen/hamlish-jinja#configuration
Syntaxについて
あくまでHamlishであって、Hamlと全く同じではない。
複数のAttributeを {} で記述できない。
Hamlで可能な記述(hamlish-jinjaでは不可)
%meta {name:'viewport', content:'width=device-width, initial-scale=1'}
hamlish-jinjaで可能な記述
%meta name='viewport' content='width=device-width, initial-scale=1'
!!!5 が適用されない。
他の方法でできるからいいじゃんという話になっている。
Added doctype strings. by totkeks · Pull Request #15 · Pitmairen/hamlish-jinja · GitHub
このケースでは、app.py側に以下のように書いたらいいじゃんという話。
import jinja2 jinja_env.globals['html5'] = jinja2.Markup('<!DOCTYPE html>')
つまり、hamlとまったく同じ記述ができるというわけではなく、あくまでもhamlっぽく書けるという話。
コメント書式が異なる
hamlish-jinjaでのコメントは ;
です。なんでや。
;Test comment
hamlからhamlishに変換したい
↓ を使いましょう。
hamlish-jinja/haml2hamlish.py at master · Pitmairen/hamlish-jinja · GitHub
まとめ
それでもhamlishなtemplateは記述量の少なさから得られる恩恵が大きいのでもうちょっと使って見る予定。 とはいえ、hamlと完全互換では無いので、そこの差異を認識した上で利用するのが望ましそう。