青山です。

On Mon, May 13, 2002 at 12:19:48AM +0900,
 Yukihiro Matsumoto wrote:

> <p>
> Ruby's home page is here.
> </p>
> 
> というのを表現するために
> 
> html.p{
>   "Ruby's home page is "
>   html.a(:href=>"http://www.ruby-lang.org"){"here"}
>   "."
> }
> 
> とはできないわけですよね、連結しないから。これはどうしましょ
> う。タグをつけないメソッドを用意するんですかね。

html << "string" というのが結構良さそうかなと思っています。

html.p{
  html << "Ruby's home page is "
  html.a(:href=>"http://www.ruby-lang.org"){"here"}
  html << "."
}

ブロックの最後の文字列を受け取るので、html.a(){"here"} の "here" は、
そのままでもOK。あるいは、明示的に html.a(){ html << "here" } でもOK。
という感じかなと。(html << は nil を返す)

ただし、現在の cgi.rb は素直に文字列を利用しているので、次のような記述
は期待した結果となりますが、新しいバッファを利用したタイプでは、各メソッ
ドの処理(ブロック)の終了のタイミングに左右されるので、<A></A> の方が
"Ruby's" よりも先になってしまうという問題が発生します。

html.p{ "Ruby's home page is #{html.a(:href=>"http://"){"here"}}." }
html.p{ "Ruby's home page is" + html.a(:href=>"http://"){"here"} + "." }

後者のような書き方が出来ないのはあまり問題無さそうですが、前者のタイプ
は、ヒアドキュメントを利用した場合にはまる人が出て来る可能性はありそう
です。

もっとも、ヒアドキュメントを利用する場合には、きっとそこには HTML タグ
がそのまま書かれていると思われますから、そこで HTML 生成メソッドが使わ
れる可能性はあまり無いだろうとは思われますが。

> あと、htmlの各ブロックでselfをすりかえると
> 
> html = HTML::Html3.new
> html.html() do
>   head{ html.title{"TITLE"} }
>   body() do
>     h1{"head 1"}
>     p() do
>       "paragraph"
>     end
>     form() do
>       textarea("field_name")
>       br
>       submit
>     end
>   end
> end
> 
> とちょっとすっきりかけますが、selfのすりかえはやや特殊なので、
> そっちのほうがよいのかどうかはにわかには判断できません。

そうですね。以前この案が出た時にも p の意味が変わってしまうというよう
なあたりから少し恐さを感じました。ある意味、このブロック内は別の言語の
世界になっている、という感じになるわけですよね。

しかし、Ruby の強力さをアピールするには良い例、という気持もしないでも
ないので、悩ましい選択肢の1つではあります。

トリッキーではあるので、もし、これを検討対象とする場合には、議論という
より、実際に動く物を作ってみる必要がありそうですね。


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