読者です 読者をやめる 読者になる 読者になる

テンプレートエンジンGenshi

Python

PythonテンプレートエンジンGenshiの勉強をしています。
GenshiはXMLベースのテンプレートエンジンで、XInclude, (限定的とはいえ)XPathをサポートするところが特徴で、XML好きには実に興味深いテンプレートエンジンです。すでにTurboGearsとの統合も可能とのことです。


GenshiはTracの開発元でもあるedgewallによって開発されています。名前の由来は、日本語の「原糸」。「折り紙」「歌舞伎」「俳句」等と比べると、なんと言うか、実に渋い趣味です。


GenshiはKidの影響を強く受けており、ほとんどの構文が同じです。ただ、GenshiはXInclude, XPathを使って、テンプレートを記述するため、KidよりもXML色が濃くなっています。そのため、好みは分かれるかもしれません。
Kidではpy:extendで使って、ベースのレイアウトを「継承」しますが、GenshiではXIncludeを使って、ベースのレイアウトを「インクルード」します。
また、Kidではpy:match属性内でPython式を記述し、内容を置き換えたい要素を指定しますが、GenshiではXPathで指定を行います。
結果として、Genshiのテンプレートは、PythonXSLTが混ざったような、微妙な味わいのあるテンプレートになります。

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://genshi.edgewall.org/">
<!--! 置換条件の指定 layout.html -->
<span py:match="span[@class='greeting']"
   style="text-decoration: underline"
   py:content="select('text()')"/>

<!--! 置換対象の要素 -->
<span class="greeting">Hello World</span>
</html>

このテンプレートは次のような出力になります。

<html xmlns="http://www.w3.org/1999/xhtml">
<span style="text-decoration: underline">Hello World</span>
</html>

FAQによると、Kidとの違いとして他にも、Genshiはテンプレートの構文エラーを特定しやすいこと、Kidと違ってPythonのコードを生成せず、直接ASTを操作することを挙げています。
Kidとのパフォーマンスの比較にある通り、Kidより多少速いことが売りの一つのようです。ソースコードに含まれているベンチマークを実際に走らせてみましたが、確かにKidよりも2倍ほど高速に動作しました。