TracWiki の話を掘り返してみる
ここでいくつかいいかげんなことを書いてしまっていたので、フォローっぽいことを。
preserve-newlines の影響範囲
Trac 0.11 で preserve_newlines なんてオプションができてる(新規構築環境ではデフォルトで yes の動作)ので、今後は改行が保持されるようになっちゃうのかもしれません。
なんてことを書いたんですが、よく見ると ticket セクション の中の話で。チケット以外の動作は従来どおりみたいですね。
なぜチケットだけ改行を保持したいかというと、
バグ報告はしてくれる人は Wiki 記法なんて知らないでしょ&その動作で困る人なんていないでしょ、ってことみたい。で、いきなり動作を変えちゃうと、それ以前に作ったチケットが見た目変になっちゃうから、default という動作も追加しましたよと。
思想的にはこのチケットの中で eblot さんが主張してる
Well, I think this is one of the major feature of Trac: being able to use Wiki syntax in tickets, in commit log messages, ... everywhere ;-)
というのに従いたいところだし、プロジェクト内で使うぶんにはちゃんと Wiki 記法を使わせることができるから、
preserve_newlines = no
で運用しよう。(※当初間違えて yes とか書いてましたが、no です)
TracWiki で日本語中の改行でも空白があいてしまう件
Wiki の「段落内の改行が削除される」動作が今後も残ることがわかったので、
(TracWiki は)英語圏での使用が前提なので、行を連結する際に間に単語同士がつながらないようにひとつスペースを入れちゃうんですよね。日本語の場合は文章中にいきなり空白が入ることになるので、少し気持ち悪いといえば気持ち悪いです。
この動作をちゃんと調べてみることにしました。
誰が空白を入れているのか
てっきり Trac がスペースを入れていると思い込んでいたんですが、Trac 側では os.linesep を挿入している(=改行を改行のまま出力している)だけで、半角として表示しているのはブラウザ側のようです。
そして、
によると、IE では全角文字と全角文字の間の改行は空白に置き換えない仕様になっているそうで。他のブラウザは常に空白に置き換えているみたいだけど・・・どっちが正しいんだろう?
HTML の仕様を覗いてみる
ちょうど HTML 5 の Draft が出てるので、軽く読んでみよう・・・と思ったけど、全体像がまるで掴めないので、適当にそれっぽいところを抜き出してみる。
2.4.7 Space-separated tokens の末尾に
This causes any occurrences of the token to be removed from the string, and any spaces that were surrounding the token to be collapsed to a single space, except at the start and end of the string, where such spaces are removed.
とか書いてあって、やっぱり仕様的にスペースひとつ入れるのが正しいってこと?(読み間違いの可能性大。)
日本語みたいに分かち書きしない言語だと、IE と同じ動作にしてくれればよさげなんだけど・・・仕様変えてくれたりはしないんだろうなぁ。
Trac 側で対応してみる
手元に Trac の検証用に使ってた Ubuntu があったので、ここでちょっと対応できないか試してみた。
HtmlFormatter#generate (HTML フォーマット済みの文字列を返す処理)の中を書きかえればよさそうで・・・Ubuntu では /usr/lib/python2.6/dist-packages/trac/wiki/formatter.py が /usr/share/pyshared/trac/wiki/formatter.py へのシンボリックリンクになっているので、このファイルを書き換え。
out = StringIO() Formatter(self.env, self.context).format(self.wikidom, out, escape_newlines) - return Markup(out.getvalue()) + p = re.compile(ur'(?<=[\u2000-\uffff])%s(?=[\u2000-\uffff])' % os.linesep) + return Markup(p.sub('', out.getvalue()))
文字列を返すところで、日本語+改行+日本語 という文字の並びがあれば、その改行を削除しています。(日本語と書きましたが、正確にはラテン文字集合が入っていないであろう U+2000 以上の文字を指定しています。)
Python でも Character Property(\P{Latin} みたいなの)が使えればもっとちゃんと書けるんだろうけど、Python 2.7 以降になるんだとか。
引用部で Wiki 記法が使えない件
さらっと書いてたけど、
* hoge * fuga * piyo
を引用して
> * hoge > * fuga > * piyo
とした場合、ちゃんと整形されずに
> * hoge * fuga * piyo
みたいに表示されてしまう件。これなんとかならないかなー?と思ってたけど、
にちゃんと項目が挙がっていて。まあ解決したいとは思ってるけど、どう parse されるべきか決めなきゃね、ってところらしい。いずれ対応されるといいなぁ。