From: Taku Nakajima Date: 2002-05-13T16:20:37+09:00 Subject: [ruby-list:35085] Re: ruby_lib/html/ 中島@ブレーンです。 リクエストを処理する機能とHTML生成が分割されるのはありがたいです。 Walrusのように独自のHTML生成機能を使う場合にとてもわかりやすくなると思い ます。 On Mon, May 13, 2002 at 12:19:48AM +0900, Yukihiro Matsumoto wrote: > まつもと ゆきひろです > > In message "[ruby-list:35052] ruby_lib/html/" > on 02/05/12, Wakou Aoyama writes: > > |require "html/html3" > |html = HTML::Html3.new > |html.html() do > | html.head{ html.title{"TITLE"} } > | html.body() do > | html.h1{"head 1"} > | html.p() do > | "paragraph" > | end > | html.form() do > | html.textarea("field_name") > | html.br > | html.submit > | end > | end > |end > > これはたとえば > >

> Ruby's home page is here. >

> > というのを表現するために > > html.p{ > "Ruby's home page is " > html.a(:href=>"http://www.ruby-lang.org"){"here"} > "." > } > > とはできないわけですよね、連結しないから。これはどうしましょ > う。タグをつけないメソッドを用意するんですかね。 Walrusでは、ブロックが配列を返すと結果を連結して処理するようにしています。 html = e(:p) do [ "Ruby's home page is ", e(:a, :href=>"http://www.ruby-lang.org") { "here" }, "." ] end puts html # =>

Ruby's home page is here.

e()が汎用のhtml生成のメソッドですが、def_tagというクラスメソッドを利用し て、個別の専用メソッドを用意することもできます。 class Test include Obaq::HtmlGen def_tag :p def_tag :a def html p do [ "Ruby's home page is ", a(:href=>"http://www.ruby-lang.org") { "here" }, "." ] end end end puts Test.new.html # =>

Ruby's home page is here.

このようにしておくと、collectを利用してRubyらしい書き方ができます。 class Test include Obaq::HtmlGen def_tag :ul def_tag :li def html ul { (1..3).collect { |i| li { "No#{i}" } } } end end puts Test.new.html # => なお、Walrus(OBAQ)の実装は、木構造のオブジェクトを生成してから文字列に変 換しています。だからcgi.rbよりオーバーヘッドが大きいと思います。目的も違 うのでこれがそのままcgi.rbに使える可能性は少ないと思いますが、一応、この ような方法もあるということで参考までに。 -- 「stableでなければ生きていけない。unstableでなければ生きてる意味がない」 中島 拓 (株)ブレーン 研究部 (tnakajima@brain-tokyo.jp) http://www.brain-tokyo.jp/~research/koutetu/