2014年10月12日日曜日

Tracのwikiを自動改行対応化

Tracのチケットは自動改行されるのに、wikiはいちいち[[BR]]と書かないといけなくて不便ですよね。
特に記事をコピペする時は大変です。
なのでwikiも自動改行に対応させてさくさく書き込めるようにしましょう。

※注意:tracのバージョンによって細かな内容は異なります。以下の内容は1.1.2に基づきます


どこにあるか?
tracのファイルを眺めていると、formatter.pyというのを発見しました。
formatter・・・書き込んだソースをhtmlに変更しているっぽいファイル名ですね。
フルパスですと、私の環境では「/usr/lib/python2.6/site-packages/Trac-1.1.2dev_r11693-py2.6.egg/trac/wiki/formatter.py」になります。

しかしソースが巨大なので目視で解析なんかしていられません。
wikiは空行を入れると自動で<br />を挿入してくれるので、そこを改造して文末は片っ端から挿入させるようにすればいけそう。

そこで <br />でソース中を検索していきます。

ありましたありました。 formatというそれらしいメソッドの中でhtmlの構築を行っています。
意図したとおりに動くよう、軽くこのメソッドを解析します。

if not(self.in_list_item or self.in_def_list or self.in_table):
リストやテーブルの中ではない場合とあります。(バージョンによってここら変の内容が異なります)

さらに

if escape_newlines and self.paragraph_open and \
       not result.rstrip().endswith('<br />'):
\は次の行に続きますという意味です。なので2行を1行にまとめると。
パラグラフの開始(paragraph_open)で、前行末(endswith)に<br />タグが無い場合でしょうか。

wikiの改行を2連続で入れると改行されるという部分だなと分ります。

てことで、ここを変更します。

if not result.rstrip().endswith('<br />'):
単純に、「行末が<br />で終わってない場合」にしました。

後に続く sep = '<br />' + sep で、改行が入ります。

まとめると

- if escape_newlines and self.paragraph_open and \
- not result.rstrip().endswith('<br />'):
+ if not result.rstrip().endswith('<br />'):

となります。
何か忘れている気がしますが、これで快適にwikiを編集できるようになりました。