------art_39197_11042111.1176726100043
Content-Type: multipart/alternative; 
	boundary---art_39198_28755430.1176726100043"

------art_39198_28755430.1176726100043
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

First time submitting a patch so forgive any missteps on my part. This is a
new feature proposal for ruby's CGI class. The basic idea is to support an
array value for 'class' in the attributes for the helper HTML generation
helper methods. My proposed change is more generic than simply supporting an
Array: if the value responds to the "join" method then it is invoked to
produce the final attribute value string.

So:

cgi  GI.new("html4")
cgi.td('class''first', 'second']) { "hey there" }

would be rendered as

<TD classirst second">hey there</TD>

My motivation is simple. I often want to build up the attributes in multiple
methods or classes which are then passed into the HTML helper method for
final rendering, and I like to use multiple CSS class values for different
aspects of the final page. It's handy to be able to manage the various CSS
classes as a list rather than one big string.

I couldn't find any existing test cases for cgi.rb so I started my own. They
cover (minimally) the before and after behaviour around this change but I'm
happy to flesh them out further based on feedback.

Regards
James Greenfield

----------------------

ChangeLog:
Mon Apr 16 21:01:02 2007  James Greenfield  < james.greenfield / gmail.com>

        * lib/cgi.rb: support for multiple CSS class values specified as an
array.

Patch with testcases:

Index: lib/cgi.rb
--- lib/cgi.rb  (revision 12182)
+++ lib/cgi.rb  (working copy)
@@ -1305,7 +1305,11 @@
             if true value
               ""
             else
-              ' + CGI::escapeHTML(value) + '"'
+              if name 'class'
+                ' + CGI::escapeHTML( value.respond_to?(:join) ?
value.join(' ') : value) + '"'
+              else
+                ' + CGI::escapeHTML(value) + '"'
+              end
             end
           }.join + ">"
       END
Index: test/cgi/test_cgi.rb
--- test/cgi/test_cgi.rb        (revision 0)
+++ test/cgi/test_cgi.rb        (revision 0)
@@ -0,0 +1,75 @@
+require 'test/unit'
+
+require 'cgi'
+
+module CGITestSupport
+  def d(data)
+    data
+  end
+end
+
+
+class TestCGI < Test::Unit::TestCase
+  include CGITestSupport
+
+  class << self
+    include CGITestSupport
+  end
+
+public
+
+  def setup
+  end
+
+  def teardown
+  end
+
+  #### CSV::Reader unit test
+
+  def test_without_attributes
+    ENV['REQUEST_METHOD']  POST'
+    ENV['CONTENT_LENGTH']  0'
+    cgi  GI.new('html4')
+
+    test_each_tag(cgi)
+  end
+
+  def test_css_class_as_string
+    ENV['REQUEST_METHOD']  POST'
+    ENV['CONTENT_LENGTH']  0'
+    cgi  GI.new('html4')
+
+    test_each_tag(cgi, 'class'stringvalue') { |fragment, elt|
assert_equal(fragment, "<#{elt} classstringvalue\">content</#{elt}>") }
+  end
+
+  def test_css_class_as_array
+    ENV['REQUEST_METHOD']  POST'
+    ENV['CONTENT_LENGTH']  0'
+    cgi  GI.new('html4')
+
+    test_each_tag(cgi, 'class''string1', 'string2']) { |fragment, elt|
assert_equal(fragment, "<#{elt} classstring1 string2\">content</#{elt}>")
}
+  end
+
+  private
+
+  def test_each_tag(cgi, attrs)
+    # This is not a complete list of elements, just the ones that
+    # behave in a "predictable" way (i.e. don't have default attributes).
+    # In an ideal world we'd test every possible tag.
+    tags  w[ TT I B BIG SMALL SUB SUP EM STRONG
+          DFN CODE SAMP KBD VAR CITE ADDRESS DIV MAP
+          PRE DL OL UL SELECT table TITLE
+          STYLE SCRIPT H1 H2 H3 H4 H5 H6 BLOCKQUOTE
+          CAPTION ] + %w[HEAD BODY P DT DD LI OPTION tr th td]
+    tags.each do |tag|
+      elt  ag.upcase
+      if (attrs.empty?)
+        fragment  gi.send(tag.downcase) { "content" }
+        assert_equal(fragment, "<#{elt}>content</#{elt}>")
+      else
+        fragment  gi.send(tag.downcase, attrs) { "content" }
+        yield(fragment, elt)
+      end
+    end
+  end
+end

------art_39198_28755430.1176726100043
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

<span classmail_quote"></span><span classmail_quote"></span>First time submitting a patch so forgive any missteps on my part. This is a new feature proposal for ruby&#39;s CGI class. The basic idea is to support an array value for &#39;class&#39; in the attributes for the helper HTML generation helper methods. My proposed change is more generic than simply supporting an Array: if the value responds to the &quot;join&quot; method then it is invoked to produce the final attribute value string.
<br><div><span class「 ゜アアアオエキキクウウ゜ー「セシセモコシセシセ  ヌノョィヲサエヲサゥシセョィヲ」ウケサヲ」ウケササロヲ」ウケサヲ」ウケサャ ヲ」ウケサヲ」ウケサンゥ  ヲサ ヲサ シセシセ   シセ
シセヲサヤト サ ヲサヲサ ヲサッヤトヲサ
シセシセヘ   ョ ノ                   ネヤヘフ     ャ  ノ     テモモ         ョ ノヲ」ウケサ         テモモ         ョ
シセシセノ ヲ」ウケサ       ョ  ノ   ョ ヤ  ィゥ          ノヲ」ウケサ         ョシセ


シセメシセハ ヌシセシセュュュュュュュュュュュュュュュュュュュュュュシセシセテフコシセヘ チ アカ イアコーアコーイ イーーキヲサ ハ ヌヲサ ヲサシ コョタョ「 「  ョョマナフィャャゥ「セ

ョタョシッセヲサシセシセヲサヲサヲサヲサヲサヲサヲサ ェ ッョコ    テモモ      ョ
シセシセミ  コシセシセノコ ッョシセセュュュ ッョヲサ ィ アイアクイゥシセォォォ ッョヲサ ィ ゥシセタタ ュアウーオャキ ォアウーオャアア タタ
シセヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサ   シセヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサ ヲサヲサシセヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサ シセュヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサ ヲ」ウケササヲ」ウケサ ォ テヌノココネヤヘフィゥ ォ ヲ」ウケサヲサヲ」ウケサシセォヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサ   ヲ」ウケサヲ」ウケサシセォヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサ ヲ」ウケササヲ」ウケサ ォ テヌノココネヤヘフィ
ョ゜ソィコゥ ソ ョィヲ」ウケサ ヲ」ウケサゥ コ ゥ ォ ヲ」ウケサヲサヲ」ウケサシセォヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサ シセォヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサ ヲ」ウケササヲ」ウケサ ォ テヌノココネヤヘフィゥ ォ ヲ」ウケサヲサヲ」ウケサシセォヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサ シセヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサ 
シセヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサ ョ ォ ヲサヲサヲサシセヲサヲサヲサヲサヲサヲサ ナホトシセノコ ッッ゜ョシセセュュュ ッッ゜ョヲサヲサヲサヲサヲサヲサヲサ ィ ーゥシセォォォ ッッ゜ョヲサヲサヲサヲサヲサヲサヲサ ィ ーゥ
シセタタ ューャー ォアャキオ タタシセォ ヲ」ウケサッヲ」ウケサシセォシセォ ヲ」ウケサヲ」ウケサシセォシセォ テヌノヤモシセォヲサ  ィゥシセォヲサヲサヲサ シセォヲサ シセォシセォシセォシセォ ヤテヌノ ヲサ ヤココユココヤテシセ


ォヲサ  テヌノヤモシセォシセォヲサ  ヲサヲサ シセォヲサヲサヲサ  テヌノヤモシセォヲサ シセォシセォシセォシセォヲサ  シセォヲサ シセォシセォヲサ  シセォヲサ シセォシセォヲサ 」」」」 テモヨココメ  シセ

ォ
シセォヲサ  ゜゜シセォヲサヲサヲサ ナホヨロヲ」ウケサメナムユナモヤ゜ヘナヤネマトヲ」ウケサン  」ウケサミマモヤヲ」ウケサシセォヲサヲサヲサ ナホヨロヲ」ウケサテマホヤナホヤ゜フナホヌヤネヲ」ウケサン  」ウケサーヲ」ウケサシセォヲサヲサヲサ   ヌノョィヲ」ウケサエヲ」ウケサゥシセォシセォヲサヲサヲサ ゜゜ィゥシセォヲサ 
シセォシセォヲサ  ゜゜゜゜シセォヲサヲサヲサ ナホヨロヲ」ウケサメナムユナモヤ゜ヘナヤネマトヲ」ウケサン  」ウケサミマモヤヲ」ウケサシセォヲサヲサヲサ ナホヨロヲ」ウケサテマホヤナホヤ゜フナホヌヤネヲ」ウケサン  」ウケサーヲ」ウケサシセォヲサヲサヲサ   ヌノョィヲ」ウケサエヲ」ウケサゥシセォシセォヲサヲサヲサ ゜゜ィャ ヲ」ウケサヲ」ウケササヲ」ウケサヲ」ウケサゥ  ャ  ゜ィャ ヲサヲサ」 サワヲサヲサヲサッ」ヲサヲサゥ 
シセォヲサ シセォシセォヲサ  ゜゜゜゜シセォヲサヲサヲサ ナホヨロヲ」ウケサメナムユナモヤ゜ヘナヤネマトヲ」ウケサン  」ウケサミマモヤヲ」ウケサシセォヲサヲサヲサ ナホヨロヲ」ウケサテマホヤナホヤ゜フナホヌヤネヲ」ウケサン  」ウケサーヲ」ウケサシセォヲサヲサヲサ   ヌノョィヲ」ウケサエヲ」ウケサゥシセォシセォヲサヲサヲサ ゜゜ィャ ヲ」ウケサヲ」ウケササロヲ」ウケサアヲ」ウケサャ ヲ」ウケサイヲ」ウケサンゥ  ャ  ゜ィャ ヲサヲサ」 サア イワヲサヲサヲサッ」ヲサヲサゥ 
シセォヲサ シセォシセォヲサ シセォシセォヲサ  ゜゜ィャ ゥシセォヲサヲサヲサ 」 ヤ       ャ    シセォヲサヲサヲサ 」    ヲサヲサ  ィョョ ヲ」ウケサ   ゥョ
シセォヲサヲサヲサ 」 ノ    ヲ」ウケサ    ョシセォヲサヲサヲサ   ロ ヤヤ ノ ツ ツノヌ モヘチフフ モユツ モユミ ナヘ モヤメマホヌシセォヲサヲサヲサヲサヲサヲサヲサヲサヲサ トニホ テマトナ モチヘミ ヒツト ヨチメ テノヤナ チトトメナモモ トノヨ ヘチミシセォヲサヲサヲサヲサヲサヲサヲサヲサヲサ ミメナ トフ マフ ユフ モナフナテヤ  ヤノヤフナシセ


ォヲサヲサヲサヲサヲサヲサヲサヲサヲサ モヤルフナ モテメノミヤ ネア ネイ ネウ ネエ ネオ ネカ ツフマテヒムユマヤナシセォヲサヲサヲサヲサヲサヲサヲサヲサヲサ テチミヤノマホ ン ォ ・ロネナチト ツマトル ミ トヤ トト フノ マミヤノマホ   ンシセォヲサヲサヲサ ョ  シセォヲサヲサヲサヲサヲサ   ョシセォヲサヲサヲサヲサヲサ  ィョソゥシセォヲサヲサヲサヲサヲサヲサヲサ   ョィョゥ  ヲサヲサ シセォヲサヲサヲサヲサヲサヲサヲサ ゜ィャ ヲサヲサ」ヲサヲサッ」ヲサヲサゥシセォヲサヲサヲサヲサヲサ シセォヲサヲサヲサヲサヲサヲサヲサ   ョィョャ ゥ  ヲサヲサ 
シセォヲサヲサヲサヲサヲサヲサヲサ ィャ ゥシセォヲサヲサヲサヲサヲサ シセォヲサヲサヲサ シセォヲサ シセォシセシセシセシセシセシセ
シ 
「セ
シッセシッセシ 
「セ

ュュュュュュ゜ウケアケク゜イクキオオエウーョアアキカキイカアーーーエウュュ

ュュュュュュ゜ウケアケキ゜アアーエイアアアョアアキカキイカアーーーエウ
テュヤコ ッュサ ス゜゜゜゜゜ョサ 
	 咼痢リウョエュアケカエ
テュヤュナコ カエ
リュチュノコ ゜ー
テュトコ サ ス「゜゜゜゜゜ョ「

モラオレリカノヌルケレイノヒミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケ
ミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミムフモーヌフイホモオルヨイリホイエヘヤノ
マトノテヒツラノルイフハテモウウハラオノヌホネテツチノテーヘチアフトヒナヘトユヘヤナムナチヒ
ノテチノテチノテチノテチノヌノネメラユミヤーニラユヒノテチノテチノテチノテチノテチノノヒノテチノテチノテチ
ノテチノヌヨイユヒフモチノテチノテチノテチノテチハーハチノナホネモヤカレリホルリツモニメホヤテイルラアレモヒチ
ノヒヒチノテチノテチノテチノテチラルニレモチケミモチルイウヘテノテチノテチノテチノテチノテチハー
ハチノナホネモヤカレリホルリツモニメホヤテイルラアレモオレリホイオリウメミカケミツイルラアレモオイ
ヒテハマツイルラアレモヒチノヒヒチノテチノテチノテチノテチレラレムノテチノテチノテチノテチノテチ
ノテケノヒツトメーカマヨルイニレユユヤユニラユノテハノテノテチノテチノテチノテチノヌヨレチ
ノテチノテチノテチノテチレラオテチノテチノテチノテチモオイノテノエテチノテチノテツニヤムヒモラオレリカ
ノネメウムルイフウメウメルイフハテーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケ
ミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーケミヤーヒフモーノネメウムルイフウメウメルイフハ
テモレリレイチヒムヒヌヨテケレイヌヨニケレイノハヒネハラケノトチテツチノテー
フトチヒナホユムナチヒヒウハリヨユハウメウムラオテヒヒヨラレモチルイハテイメア
ヌユムーハヨヌヨニホアネツムヒヒチレヌヨノヌムレヌニールモヒヒチノテツルリメテノヌヨレチレラオテヒ
ヒルイウヘヨヌヨナホネモモチクノニメウムカマヨリムカマメウメトルリホテノヌルイアレヌユムーハヨヌヨ
ニホアネツムヒヒノテツヌニチクミテツレラテノテチラオネヨレモツトメーユレリホーユウヨヌケチ
ノテツムヒヒネヨヌテヒヒチレヌヨノネホネヨテノヌヨレチテノヌメレツーレラニレヌケウ
ノテツムヒヒノテチノヘノナホヤヨカユヨレヌヨノネヨリムヌヨチノテチヒヒチレヌヨノネメウメイー
ヌケアニケネメラハアヌヨテノテチメユオララモメヨニヨメヨホユリーアニヨナミメテノトーハアツミユアムテノテチ
メユオララトヤーオユメユオユリーニヤユモテノトーハチテノテチルイノトームーハフオネメトムヒム
テノテチヌヨニケルラホリウメレレイテノヌヨレチテノヌメレツーレリホーリイホアケヌニアケ
アケネハヒヒチノテツニヤレハアハニユヨヨニユアメヤユヨユモナケナハアーミモチユナケヤヨテヒヒチノテツニヤレハーホミ
ヤメニヤメヤナヨマメアメノハアーミモチヘテヒヒチノテツレイミモツトメーヨウヒテヌアホテテヒヒチノテツー
レリホーリイヨルイヌニヒヌホモハイホルリホハーォハウホーレウレネヨハツクレハレイアムノヌヨ
ネルリホレリハーリイヨラニヒヌレルラレラオーフテチミテホキレラーモツヌニアノホーレウレネヨリテノォ
ルイケヌヨトノウネメケミノノネーヒヒチレラオテヒヒチレヌヨノネメウメルウホリイホルリホリイニリイニ
ニオテノテチメユオララモメヨニヨメヨホユリーアニヨナミメテノトーハアツミユアムテノテチメユオララトヤーオユメユオユ
リーニヤユモテノトーハチテノテチルイノトームーハフオネメトムヒムテノテチヌヨニケ
ルラホリウメレレイノテヌニケミウメラオヘモノテネハハアーノネヌレルラレラオー
フテツネメクノヌニイヨニケリヨテニラヨテノイヨネールイウヘケリテハネハノネホー
レハノオイオーレラオーミテクイヨネーォノムノテツムヒヒノテツイルリメテヒヒチレヌヨ
ノネメウメレラニニケールラルイフテツネメアキモヒヒチノテチノニメリヘリヘケーノヌナルイケヌ
ヌユヌテツレツヌヨレラオーヨテツーヌユイオツーヌニーテノテチノツレラユラエ
ルモチネハレヌヌニヌユノネモチモオフツイエテツルリレノヌメレニアネムルリメーリメ
ノチノテチノテヘモラエルラエラメルライケヌムイユレテツーレリホーノヌヨイレリハオノネツウホルノネメレエヒ
ヒチノテツールラノトーハリノニメユノナムツテモユユーアツヤナユアヨテノニホヨユテツニヤモツヤヨニハミヤヒヒチノテチ
ノテチノテツナメエムーケナメモツヤムユアムノナテメテツラムヨノムーユメモツツメナメモメヨホヤノナメハヨツホムヨチヒヒチノテチノテチ
ノテツムユユメナヤーヨユユーヨヘメユホユノネメルノニメハヨナニテノテチノテチノテチユアメレヤナユユーホモモヨツユ
ノナノナノナノナーノナアノナイノナハヘヤーホフユヨヨミヨナユヒヒチノテチノテチノテツトムヨツユモユケマノニーヒチアノ
メユニナノナハミメニユテツナヨテツナメテツヘモモツミユニメハヤーエネノヌヌメテノテチヌニオルラホノヌメノネー
ルラクテノテチノテツネムミモツールラリツルリホテノテチノテツレチルリメーヘレラアネッヒムノテチ
ノテチノテツニラヨテチケノヌホモオレラオヒネメレオウルイニレモチルイケヌヨテノムノテチ
ノテチノテツウホメレリニアルラレハレイアムノテノクノウネメケミホメムクフホキレラーヤエヒム
ノテチノテチレラレムノテチノテチノテツニラヨテチケノヌホモオレラオヒネメレオウルイニレモルリメー
ヘノネノホメムノネーヒヒチノテチノテチラヌムレハレイアムノヌヨテヒヒチノテチノヌヨ
レチノテチノヌヨレチノテツムヒヒイヨレチュュュュュュ゜ウケアケキ゜アアーエイアアアョアアキカキイカアーーーエウュュ