« 2006年02月 | Main | 2005年11月 »
Thingamablog 1.0.4 以降用日本語用の XHTML 1.0 Strict のテンプレートと CSS のセット Mac_Stripe-XHTML_Strict-ja を更新しました。
続きを読む1.0.4 から Hypertext テンプレートタグで置換設定ができるようになったのはエントリ「1.0.4 がもう出た」で述べた。What's New でも簡単に解説されているが、Thingamablog で所謂「Read More」を実現する方法も交えて突っ込んだ使い方を説明する。
続きを読む
Thingamablog 1.0.3 以上で Hypertext テンプレートタグに limit_length, tidy_html を使用するか、使用しなくても RSS 中では日本語などの非 7bit 文字が実体参照にされてしまう現象を抑えるために tagsoup のカスタムバージョンを配布します。
次のリンクからダウンロードしてください。
tagsoup-1.0rc3-OKAMURA.tar.gz (40KB)このアーカイブの中には次のファイルが入っています。
ライセンスを記載したファイルです。オリジナルのものと同じです。
カスタムバージョンの簡単な説明を書いています。
カスタム版本体です。
オリジナルのソースからカスタム版のソースを生成するためのパッチファイルです。
オリジナルは TagSoup home page から取得できます。
Thingamablog に入っている tagsoup-1.0rc3.jar をこのカスタム版の tagsoup-1.0rc3.jar と置き換えます。次の手順で行います。
次回から Thingamablog でカスタム版が使用されるようになります。
先のエントリ「org.ccil.cowan.tagsoup の情報求む」でドキュメントを探していた org.ccil.cowan.tagsoup パッケージだが、ドキュメントはなかったのだがソースはあった。
なんと、そのソースを読むと非 7 bit の文字は問答無用で実体参照にしていた。org.ccil.cowan.tagsoup を使う限りどうしようもないというわけだ。
そうなると取るべき手段は次のどれかだろう。
どれにしようかなあ。
全くどうしようもないというわけでもなさそうだ。ソースを読むとテキスト部分を CDATA としてしまえば実体参照にはならなように見える。しかしエントリを書くのに全てのテキストを <![CDATA[ と ]]> で挟むのはいくら僕でも苦痛だ。Thingamablog 内で一時的に付けて外すというのも面倒だ。というよりもそれができるのなら終了タグの欠落を補うコードを自前で書いた方が遥かにましだ。
エントリ「1.0.5 の RSS がおかしい」で述べた RSS において EntryBody の日本語が実体参照になる原因を調べた。
net.sf.thingamablog.generator.HyperTextTag クラスの tidyHTML メソッドを通すと日本語が実体参照になってしまう。そのメソッドでは org.ccil.cowan.tagsoup.XMLWriter クラスと org.ccil.cowan.tagsoup.Parser クラスを使って、HTML を整形している。
この整形は必要なものだ。RSS で各エントリの内容を全ては書かない設定(デフォルトではそうなっている)にしているとエントリの内容が切られるのだが、その際に開始タグがあるのに終了タグがない状態になってしまう。これを補正するためのものだからだ。だから外すわけにはいかない。
また encode_html="1" を付けているときに実体参照 &#NNNN; の & が & になってしまうのは、上の tidyHTML で実体参照になった後に HTML 予約文字を実体参照にしているからである。しかしこの順序を逆にするわけにもいかない。なぜならば、HTML 予約文字を実体参照にしたあとではそれは既にただの文字であってタグ付けに意味がある文字ではないからである。tidyHTML で開始タグがあるのに終了タグがないということを認識できなくなる。
org.ccil.cowan.tagsoup のクラス群で実体参照にされてしまうのを防ぐことができれば全てはうまくいく。そうしようと org.ccil.cowan.tagsoup のドキュメントを探したのだが Google ても見つからないのだ。org.ccil.cowan.tagsoup のクラス群のドキュメントはどこにあるのだろう?
いっそのこと作者に投げちゃおうかな。
1.0.5 を試してみてどうも RSS がおかしい。
feed.template の item 要素の中の description で EntryBody テンプレートタグを使うわけだが次のようになってしまう。
| 指定した属性 | HTML タグ | 日本語 |
|---|---|---|
| (無指定) | そのまま | 実体参照になる |
strip_html="1" |
なくなる | 実体参照になる |
encode_html="1" |
HTML 予約文字が実体参照になる | 実体参照にした上で、& が & になる。 |
close_empty_tags="1" |
そのまま(若干修正されるケースあり) | 実体参照になる |
tidy_html="1" |
そのまま(若干修正されるケースあり) | 実体参照になる |
つまり属性の処理とは関係なく日本語が実体参照にされてしまっている。このこと自体も凄く嫌だが、encode_html 属性と組み合わせると悲惨なことになる。UTF-8 を使用している場合、3 バイトの日本語文字が、実体参照になって 8 バイトくらい、更に & が実体参照にされて 12 バイトくらいになってしまうからだ。
因に EntryBody テンプレートタグを feed.template 内で使用するときに strip_html="1" も encode_html="1" も指定しないときは <![CDATA[<$EntryBody$>]]> と書かないとならない。そしてエントリのソースに ]]> と書くようなことはしてはならない。
Thingamablog 1.0.5 に合わせて日本語用の XHTML 1.0 Strict のテンプレートと CSS のセット Mac_Stripe-XHTML_Strict-ja を更新しました。
変更主旨は次のとおりです。
1.0.3 でこのカスタム版の修正/変更が全て取り込まれたので、純正 Thingamablog を使えば十分になりました。このカスタム版役目は終了しました。
これにより TemplatesDir カスタムタグは使用されなくなります。
1.0.2 まで BlogEntry コンテナを複数箇所で使用すると、それぞれにエントリの内容が書き出されてしまうバグがありました。これに対応するため HTML ヘッダからボディにわたって BlogEntry コンテナで囲って BlogEntry コンテナを無理矢理一つだけ使うようにしていました。
そもそも BlogEntry コンテナを複数箇所で使いたかったのは次の理由からです。
<$PageTitle$> の代わりに <$EntryTitle split_html="1"$> を使いたかったから。<$EntryAuthor$> を使いたかったから。<$EntryDate format="yyyy"$> を使いたかったから。<$EntryAuthorEmail mung="1"$> を入れたかったから。<$PageTitle$> の代わりに <$EntryTitle$> を使いたかったから。最初と最後の項目は次の変更主旨に関連します。
<$PageTitle$> がエントリのタイトルとして機能するようになったので活用することにした。
これも 1.0.3 で解消されたバグです。そういう仕様だと思ってバグとは思っていなかったのですがバグだったそうです。
ダウンロードはエントリ「Mac_Stripe-XHTML_Strict-ja」からどうぞ。
もういい加減にアップデートしないとと思い 1.0.2 から 1.0.5 に Thingamalog をアップデートしてみた。テンプレートもそれに合わせて改造する必要もあるし。
ところがダウンロードした1.0.5 を起動してブログの設定パネルを開こうとしても開かない。メニューからやってみても開かない。これは段階を踏んでやらないといけないのかもしれないと思い、以前ダウンロードしておいた 1.0.3 を起動して設定パネルを開いてみた。1.0.4 はダウンロードしていなかったから飛ばして、もう一度 1.0.5 を起動して設定パネルを開こうとしたがやっぱり駄目だった。
これはデバッグが必要かなと思いながら、取り敢えずソースから一式をビルドした。ビルドしてできた thingamablog.jar を使ってみたらあっさり設定パネルが開いた。
Mac OS X ユーザはもしかするとダウンロードしたバイナリでは同様のことが起るかもしれない。もし起きたらソースからビルドしてみるとよい。希望があればそのやり方をエントリにするので、ビルドの仕方がわからない人はコメントで知らせてほしい。Mac OS X ならば簡単にできる。
1.0.3 からカテゴリ毎の RSS を生成できるようになり、RSS の拡張子を選択する設定ができるようになった。この拡張子のデフォルトは .rss になっている。しかし、この拡張子では大抵の web サーバは MIME タイプを text/xml などにはしてくれないだろう。
だからカテゴリの RSS を生成する人は拡張子を使っている web サーバに合わせて変えるか、web サーバの設定を変えるかをする必要があるケースが多いだろう。メインの RSS に合わせておくのがよい。