印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
DownloadMovableTypePlugin ああああプラグイン 0.2

サイトの文字を「ああああ」に変換するジョークプラグイン。大幅な書き換えを行った。

■ ■ ■

一昨日のエイプリルフール企画で使ったプラグインをバージョンアップしてリリースする (nlog(n) - ああああプラグイン)。いくつかの問題点があったので (nlog(n): サイトを自分で改ざああああ),対策を考えた (nlog(n): HTML::TreeBuilder で日本語と文字参照を扱う場合の手順)。

修正点と変更点は次の通り。

  • 全角英数字が変換されなかったのを修正
  • Wide character のエラーが出ないようになった
  • 文字参照は,元のまま変更しないようにした
  • <?php ... ?> は元のまま出力するようにした

このバージョンアップで,内部的には,かなり大きな変更となっている。バージョン 0.1 では,再帰を使って木をたどっていたが,バージョン 0.2 では再帰をやめ,テキストイベントを捕まえて処理するようにしている。この意味では,0.1 と 0.2 は違っているので,サンプルプログラムとしてはそれぞれ面白いのではないかと思う (使うことはないだろうけども)。バージョン 0.2 では,テキストハンドラ用のサブルーチンを書いているだけなので,プログラムの流れ的には,構文木を作った後,その木をそのまま HTML に変換しているだけのように見える。

<?php ... ?> が記事の中にある場合は,投稿時のテキストフォーマットは「なし」でなければならない (<br /> が自動挿入されないこと)。

今回のメインの修正は,文字参照への対応である。HTML::TreeBuilder は文字参照を勝手にデコードしてしまうという動作をする。だがしかし,文字参照をあらかじめエスケープして処理すると,空白の &nbsp; が &aaaa; に変換されてしまい,HTML として正しい表示にならない。そこで,文字参照以外のみを処理するようにした。このプログラムでは,文字参照を「『&』で始まり,『;』で終わる文字列」としている。この文字参照「以外」にマッチさせるのが難しい。

「文字参照以外の文字列にマッチ」という方法が思いつかないので,テキストを1文字ずつに分解して,『&』と『;』を探しながら,文字をくっつけて元に戻すという処理をしている。文字参照の中のときにフラグを立ててごちゃごちゃしたりして,やだなぁ,もう。

「encode_entities() は,構文木を作る前にやるといい」と言っておきながら (nlog(n): HTML::TreeBuilder で日本語と文字参照を扱う場合の手順),そうなっていない。文字参照を「aaaa」に変換させないようにするためである。

バージョンアップしたはいいが,問題はソースが汚くなってしまったことだ。美しく書けていないプログラムには,バグがきっといて,しかも見つけにくい。

追記:
PHP が含まれている場合は,制限があることが分かりました。<?php ... ?> が1行になってしまうため,「//」や「#」のコメントがあると正しく動作しません。この問題は簡単に解決できそうにありません。

2008年4月12日追記:
上の追記の問題は解決しました (nlog(n): HTML::Treebuilder で PHP スクリプトを含む HTML 文書を処理したい)。修正版をバージョン 0.3 としてリリースします。

Posted by n at 2008-04-03 00:45 | Edit | Comments (0) | Trackback(0)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
Comments
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?