From: nobu.nakada@... Date: 2002-01-16T19:35:03+09:00 Subject: [ruby-list:33409] Re: cgi-ng ( Re: ruby-mode のインデント不具合 (} + の次の行)) なかだです。 あまりにもデカくなってしまったので、ruby-devに。 At Wed, 16 Jan 2002 16:20:14 +0900, matz@ruby-lang.org (Yukihiro Matsumoto) wrote: > できれば次世代CGIライブラリは > > require 'cgi-ng' > cgi = CGI.new('html4') > cgi.out { > cgi.html { > cgi.head { > cgi.title {'title'} > } > cgi.body { > cgi.h1 {'title'} > cgi.p {'contents'} > } > } > } > > というインターフェースであってほしいものです。あるいは こんな感じでしょうか。とりあえず上くらいの単純なものなら、今の とだいたい同じ結果になりそうな気が。 Index: cgi.rb =================================================================== RCS file: /cvs/ruby/src/ruby/lib/cgi.rb,v retrieving revision 1.33 diff -u -2 -p -r1.33 cgi.rb --- cgi.rb 2001/11/21 03:30:22 1.33 +++ cgi.rb 2002/01/16 10:00:26 @@ -560,5 +560,6 @@ convert string charset, and set language options = { "type" => options } if options.kind_of?(String) - content = yield + yield + content = @content.join("\n") << "\n" if options.has_key?("charset") @@ -584,4 +585,12 @@ convert string charset, and set language end + def <<(s) + if s and !s.empty? + @nest -= 1 if /\A<\// =~ s + @content << (@pretty and @nest > 0 ? (@pretty * @nest) << s : s) + @nest += 1 if /\A<[^!\/]/ =~ s and /\/>\z/ !~ s + end + self + end =begin @@ -1000,5 +1009,7 @@ convert string charset, and set language def nn_element_def(element) <<-END.gsub(/element\.downcase/n, element.downcase).gsub(/element\.upcase/n, element.upcase) - "" + + }.to_s + ">" if block_given? - yield.to_s - else - "" - end + - "" + self << yield + end + self << "" + @nest = nest + "" + end END end @@ -1021,5 +1033,6 @@ convert string charset, and set language def nOE_element_def(element) <<-END.gsub(/element\.downcase/n, element.downcase).gsub(/element\.upcase/n, element.upcase) - "" + "" + end END end @@ -1036,5 +1051,7 @@ convert string charset, and set language def nO_element_def(element) <<-END.gsub(/element\.downcase/n, element.downcase).gsub(/element\.upcase/n, element.upcase) - "" + + }.to_s + ">" if block_given? - yield.to_s + "" - else - "" + self << yield + self << "" + @nest = nest end + "" + end END end - end # TagMaker @@ -1191,15 +1209,14 @@ convert string charset, and set language values.collect{|value| if value.kind_of?(String) - checkbox(name, value) + value + checkbox(name, value) + self << value + elsif value[-1] == true + checkbox(name, value[0], true) + self << value[-2] else - if value[value.size - 1] == true - checkbox(name, value[0], true) + - value[value.size - 2] - else - checkbox(name, value[0]) + - value[value.size - 1] - end + checkbox(name, value[0]) + self << value[-1] end - }.to_s + } end @@ -1261,16 +1278,11 @@ The hash keys are case sensitive. Ask th method end - if block_given? - body = yield - else - body = "" - end + yield if block_given? if @output_hidden - hidden = @output_hidden.collect{|k,v| - "" - }.to_s - body += hidden + @output_hidden.collect{|k,v| + self << "" + } end - super(attributes){body} + super(attributes) end @@ -1338,30 +1350,20 @@ The hash keys are case sensitive. Ask th attributes = { "PRETTY" => true } end - pretty = attributes.delete("PRETTY") - pretty = " " if true == pretty - buf = "" + @pretty = attributes.delete("PRETTY") + @pretty = " " if @pretty == true if attributes.has_key?("DOCTYPE") - if attributes["DOCTYPE"] - buf += attributes.delete("DOCTYPE") - else - attributes.delete("DOCTYPE") + if d = attributes.delete("DOCTYPE") + self << d end else - buf += doctype + self << doctype end if block_given? - buf += super(attributes){ yield } - else - buf += super(attributes) - end - - if pretty - CGI::pretty(buf, pretty) + super(attributes){ yield } else - buf + super(attributes) end - end @@ -1516,17 +1518,15 @@ The hash keys are case sensitive. Ask th values.collect{|value| if value.kind_of?(String) - option({ "VALUE" => value }){ value } + option({ "VALUE" => value }){ self << value } + elsif value[-1] == true + option({ "VALUE" => value[0], "SELECTED" => true }){ + self << value[-2] + } else - if value[value.size - 1] == true - option({ "VALUE" => value[0], "SELECTED" => true }){ - value[value.size - 2] - } - else - option({ "VALUE" => value[0] }){ - value[value.size - 1] - } - end + option({ "VALUE" => value[0] }){ + self << value[-1] + } end - }.to_s + } } @@ -1588,17 +1588,16 @@ The hash keys are case sensitive. Ask th name = name["NAME"] end - values.collect{|value| + values.each {|value| if value.kind_of?(String) - radio_button(name, value) + value + radio_button(name, value) + self << value + elsif value[-1] == true + radio_button(name, value[0], true) + self << value[-2] else - if value[value.size - 1] == true - radio_button(name, value[0], true) + - value[value.size - 2] - else - radio_button(name, value[0]) + - value[value.size - 1] - end + radio_button(name, value[0]) + self << value[-1] end - }.to_s + } end @@ -1718,6 +1717,31 @@ The hash keys are case sensitive. Ask th end # HtmlExtension + extend TagMaker + methods = "" + + methods << nn_element_def("PRE").sub(/(\n\s+)self << yield/, '\1@nest = 0\&') + + # - - + for element in %w[A ADDRESS B BIG BLOCKQUOTE CAPTION CITE CODE + DFN DIV DL EM FORM H1 H2 H3 H4 H5 H6 I KBD MAP OL SAMP + SCRIPT SELECT SMALL STRONG STYLE SUB SUP TABLE TEXTAREA + TITLE TT UL VAR] + methods << nn_element_def(element) + end + + # - O EMPTY + for element in %w[AREA BASE BR HR IMG INPUT LINK META PARAM] + methods << nOE_element_def(element) + end + + # O O or - O + for element in %w[HTML BODY P DT DD LI OPTION TR TH TD HEAD] + methods << nO_element_def(element) + end + + eval(methods) module Html3 + extend TagMaker def doctype @@ -1725,46 +1749,27 @@ The hash keys are case sensitive. Ask th end - def element_init - extend TagMaker - methods = "" - # - - - for element in %w[ A TT I B U STRIKE BIG SMALL SUB SUP EM STRONG - DFN CODE SAMP KBD VAR CITE FONT ADDRESS DIV center MAP - APPLET PRE XMP LISTING DL OL UL DIR MENU SELECT table TITLE - STYLE SCRIPT H1 H2 H3 H4 H5 H6 TEXTAREA FORM BLOCKQUOTE - CAPTION ] - methods += <<-BEGIN + nn_element_def(element) + <<-END - def #{element.downcase}(attributes = {}) - BEGIN - end - END - end + methods = "" - # - O EMPTY - for element in %w[ IMG BASE BASEFONT BR AREA LINK PARAM HR INPUT - ISINDEX META ] - methods += <<-BEGIN + nOE_element_def(element) + <<-END - def #{element.downcase}(attributes = {}) - BEGIN - end - END - end + # - - + for element in %w[APPLET center DIR FONT LISTING MENU STRIKE U XMP] + methods << nn_element_def(element) + end - # O O or - O - for element in %w[ HTML HEAD BODY P PLAINTEXT DT DD LI OPTION tr - th td ] - methods += <<-BEGIN + nO_element_def(element) + <<-END - def #{element.downcase}(attributes = {}) - BEGIN - end - END - end - eval(methods) + # - O EMPTY + for element in %w[BASEFONT ISINDEX] + methods << nOE_element_def(element) end + # O O or - O + for element in %w[PLAINTEXT] + methods << nO_element_def(element) + end + + eval(methods) end # Html3 module Html4 + extend TagMaker def doctype @@ -1772,45 +1777,29 @@ The hash keys are case sensitive. Ask th end - def element_init - extend TagMaker - methods = "" - # - - - for element in %w[ TT I B BIG SMALL EM STRONG DFN CODE SAMP KBD - VAR CITE ABBR ACRONYM SUB SUP SPAN BDO ADDRESS DIV MAP OBJECT - H1 H2 H3 H4 H5 H6 PRE Q INS DEL DL OL UL LABEL SELECT OPTGROUP - FIELDSET LEGEND BUTTON TABLE TITLE STYLE SCRIPT NOSCRIPT - TEXTAREA FORM A BLOCKQUOTE CAPTION ] - methods += <<-BEGIN + nn_element_def(element) + <<-END - def #{element.downcase}(attributes = {}) - BEGIN - end - END - end + methods = "" - # - O EMPTY - for element in %w[ IMG BASE BR AREA LINK PARAM HR INPUT COL META ] - methods += <<-BEGIN + nOE_element_def(element) + <<-END - def #{element.downcase}(attributes = {}) - BEGIN - end - END - end + # - - + for element in %w[ABBR ACRONYM BDO BUTTON DEL FIELDSET INS LABEL + LEGEND NOSCRIPT OBJECT OPTGROUP Q SPAN] + methods << nn_element_def(element) + end - # O O or - O - for element in %w[ HTML BODY P DT DD LI OPTION THEAD TFOOT TBODY - COLGROUP TR TH TD HEAD] - methods += <<-BEGIN + nO_element_def(element) + <<-END - def #{element.downcase}(attributes = {}) - BEGIN - end - END - end - eval(methods) + # - O EMPTY + for element in %w[COL] + methods << nOE_element_def(element) + end + + # O O or - O + for element in %w[THEAD TFOOT TBODY COLGROUP] + methods << nO_element_def(element) end + eval(methods) end # Html4 module Html4Tr + extend TagMaker + include Html4 def doctype @@ -1818,47 +1807,28 @@ The hash keys are case sensitive. Ask th end - def element_init - extend TagMaker - methods = "" - # - - - for element in %w[ TT I B U S STRIKE BIG SMALL EM STRONG DFN - CODE SAMP KBD VAR CITE ABBR ACRONYM FONT SUB SUP SPAN BDO - ADDRESS DIV CENTER MAP OBJECT APPLET H1 H2 H3 H4 H5 H6 PRE Q - INS DEL DL OL UL DIR MENU LABEL SELECT OPTGROUP FIELDSET - LEGEND BUTTON TABLE IFRAME NOFRAMES TITLE STYLE SCRIPT - NOSCRIPT TEXTAREA FORM A BLOCKQUOTE CAPTION ] - methods += <<-BEGIN + nn_element_def(element) + <<-END - def #{element.downcase}(attributes = {}) - BEGIN - end - END - end + methods = "" - # - O EMPTY - for element in %w[ IMG BASE BASEFONT BR AREA LINK PARAM HR INPUT - COL ISINDEX META ] - methods += <<-BEGIN + nOE_element_def(element) + <<-END - def #{element.downcase}(attributes = {}) - BEGIN - end - END - end + # - - + for element in %w[APPLET CENTER DIR FONT IFRAME MENU NOFRAMES S + STRIKE U] + methods << nn_element_def(element) + end - # O O or - O - for element in %w[ HTML BODY P DT DD LI OPTION THEAD TFOOT TBODY - COLGROUP TR TH TD HEAD ] - methods += <<-BEGIN + nO_element_def(element) + <<-END - def #{element.downcase}(attributes = {}) - BEGIN - end - END - end - eval(methods) + # - O EMPTY + for element in %w[BASEFONT ISINDEX META] + methods << nOE_element_def(element) + end + + # O O or - O + for element in %w[] + methods << nO_element_def(element) end + eval(methods) end # Html4Tr module Html4Fr + extend TagMaker def doctype @@ -1866,26 +1836,17 @@ The hash keys are case sensitive. Ask th end - def element_init - methods = "" - # - - - for element in %w[ FRAMESET ] - methods += <<-BEGIN + nn_element_def(element) + <<-END - def #{element.downcase}(attributes = {}) - BEGIN - end - END - end + methods = "" - # - O EMPTY - for element in %w[ FRAME ] - methods += <<-BEGIN + nOE_element_def(element) + <<-END - def #{element.downcase}(attributes = {}) - BEGIN - end - END - end - eval(methods) + # - - + for element in %w[FRAMESET] + methods << nn_element_def(element) + end + + # - O EMPTY + for element in %w[ FRAME ] + methods << nOE_element_def(element) end + eval(methods) end # Html4Fr @@ -1907,22 +1868,19 @@ The hash keys are case sensitive. Ask th when "html3" extend Html3 - element_init() extend HtmlExtension when "html4" extend Html4 - element_init() extend HtmlExtension when "html4Tr" extend Html4Tr - element_init() extend HtmlExtension when "html4Fr" extend Html4Tr - element_init() extend Html4Fr - element_init() extend HtmlExtension end + @content = [] + @nest = 0 end -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦