サイトの文字を「ああああ」に変換するジョークプラグイン。大幅な書き換えを行った。
一昨日のエイプリルフール企画で使ったプラグインをバージョンアップしてリリースする (nlog(n) - ああああプラグイン)。いくつかの問題点があったので (nlog(n): サイトを自分で改ざああああ),対策を考えた (nlog(n): HTML::TreeBuilder で日本語と文字参照を扱う場合の手順)。
修正点と変更点は次の通り。
このバージョンアップで,内部的には,かなり大きな変更となっている。バージョン 0.1 では,再帰を使って木をたどっていたが,バージョン 0.2 では再帰をやめ,テキストイベントを捕まえて処理するようにしている。この意味では,0.1 と 0.2 は違っているので,サンプルプログラムとしてはそれぞれ面白いのではないかと思う (使うことはないだろうけども)。バージョン 0.2 では,テキストハンドラ用のサブルーチンを書いているだけなので,プログラムの流れ的には,構文木を作った後,その木をそのまま HTML に変換しているだけのように見える。
<?php ... ?> が記事の中にある場合は,投稿時のテキストフォーマットは「なし」でなければならない (<br /> が自動挿入されないこと)。
今回のメインの修正は,文字参照への対応である。HTML::TreeBuilder は文字参照を勝手にデコードしてしまうという動作をする。だがしかし,文字参照をあらかじめエスケープして処理すると,空白の が &aaaa; に変換されてしまい,HTML として正しい表示にならない。そこで,文字参照以外のみを処理するようにした。このプログラムでは,文字参照を「『&』で始まり,『;』で終わる文字列」としている。この文字参照「以外」にマッチさせるのが難しい。
「文字参照以外の文字列にマッチ」という方法が思いつかないので,テキストを1文字ずつに分解して,『&』と『;』を探しながら,文字をくっつけて元に戻すという処理をしている。文字参照の中のときにフラグを立ててごちゃごちゃしたりして,やだなぁ,もう。
「encode_entities() は,構文木を作る前にやるといい」と言っておきながら (nlog(n): HTML::TreeBuilder で日本語と文字参照を扱う場合の手順),そうなっていない。文字参照を「aaaa」に変換させないようにするためである。
バージョンアップしたはいいが,問題はソースが汚くなってしまったことだ。美しく書けていないプログラムには,バグがきっといて,しかも見つけにくい。
追記:
PHP が含まれている場合は,制限があることが分かりました。<?php ... ?> が1行になってしまうため,「//」や「#」のコメントがあると正しく動作しません。この問題は簡単に解決できそうにありません。
2008年4月12日追記:
上の追記の問題は解決しました (nlog(n): HTML::Treebuilder で PHP スクリプトを含む HTML 文書を処理したい)。修正版をバージョン 0.3 としてリリースします。
Master Archive Index
Total Entry Count: 1957