From: Shin-ichiro Hara Date: 1999-02-17T22:56:02+09:00 Subject: [ruby-dev:5217] htmlelem.rb (Re: HTML generator) 原です。 In message "[ruby-dev:4615] HTML generator" on 99/02/03, Wakou Aoyama writes: | |青山です。 |cgi-lib.rb は本来の CGI としての機能はすでに一通りもっており、足りない |機能は HTTP, HTML についてのものでした。そして、そられは HTTP, HTML の |ライブラリとして独立の方が良いだろうという事で、cgi-lib.rb の拡張はス |トップ。html-gen.rb はサンプルコードが出たものの、そのまま眠ってしまっ |たというのが現状です。 最近メールの流れが早くて、ついていっていません。(^^; html-gen.rb って どこにありますか? 本題ですが、やはり |header |start do | head do | title do | "title" | end | end | body do | p do | "message" | end | end |end こんな感じのがすっきりしていて見た目はいいのではないかと思います。 この様な文法を含む機能は持ってないのですが、簡単なものを書いてみ ました。[ruby-dev:4660] の青山案と [ruby-dev:4680] のかんだ案の 折衷みたいなものです。 -----^ html1.rb #!/usr/bin/ruby require "htmlelem.rb" html = HtmlElement.new h2 = HtmlElement.new("H2").i("Hello Ruby.") html.t("HTML") { t("HEAD").t("TITLE").i "This is TITLE" i "\n" t("BODY") { t("H1").i "Hello Ruby." i h2 i "Hello Ruby." } } html >> $stdout -----$ html1.rb の結果が、 This is TITLE

Hello Ruby.

Hello Ruby.

Hello Ruby. となります。つまり、t() がタグのオープンで、i() が挿入になって います。ちょうど | title do | "title" | end が t("TITLE") do i "title" end あるいは tag("TITLE").i "title" に対応しているわけです。 オブジェクトを作るので重いですが、cgi-lib.rb のおまけとしては まあまあではないでしょうか。 -----^ htmlelem.rb class HtmlElement class Tag def initialize(name, attr = nil, c_sw = false) @name, @attr = name, attr @c_sw = true if c_sw end def to_s s = ""; self >> s; s end def >>(io) if @c_sw io << "" io end end def initialize(name = nil, attr = nil, blk = true) open(name, attr, blk) @content = [] if blk end def open(name = nil, attr = nil, blk = true, &block) @name = name if name @attr = attr if attr @blk = blk self.instance_eval(&block) if block self end def insert(*bodies) @content.concat bodies self end alias i insert def <<(body) insert body end def tag(name, attr = nil, &block) HtmlElement.new(name, attr).open(&block) end def empty_tag(name, attr = nil, &block) HtmlElement.new(name, attr, false).open(nil, nil, false, &block) end def t(name, attr = nil, &block) me = tag(name, attr, &block) insert me me end def e(name, attr = nil, &block) me = empty_tag(name, attr, &block) insert me me end def set_attr(k, v = nil) raise "can't set attribute" unless @name if v @attr = {} unless @attr @attr[k] = v else @attr = k end self end def +(other) HtmlElement.new << self << other end def to_s s = "" self >> s s end def >>(io) Tag.new(@name, @attr) >> io if @name if @content @content.each { |c| case c when Numeric, String io << c else c >> io end } end Tag.new(@name, nil, true) >> io if @name && @blk io end def cr; i("\n"); end def br; e("BR"); cr; end def hr; e("HR"); end end -----$ htmlelem.rb