ITemplateStreamFilter#filter_streamでHTMLテンプレートを使用する方法
良く忘れるのでメモっておきます。
ITemplateStreamFilter#filter_streamでHTMLを動的に追加したい場合に、HTMLをpyファイルにハードコードするのではなく、HTMLテンプレート化したい場合があります。特に、結構複雑なHTMLになってくるとテンプレート化した方が良い。trac.iniにauto_reload = Trueがあると、HTMLテンプレートの場合は修正後即座に反映しますので、デバッグもし易いのです。
pythonのコードは以下のようになります。TracのAPIであるChromeをインポートして、テンプレートファイルをロードし、データを渡すだけと簡単です。
# ITemplateStreamFilter methods def filter_stream(self, req, method, filename, stream, data): … data = {'req': req, 'message': 'Hello HTML Template!'} //テンプレートからHTMLを生成 from trac.web.chrome import Chrome template = Chrome(env).load_template('sample.html', method='xhtml') html= template.generate(**data) timingandestimationext_PATH = '//div[@id="ctxtnav"]' stream |= Transformer(timingandestimationext_PATH).after(html) return stream
テンプレートとなるHTMLは、埋め込む部分だけで良いので以下のようにdivタグなどから始めればOKです。。
<div xmlns:py="http://genshi.edgewall.org/"> ${message} </div>