Tempita っていうのは、前にここで紹介したこれのこと。
今、これを使って遊んでます。
私はパズルが好きなので、それ関連のものを作ってるところ。

必要な機能の実装はもう終わったんだけど、いかんせん、デザインがなぁ。
明日には公開するかも、しないかも。デザインはめんどくさい。

とりあえず今夜はちょっと飲みすぎた。
都内某所、ただいま麦焼酎6杯目。
2007.08.31 Fri l Python Template l COM(0) TB(0) l top ▲
reStruecturedText というものの存在を知ったので、それを使って Tempita の適当翻訳を作ってみた。 reStructuredText は簡単すぎてよい。マークアップが簡単でかつ直感的で、しかも見た目がすっきりしている。

Tempita が何かということを簡単に説明すると、
Python で使えるテンプレート言語で、テンプレートの中に Python のコードが書けるもの。
それが Tempita

Tempita 適当翻訳マニュアル
2007.08.18 Sat l Python Template l COM(0) TB(0) l top ▲

Status & License

Tempita は MIT-style license の元で利用可能です。

Tempita は積極的に開発されていますが、野心的なプロジェクトではありません。だから、テンプレートの世界を支配しようなんてものじゃなくて、新しい特徴を追加するのが目的のものです。私が作りたいと思ったものは、 % と string.Template だけじゃ不十分なときに使えるような、小さなテンプレート言語です。

なんでさらに別のテンプレート言語がいるの?

(略)

The Interface

インターフェースは string.Template に見えるように作ってあります。テンプレートオブジェクトは、こんなふうに作ります。

>>> import
>>> tmpl = tempita.Template("""Hello {{name}}""")
>>> tmpl.substitute(name='Bob')
'Hello Bob'

クラスを飛ばすこともできます。

>>> tempita.sub("Hello {{name}}", name='Alice')
'Helo Alice'

この言語は任意の Python で実行できます。だからあなたのテンプレートがより信頼できるものになります。

また、テンプレートに名前をつけることもできます。これによってエラーが起こったとき、その名前が表示されるので便利です。

>>> tmpl = tempita.Template('Hi {{name}}', name='tmpl')
>>> tmpl.substitute()
Traceback (most recent call last):
    ...
NameError: name 'name' is not defined at line 1 column 6  in file tmpl

substitute(...) の中身が引数になるような、デフォルトで使えるネームスペースを与えることもできます。

>>> tmpl = tempita.Template(
...     'Hi {{upper(name)}}',
...     namespace=dict(upper=lambda s: s.upper()))
>>> tmpl.substitute(name='Joe')
'Hi JOE'

最後に、 substitute 関数にディクショナリオブジェクトを引数で渡すこともできます。

>>> name = 'Jane'
>>> tmpl.substitute(locals())
'Hi JANE'

HTML を作るのには、もっと便利なテンプレート HTML Template もあります。

Template.from_filename(filename, namespace={}, encoding=None) を使えば、ファイル名からテンプレートを作ることもできます。こんなふうに。

Template(open(filename, 'rb').read().decode(encoding),
         name=filename, namespace=namespace)

Unicode

Tempita は Unicode を"優雅に"扱います。 Template オブジェクトは default_encoding の属性を持っています。

unicode と str のオブジェクトが混ざっているときに、それを使います。こんなふうに

>>> tmpl = tempita.Template(u'Hi {{name}}')
>>> tmpl.substitute(name='Jos\xc3\xa9')
u'Hi Jos\xe9'
>>> tmpl = tempita.Template('Hi {{name}}')

>>> tmpl.substitute(name=u'Jos\xe9')
'Hi Jos\xc3\xa9'

デフォルトのエンコーディングは UTF8 です。

The Languate

言語はとってもシンプルで、すべての要素は {{ごにょごにょ}} って感じになってます。

置換

変数や式を変数や式を挿入するには、 {{expression}} を使います。式の中では }} を使うことはできませんが、 } } なら使えます(間にスペースがある)。filter もこんなふう {{expression | filter}}にすれば渡すことができます。たとえば{{expression | repr}}とか。これは{{repr(expression)}}と同じです。 こっち表現のほうが好きな人もいるでしょう。この表現は Django と同じです。ネームスペースは共有されているので、 repr はネームスペースの中の単なるオブジェクトです。

もしテンプレートのなかで {{ や }} を使いたいときは、組込み変数である {{start_braces}} と {{end_braces}} を使います。エスケープ文字はありません。

デフォルト変数をテンプレートの中出設定するためのコマンドもあります。たとえばこんな。

{{default width = 100}}

こうしておけばテンプレートの中で width はいつも 100 です。たとえば tmpl.substitute(width=200) とかやると、この効果はありません。

値が未定義のときにだけ使われます。また、 = の右側にはどんな式を書いても OK です。

if 文

if 文はこんな風に書けます。

{{if 条件式}}
  true のときの処理
{{elif 別の条件式}}
  そのときの処理
{{else}}
  最後の処理
{{endif}}

命令だけの行は、評価されたときは取り除かれます。後に続く : は自由です。

for 文

ループにも、別に驚くことはありません。こんな風に書きます。

{{for a, b in items}}
    {{a}} = {{b | repr}}
{{endfor}}
2007.08.14 Tue l Python Template l COM(0) TB(0) l top ▲
Django を使ってごにょごにょやっているなかで、自分がいま必要としているのは、DjangoのようなWeb アプリケーションのフレームワークではなくて、もっと簡単なテンプレートエンジンなのかもしれないと気づいた。

というわけで、[python template web]で検索してみると、 Pythonのテンプレートエンジンというズバリなエントリをウノウラボさんのブログで見つけた。
そのエントリーに載ってないテンプレートエンジンでは、ClearSilverがよさそうな感じ。API をPython から呼べるらしい。でもCのライブラリになってる必要もないし、インストールがめんどくさそう。それに、できればテンプレートの中にも Python のコードを書きたい。
そういう条件で絞っていくと、そんな都合のいいテンプレートエンジンは、ない。と思っていたら、ついによさそうなのを見つけた。それはTempita
Python Pasteについても、ものすごく気になるけれど、それはまた今度。
2007.08.07 Tue l Python Template l COM(0) TB(0) l top ▲