中島@ブレーンです。

リクエストを処理する機能と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 <wakou / fsinet.or.jp> 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
> 
> これはたとえば
> 
> <p>
> Ruby's home page is here.
> </p>
> 
> というのを表現するために
> 
> 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
  # => <p>Ruby's home page is here.</p>

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
  # => <p>Ruby's home page is here.</p>

このようにしておくと、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
  # => <ul>
  #      <li>No1</li>
  #      <li>No2</li>
  #      <li>No3</li>
  #    </ul>
  
なお、Walrus(OBAQ)の実装は、木構造のオブジェクトを生成してから文字列に変
換しています。だからcgi.rbよりオーバーヘッドが大きいと思います。目的も違
うのでこれがそのままcgi.rbに使える可能性は少ないと思いますが、一応、この
ような方法もあるということで参考までに。
    
-- 
「stableでなければ生きていけない。unstableでなければ生きてる意味がない」
中島 拓 (株)ブレーン 研究部 (tnakajima / brain-tokyo.jp)
http://www.brain-tokyo.jp/~research/koutetu/