Subscribed unsubscribe Subscribe Subscribe

ITemplateStreamFilter#filter_streamでHTMLテンプレートを使用する方法

良く忘れるのでメモっておきます。
ITemplateStreamFilter#filter_streamでHTMLを動的に追加したい場合に、HTMLをpyファイルにハードコードするのではなく、HTMLテンプレート化したい場合があります。特に、結構複雑なHTMLになってくるとテンプレート化した方が良い。trac.iniにauto_reload = Trueがあると、HTMLテンプレートの場合は修正後即座に反映しますので、デバッグもし易いのです。

pythonのコードは以下のようになります。TracAPIである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>