tracのticket_notify_email.txtで通知メールをカスタマイズする

tracでチケットを作成したり、コメントを追加したりすると通知メールが飛びます。その通知メールですが、デフォルトだとReporterとか、キーワードとかチケットのプロパティ値が二段組になって送られてきます。
こんな感じ。

#42: testing
---------------------------+------------------------------------------------
       Id:  42             |      Status:  assigned                
Component:  report system  |    Modified:  Fri Apr  9 00:04:31 2004
 Severity:  major          |   Milestone:  0.9                     
 Priority:  lowest         |     Version:  0.6                     
    Owner:  anonymous      |    Reporter:  jonas@example.com               
---------------------------+------------------------------------------------
Changes:
  * component:  changset view => search system
  * priority:  low => highest
  * owner:  jonas => anonymous
  * cc:  daniel@example.com =>
         daniel@example.com, jonas@example.com
  * status:  new => assigned

Comment:
I'm interested too!

--
Ticket URL: <http://example.com/trac/ticket/42>
My Project <http://myproj.example.com/>

しかしこの段組部分ですがメーラが等角フォントじゃない場合はズレまくってしまって読みにくいことこの上ない。
しかも、段組中で一行に入らない場合は二行に分けてでてくるんです。こんな感じ。

#7: テスト
-------------------------------------+-------------------------------------
           Reporter:  hogehoge       |                  Type:  xxxxxxxxxxx
             Status:  new             |  るページ有り
           Keywords:  <この項目は不  |              Priority:  中
   使用>                             |                  所属:  総務課
             お名前:  ほげ            |  連絡先(内線or外線):  2544
 データ一時受渡利用:  0               |            公開希望日:  2013/5/25
         掲載終了日:                  |
-------------------------------------+-------------------------------------

まあ項目名を長くしちゃったのがいけないんですが。でもってこの通知メールですが、テンプレートでフォーマットを変更することができます。
tracインスタンス/templates/ticket_notify_email.txtを作成して、それでコントロールするみたい。
例えば、段組をやめて'|'のところで改行してしまうテンプレートはここに例があります。

でもこの例。'|'で改行して、指定された項目名(:の左側の部分)とつなげて出しているので上記の例のように項目に対する値が複数行に分かれてしまっている場合は、途中までしかでない。

title1: longlonglonglong | title2: hogehoge
 value                   | title3: fugafuga

これが

title1:longlonglonglong
title2:hogehoge
title2:fugafuga

となる。

title1:longlonglonglongvalue

となってほしいんですよね。

templteでpythonのコードを入れる

ということでスクラッチからテンプレートを書く。このテンプレートファイルはgenshiというもので記述されています。genshiのマニュアルを参照するとpythonのコードがそのままかけるようです。
このチケットのプロパティに相当する部分はticket_propsという文字列に格納されてテンプレートで参照できるのでこれを利用してpythonでもって文字列を加工します。

genshi中でpythonのコードを入れるには

{%python
  code...
%}\

と書くようです。

こんな風に書きました。

ticket_body_hdr
{% python
    tmp_str=ticket_props.replace(' ','')
    tmp_str=tmp_str.replace('|','\n')
    list = tmp_str.split('\n')
    list = list[1:-1]

    count = 0
    for i in list:
        if i.find('-----') != -1:
            break
        elif i.find(':') == -1:
            list[count-2] = list[count-2]+i
            list[count] = ''
        count = count+1

    outstr=""

    for i in list:
        if i != '' and i.find('Keywords:') == -1:
            outstr=outstr+"\n"+i
%}\
${outstr}
{% end %}\

$ticket_propsを削除して{%python .. %}と${outstr}を追加。
コードはかなりやっつけです。ticket_propsの空白を削除、'|'で全部改行した上で文字列をリストへ変換。
リストの0番目と最後の要素はセパレータなので削除。
リストの要素中に':'がなければ二行前の要素に結合(途中で改行が入っちゃたのをもとに戻す)。
チケットのデータにtextareaがあるとまたセパレータが出てくるので、それはスキップ。

でもって、再度リストをループさせて、出したくない要素をスキップする。

pythonスクリプト的には全く大したことはないのですが、ticket_notify_email.txtがgenshiであるということを理解するのに時間がかかってしまいました。