wikiクローンその2

ルールの拡張が容易になるように作り直してみた。
編集画面が常に表示されるパターン
ファイルアクセスを最小にする

#!/usr/bin/gosh
(use www.cgi)
(let*
    ((cgi (cgi-parse-parameters))
     (title (cgi-get-parameter "title" cgi :default "Sandbox"))
     (contents
      (let
          ((data (cgi-get-parameter "data" cgi))
           (filename (string-append "wiki/" title)))
        (if (eq? #f data)
            (call-with-input-file filename (lambda (x) (if x (port->string x) "")) :if-does-not-exist #f)
            (begin (with-output-to-file filename (lambda () (display  data))) data))))
     (compiled-contents
      (let me
          ((str contents)
           (rule '((#/\[\[([^\]]+)\]\]/ "<a href=\"./wiki2.cgi?title=\\1\">\\1</a>")
                   (#/[A-Z]\w*/ "<a href=\"./wiki2.cgi?title=\\0\">\\0</a>")
                   (#/\n/ "<br>\n"))))
        (if (eq? rule ()) str (regexp-replace-all (caar rule) (me str (cdr rule)) (cadar rule)))))
     )
  (display  #`"Content-type: text/html; charset=UTF-8

<html>
<body>
<h2>,|title|</h2>
,|compiled-contents|
<p>
<form method=get action='wiki2.cgi'>
<input type=hidden name='title' value=',|title|'>
<textarea name=data>,|contents|</textarea><br>
<input type=submit value='Submit'>
</form>
</body>
</html>"))