一般的な Wiki で文書を編集している場合、texterea で編集後、「保存する」ボタンをクリックすることになると思います。編集途中で間違ってブラウザを閉じてしまった場合や、何らかの理由でブラウザが落ちてしまった場合は、それまでの編集結果はどこにも保存されることなく消え去ってしまいます。これに対抗するには、何らかのエディタを使ってバックアップを取りつつ編集して、最後にコピペすればいいのですが、それはそれで面倒です。
今回はそういう問題に対抗するべく、「入力が止まって 0.5 秒後」に自動保存するようにしてみました。これでしっかり保存されるのかどうかという点ですが、入力途中に考え込んだりする時間があることを考えると、大丈夫なんじゃないかなと思っています。特定のアクション、例えば、「エンターが押されたとき」に自動保存とかにしちゃうと、何人かに一気にやられるとサーバが落ちてしまうので怖くてダメです。サーバに優しくて、何かもっといい方法があれば、考えていきたいと思います。
動作検証用の Wiki を用意しました。ご自由におためしください。
さて、今回の処理の流れを書きます。
以下のような感じになりました。なので、通常保存が行われない場合は、サーバ側に自動保存の内容が残るようになっています。公開されてはマズいようなメモを、公開している Wiki 上で編集するようなことはないので、自動保存が公開されることについては問題ないと思っています。
編集フォーム作成時
- サーバ側
- 「自動保存用ページ名」を作る(.save-yyyymmdd-hhmmss-fugahoge)
- 「認証用キー」を作る(認証に使う)
- 「自動保存用ページ名」の infobase に「認証用キー」を登録しておく
- 「自動保存用ページ名」を凍結しておく(第三者に自動保存内容を編集されないため)
- 上記2つのページ名とキーをフォームに入れておく(フォームに入ってるので、「保存する」を押した場合などに送られる)
編集フォームでの編集時
- 送信側(クライアント側)
- 適当な間隔でページの内容を、自動保存用ページ名・認証用キーとともに送る。
- 受信側(サーバ側)
- 自動保存用ページ名・認証用キーのペアが正しいことを確認できた場合、凍結を無視して自動保存する。
編集終了時
- 送信側(クライアント側)
- 自動保存用ページ名・認証用キーを付加して、通常通り保存
- 受信側(サーバ側)
- 自動保存用ページ名・認証用キーのペアが正しいことを確認し、通常保存するとともに、自動保存の内容を削除する。
最後に
今回の hack にあたっては、YukiWiki を使わせていただきました。
また、JavaScript ライブラリとして AjaxAC - Open-souce PHP framework for AJAX のサンプルであるGoogleSuggestCloneJax の出力結果をいじった物を使っています。ちなみに、AjaxAC のライセンスは Apache ライセンス 2.0 となっています。
ということで、YukiWiki 2.1.2a へのパッチ、及び、Javascript は、分割してこちらに置いてありますので、ご自由にどうぞ。
動作検証用の Wiki もあります。ご自由におためしください。

Leave a comment