CGIスクリプトを書く場合、「SchemeスクリプトをCGIとして起動する」で見たようにprint手続きで本体部を書くこともできますが、「HTMLを手軽に生成する」で使ったtext.html-liteライブラリで生成したHTMLが使えると便利です。
Gaucheには、text.html-liteライブラリで生成したHTMLリストが簡単に使えるwww.cgiライブラリが用意されています。
www.cgiライブラリとtext.html-liteライブラリを使って、「SchemeスクリプトをCGIとして起動する」で書いたhello.cgiを書き直してみましょう。
#!/usr/local/bin/gosh
(use www.cgi)
(use text.html-lite)
(cgi-main
(lambda (params)
(list
(cgi-header)
(html-doctype)
(html:html
(html:body
(html:p "Hello, Gauche!"))))))
まず、HTTPサーバーがgoshインタプリタを実行するために、最初の行に次の式を書きます。
#!/usr/local/bin/gosh
www.cgiライブラリとtext.html-liteライブラリが使用できるように次の式を書いておきます。
(use www.cgi)
(use text.html-lite)
cgi-main手続きでCGIを簡単にする
www.cgiライブラリのcgi-main手続きを利用すると、CGIに必要ないくつかの処理を簡単に書くことができます。
(cgi-main
(lambda (params) ...) ;; HTTPヘッダを含むリストを返す手続き
)
cgi-mainの最初の引数は「HTTPのヘッダ部を含むリストを返す手続き」です。ここではlambda式を書いて無名の手続きとして記述しています。
この手続きの最初の引数に渡されるのは「CGIに与えられたパラメータのリスト」です。ここでは最初の引数にparamという名前を付けています。このサンプルではparamは使われませんが、次節以降でCGIパラメータの取得方法を説明します。
cgi-header手続きでHTTPヘッダ部を出力する
HTTPのヘッダ部を含むリストを構築する上で便利な手続きがあります。www.cgiライブラリのhttp-header手続きです。
(cgi-header)
引数なしで単独で記述すると次のHTTPのヘッダ部を出力します。
Content-Type: text/html; charset=UTF-8
上記のUTF-8となっている箇所はGaucheの内部エンコーディングです。どの内部エンコーディングでビルドされたGaucheであるかによってかによってこの値は異なります。
html-doctype手続きでHTML Doctypeを出力する
HTTPの本体部ではまずtext.html-liteライブラリのhtml-doctype手続きを書いています。
(html-doctype)
この手続きが引数なしで評価されると以下のHTML Doctypeを出力します。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
text.html-liteライブラリでHTML要素のリストを構築する
HTTPの本体部では、HTML Doctypeに続いて、text.html-liteライブラリを使って構築されたHTML要素のツリーが出力されます。
(html:html
(html:body
(html:p "Hello, Gauche!")))
cgi-main手続きによって、上記は以下のHTMLとして出力されます。
<html><body><p>Hello, Gauche!</p
></body
></html
>
www.cgiを使うとCGIが楽に書けることを見てきました。次節以降ではCGIパラメータの取得方法やHTMLエスケープの方法を説明します。
by えんどうやすゆき