nDiki : HTML::Scrubber

2005年9月13日 (火)

[ WiKicker ] hell mode - HTMLタグ付けブロックの導入

WiKicker では、直接 WikiPageHTMLタグを記述して表示に反映させる機能を提供していない。

HTMLタグ付けを許すのは嫌だ

HTMLタグ付けを許すと

  • 入力ミスによるトラブル
  • 悪意ある入力によるトラブル

が起きやすくなるし、ページのソースの単純さが大きく失われてしまう。 レンダリングしてHTMLにした時に、正しいHTMLを出力されることを保証することが困難になるとともに、HTML以外へのレンダリング/コンバートもかなり難しくなる。

この機能を導入すると、Wiki の良さの半分(あるいはもうちょっと沢山か、もうちょっと少なめ)が失われてしまう。

でも

とはいえ欲しいという声があることも事実。 オープンな WikiForum では全くお勧めできないが、閉じたユーザグループの中ではまぁ必要悪なのかもしれぬ。

また正直ちょっとした表現を追加したい時に、WiKicker 用のプラグインを書くのも面倒だというのは確かにある。

WiKicker では開始・終了マーカによる複数行にまたがるブロックを表すための文法は(閉じ忘れを避けるため)意図的に排除してある。 このため、複数行にわけて書きたいような長いデータを扱うような拡張も導入しにくい。

ちょっと手抜きして「生HTML書けちゃえば」という誘惑はなくはない。

大人の事情

ということでまあ自分に言い訳をしつつ、標準ではオフというかたちで HTMLタグ付けブロックを導入することにした。 スイッチは hell mode とかにしたい (今回は syntax.html というプロパティ名にしたけれど)。

記法は単純に、

 normal wiki syntax text...
 <html>
 html tagged text...
 ...
 </html>
 normal wiki syntax text...

のように行頭が <html> である行から、行頭が </html>である行までをHTMLタグ付けブロックとすることに。 このため、<html>ではじまる段落が書けなくなるという小さな非互換が発生するが、いたしかたない。

サニタイズ

HTMLタグを直接使えるようにするとはいえ、全てを許してしまうのはあまりに危険で非人道的すぎる。 有効なHTMLタグや属性は限定的であるべきだ。

このあたりの処理は面倒だが、幸いにしてCPANにモジュールがある。 今回は HTML::Scrubber を使うことにした。 HTML::Parserを使って parse し、指定したルールに従ってサニタイズしてくれる。

ちょっと使ってみた範囲では日本語(UTF-8UTF8 フラグなし)でも問題ないようだし、文法的に正しくなくてもきちんとサニタイズできているようだ。

ということで、これを採用することに。

どの要素・属性を許すかはまだきちんと決めかねる。 当面は様子をみながら、調整していく予定。 サニタイザは設置者が置き換えられるようにプラガブルにしておかねばならないな。

スポンサード リンク
[ 9月13日全て ]

2006年2月10日 (金)

WiKickerMakefile.PLModule::Install ベースに

WiKicker には依存している Perl モジュールとして、必須なものとオプションなものがある。 必須なものは例えば Log::Log4perl など。 一方 Cache::MemcachedHTML::Scrubber などは、追加機能を使用したい場合のみ必要である。

一般的な Perl モジュールパッケージと同様、WiKicker では Makefile.PLExtUtils::MakeMaker を使っている。 必須な依存 Perl モジュールは PREREQ_PM に指定してあるが、オプションのものについては独自にチェックして警告をするにとどめていた。 しかしこれだと、オプションのものは CPAN.pm を使って自動的にインストールすることができない。

ということで検討した結果、Module::Install を用いることにした。 Module::Install を用いて Makefile.PL を作成すると、

などの機能が使えるようになる。

Module::Install の実行に必要なファイルはパッケージの inc ディレクトリ以下に自動的にコピーされ配布パッケージに含められるので、インストールする側はそのために余分なインストールを強いられることもない。

最終的に内部で ExtUtils::MakeMaker を使っているので、それの機能はほぼ全て使える。

Perl のバージョンも 5.004 から使えるとのことで、Perl 5.005_03 以上を対象としている WiKicker で使っても問題なし。

ということで、Makefile.PL をさらっと書き換え。

合わせて WiKicker に含まれていた実験的な機能を削除して、(オプションな)依存モジュールも減らすことにした。

次回のリリース版から、Module::Install ベースだ。

[ 2月10日全て ]

2007年8月23日 (木)

無制限 HTML タグ付けブロックを使って nDikiGoogle Maps を貼る

Google Maps が ID を取得しないでも簡単に自分のサイトに貼れるようになった。 Google Maps で表示される HTML コードをページに埋め込めば、好きな場所の地図を貼ることができる。 これは嬉しい。

早速 nDiki でも貼りたい。

しかし WiKicker という WikiEngine をベースとした DiKicker を使っている nDiki では、現在のところ直接 HTML コードを使えるようにしていないのである。

HTML タグ付けを許すのは嫌」というスタンスできたのだが、他のサービスを貼るという魅力にはやはり勝てないな。 HTML 直書きを許すのは大局的にはデータ活用性などで好ましくない部分もあるが、各種サービスを活用できないで利用価値が下がるのは本末転倒なので、わかった上で使うということで。

ということで nDikiHTML タグ付けブロック機能を有効に設定。

ちなみに現行では HTML::Scrubber ベースで、使えるタグ・属性に制限をつけるフィルタしか用意してなかった。これだと Google Maps のコードがそのまま貼れない。 ということで「DiKicker」および「書く人が限定されているような Wiki」での利用を想定した無制限にスルーするフィルタモジュールを新規追加。

これで Google Maps を貼れるようにした。

では早速。


拡大地図を表示
[ 8月23日全て ]

About Me

Naney Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。

※内容は個人的見解であり所属組織とは関係ありません。

follow us in feedly

月別インデックス
Process Time: 0.061016s / load averages: 0.39, 0.51, 0.46
nDiki by WATANABE Yoshimasa (Naney, Google profile)
Powered by DiKicker