ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

2007年~2011年ごろまで はてなダイアリー に書いてた記事を引っ越してきました。

WikiとHTMLの関係について

昨日一日色々考えてて(いや、実際はCentOS5.1DLしたりインストールしてたり、Amazonから届いたCDをmp3に変換してたり、note-pcをウィルスバスター2007にupgradeしてたり、DVDコピーしてたりとかいろいろしつつだったのですが)、どうにもKinoWikiをそのまま持ち込むと明らかにまじゅい箇所がありそうな気がしまして、WikiとHTMLの関係性を再考してみました。

現状、WikiとHTMLのドキュメントは別々になってます。つまりデータとしては排他的になってて、WikiとHTMLが混ざるようなテキストは想定していません。
が。
特に検索時に於いて、YakiBikiはデフォルトで10個程度のテキストを表示します。しかも10回はあくまでもデフォルトです。30個、50個程度までmaxを上げられます。最大50回WikiのParserが発動します。


さすがに、これは看過できません。明らかにめちゃくちゃ処理が重くなることが明らかだからです。
よって、Wikiデータは新規作成・更新時、HTMLにコンバートしたのをキャッシュしておくことにしました。
が。YakiBikiの場合はそれでは済まない箇所があります。

これらはいずれも、そのデータ以外のデータID群を表示するプラグイン(であり、先日の精選の際にYBに残ったもの)です。
しかしYakiBikiの場合、データのACLが変更され、今まで読み込み可能だったデータが読み込めなくなる場合があります。
YakiBikiでは、読めないデータはリストに出来る限り表示しないポリシーです。なぜなら、データ名自身も「隠したい」対象になる可能性があるからです。「秘密」とか「○○レベル以上閲覧禁止」とか「○○の個人情報」みたいなデータ名を、いくら本体が読めないとはいえ、無制限に表に出したくないし、そんなの見たくないです。
livedoorのnovaとかではタイトルは見えるようになってるわけですが、そもそもタイトルが面白そうでも中身が読めない、だったら最初から見せるなよと・・・まぁ、私は思うわけです。
つまりreadすら制限しているデータは、ユーザーからは「不可視」であるべきです。

さてこのポリシーに沿ってもう一度上掲のプラグインを眺めてみますと、いずれも「その都度、ACLを評価してデータ群を読み込む」必要のあるものばかりです。つまり、キャッシュを使えません。

ではWikiプラグインは全部キャッシュを使わないのか・・・というと、例えば標準のリストやtableタグ作成書式、あるいは単にセンタリングしたり左・右寄せしたりするだけのプラグイン、あるいはoutline(pukiwikiならcontents)プラグインなど目次をつくるだけのプラグイン、これらについてはキャッシュさせたいわけです。えーっと、つまり一口にWikiデータと言っても、そのテキストデータ中にはキャッシュしたい領域と、キャッシュさせず、都度評価させたい領域の二種類が混在するわけです。

で、どうするか。よくよく上掲のプラグインを見てみると、HTMLドキュメントでも使えたら便利そうだなとか思うわけです。ということはですよ?HTMLドキュメント自体も幾つかの都度評価される特殊プラグインを埋め込めるようにしておきます。こんな感じ。

<h2>HTMLドキュメントですので、普通にHTMLタグを使えます。</h2>
↓は最近更新・作成されたリスト一覧。ACL評価付き。20というのはリストの表示個数。
<yb_recent 20 />

↓これで、HTMLドキュメントでも、Wikiと同様の自動「前後・目次・上」ナビゲーション使用可能。
<yb_navi />
当然前後・上のドキュメントアクセスについてはACL評価付きで、READ不可な場合はskipされる。

<yb_include did=100 with=20 height=30 />
↑これは他ドキュメントのインポート。didがデータID。他はdivなりimgタグの属性に展開される・・・かも。

<yb_ls カテゴリ1/カテゴリ2/カテゴリ3 />
↑これは"カテゴリ1/カテゴリ2/カテゴリ3/*"の名前のデータ一覧を作成する。
引数が省略された場合は、現在のページ名が基点となる。

こんな感じになるわけです。で、Wikiが更新されると、lsやらincludeなどは、上記HTMLプラグインの形に展開され、それがキャッシュとして保存されます。
表示する時は、HTMLであればそのままプラグイン変換器に通し、Wikiの場合は、キャッシュから取りだしたものを変換器に通します。

[Wiki]
Wiki -> HTML(キャッシュ) -> HTMLプラグイン変換器 -> 完全なHTML

[HTML]
HTML -> HTMLプラグイン変換器 -> 完全なHTML

こんな感じ。で、実際のプラグインはほぼ全てACL評価が必要である為、まだ未実装。ただ、HTMLのpluginをcallする実装はテスト済で出来上がったので、あとはACLを組み合わせて徐々に形を整えていく。
Wikiモジュール系はまだ全然落ち着いていない。・・・が、ある程度ACLが出来上がったら、そちらに移っても良い。上記整理で、Wikiプラグイン側の処理としてACL評価に絡む箇所は切り離せたので、ACL処理が出来上がっていなくても実装、できなくも・・・無いか。