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はできる。
中田 伸悦