miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

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

あああああ
いいいいい
ううううう
aaaaa
bbbbb
えええええ
おおおおお
ccccc
かかかかか
ききききき

こういう文字を書いておいて、それを表示すると、

こんな風に表示されていたところが・・・

こう表示されるようになりました。

実験自体は成功なんですけど、他のプロジェクトと共用している Trac で本体に手を入れるのはちょっと問題なので、できればプラグイン化して特定のプロジェクトだけで有効化できるようにしたいところ。

引用部で Wiki 記法が使えない件

さらっと書いてたけど、

 * hoge
 * fuga
 * piyo

を引用して

> * hoge
> * fuga
> * piyo

とした場合、ちゃんと整形されずに

> * hoge * fuga * piyo

みたいに表示されてしまう件。これなんとかならないかなー?と思ってたけど、

にちゃんと項目が挙がっていて。まあ解決したいとは思ってるけど、どう parse されるべきか決めなきゃね、ってところらしい。いずれ対応されるといいなぁ。

WYSIWYG そんな悪くないよ

WYSIWYG はあんまよくない」と書きましたけど、Wiki フォーマットを記述しない場合はそれなりに便利だと思い直しました。誤字を発見した場合なんかに、いちいち該当位置を textarea から探すのは面倒なので。

でもこれはフォーマット済みの HTML と textarea 中のカーソル位置をうまく連動させてやれば済む問題で。できればそっち方向で対応したいところ。