青山です。

やっと CGI.rb です。(in.coming に rd2html と一緒に入れて置きました)

手を付け始めた時には CGI.pm はさすがに大きいので、まあ、そのサブセット
程度になるかとも思っていたのですが、Ruby の優れた文法や仕様のおかげで、
使い勝手に関しては CGI.pm 以上になったような気がします。

一方、機能面では multipart form に対応していないので、ファイルアップロー
ドが出来ないというような不足があります。また、インターフェイスに関して
も Ruby のパフォーマンスをもってすれば、もっと改善する事も可能でしょう。

まだ初公開の段階ですし、Ruby1.3 以降用の dev オンリー向けライブラリで
もありますから、ご意見、ご要望等を寄せて頂ければ、追加だけでなく、変更
も間に合うと思います。気になる点がありましたら、使用者が増える前にどうぞ。

ドキュメントは本体に埋め込んであり、rd2html によって html 形式に変換し
て読む事ができます。

cgi-lib.rb, CGI.pm との相違点。

	query = CGI.new
	values = query['field']   # <== array of 'field'

	query = CGI.new
	values = query.cookie['name']  # <== values of 'name'

cgi-lib.rb では String を返し、複数の値が含まれる場合は "\0" で区切っ
てつなげていましたが、さすがにカッコ悪いうえに効率も良くないので、
Array を返すようにしました。

html 生成機能は、html3.2, html4.0, html4.0 Transitional, html4.0
Frameset に対応しています。CGI.pm では html2.0, html3.2 に対応し、
html4.0 には対応していません。

html = CGI.new("html3")    # html3.2
html = CGI.new("html4")    # html4.0 (Strict)
html = CGI.new("html4Tr")  # html4.0 Transitional
html = CGI.new("html4Fr")  # html4.0 Frameset

それぞれ、html.html() で DTD に応じた DOCTYPE 宣言が付加されます。

html 生成機能は DTD の定義に基づき、タグの生成タイプを3つにわけ、出力
してはならない終了タグが出力されたり、必ず必要な終了タグが出力されなかっ
たりという事が発生しないようになっています。(このような機能が使いやす
い形で実装できるのはメソッドにブロックを渡せる Ruby の仕様のおかげです。
CGI.pm ではこのような機能が実装される事は無いでしょう。)

デバッグがラクになるように、出力される html の簡易整形機能を持っています。
(CGI.pm でも外部ライブラリとして簡易整形機能がありますが、CGI.pm の
html 生成機能の実装方法ではこのような統合はむりでしょう。)

	html = CGI.new("html3")
	html.html(if $VERBOSE then "PRETTY" end){ "HTML string" }

popup_menu 等の引数の記述の仕方は CGI.rm よりもずっと柔軟性があるよう
になったと思います。これもまた Ruby と Perl の言語仕様の差のおかげです。

html.popup_menu("name", ["1", "Foo"], ["2", "Bar", true], "Baz")

<A HREF="url"> というような、良く使う attribute が決まっているものは、
a("url") のようなより簡単な記述を用意しています。これも Perl ですっき
り実現できていないのは、Ruby との言語仕様の差でしょう。(Perl でもオブ
ジェクト指向で記述すれば可能ですが、記述が長くなるので、Hash を渡すの
とあまり変わらないのですよね。)

Ruby を褒めまくっていますね... まあ、実際そうなのですからいいでしょう。

ユーザーからの入力に対するフィルタ機能として、ある特定のエレメントのタ
グを無効化する機能を追加しました。

	print CGI::escapeElement("<BR>", "A", "IMG")
	  # "<BR>&lt;A HREF="url"&gt;&lt;/A&gt"

また、逆にある特定のエレメントのタグだけを有効にしたい場合に便利な機能
として、エスケープされたタグを戻す機能も用意しました。

        str = "ユーザーの入力"
	CGI::unescapeElement(CGI::escapeHTML(str), "A", "IMG")

このようにして、ある特定のエレメントのタグだけを有効化する事ができます。

最後に、日本語を扱うのに便利な、文字コード変換機能と、charset パラメタ
の出力機能です。

CGI::print({"charset" => "iso-2022-jp"}){ "string" }

これで、"string" の文字コードは NKF により指定の物に変換され、
Content-Type ヘッダに charset パラメタが付加されます。

charsetパラメタの勧め
http://www.fxis.co.jp/DMS/sgml/html_correct_charset.html

他にも参照する所はいくつかありますが、将来、メールのように、http も
iso-2022-jp を標準にするという可能性があるようです。まあ、それを抜きに
しても、やはり charset パラメタぐらいはきちんと付けてやりたいですね。


-- 
青山 和光 Wakou Aoyama <wakou / fsinet.or.jp>