haskell で wiki を書いてみた
>というわけで
>WASH
> の勉強がてら、 wiki っぽいものを作ってみた→
>/test/hwiki/
>
>
>超テキトーながら、50行ちょっとで書けた。→
>/prog/hwiki.hs
>
>
>作ったあとで思ったが、 hwiki という名前はたくさんあるのでやめた方がいいなあ。さてどうするか。 hawiki は Haskell.org の wiki だしー。
>
>簡単にコードの解説。 main 関数中の run というのが wash によって提供される関数で、 CGI 動作を定義した値(CGI ()等)を受け取って実際に CGI を駆動させます。 selfLocation は(本当は環境から取得するもんだがとりあえず適当な)自分の URL を指していて、 tell するとリダイレクトする CGI 動作が生成されるという仕組み。 dispatch はパスから、コマンドっぽいものがあったらそれを駆動し、でなければパスをページ名とみなして表示します。
>
>いまんとこ動作は view と edit。 view はページ名からデータを取り出します。 WASH には Persistent2 という永続化データ用のモジュールがあります。ページ名でハンドルを取り出し、データをゲットしてきて表示。データが空なら新しくページを作ろうとする。今回、 wiki 構文を調べるとかしてないので、 pre で括るだけです。 text_S だけで html のエスケープもしてくれるみたい。
>
>edit は view とほとんど構造が同じなので共有化できそうですが、まあそれはともかく、こっちは永続化データを取り出してきて、それをもとにフォームを形成しています。この do 記法がポイントで、 textarea から得たデータが submitPageData に渡され、 (update pageName) に引数として渡される……かのようなフォームがこれによって作られています。
>
>update は edit の submit ボタンからしか呼ばれることはなく、ページに実際の値をセットし、そのページにリダイレクトします。この関数に外部から直接アクセスすることは(たぶん)できません……ソースを読むとわかりますが、謎の値が hidden 属性で渡されているから。
>
>お手軽に使えるので Persistent2 を使ったけど、そのサーバで動いている全ての WASH な CGI で名前空間を共有する、存在する名前のリストが取れない、などなどの問題があるので本当に wiki を使うならやめた方がよさげ。
>
>というあたりで、これからどうするか。うーん、とりあえず wiki 記法をあれこれするために Parsec の勉強でもしようと思います。
>