spicycode-rcov 0.8.1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/rcov/xx.rb ADDED
@@ -0,0 +1,761 @@
1
+ # xx can be redistributed and used under the following conditions
2
+ # (just keep the following copyright notice, list of conditions and disclaimer
3
+ # in order to satisfy rcov's "Ruby license" and xx's license simultaneously).
4
+ #
5
+ #ePark Labs Public License version 1
6
+ #Copyright (c) 2005, ePark Labs, Inc. and contributors
7
+ #All rights reserved.
8
+ #
9
+ #Redistribution and use in source and binary forms, with or without modification,
10
+ #are permitted provided that the following conditions are met:
11
+ #
12
+ # 1. Redistributions of source code must retain the above copyright notice, this
13
+ # list of conditions and the following disclaimer.
14
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
15
+ # this list of conditions and the following disclaimer in the documentation
16
+ # and/or other materials provided with the distribution.
17
+ # 3. Neither the name of ePark Labs nor the names of its contributors may be
18
+ # used to endorse or promote products derived from this software without
19
+ # specific prior written permission.
20
+ #
21
+ #THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
22
+ #ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23
+ #WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24
+ #DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
25
+ #ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26
+ #(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27
+ #LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
28
+ #ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ #(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30
+ #SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+
32
+ unless defined? $__xx_rb__
33
+
34
+ require "rexml/document"
35
+
36
+
37
+ module XX
38
+ #--{{{
39
+ VERSION = "0.1.0"
40
+
41
+ %w(
42
+ CRAZY_LIKE_A_HELL
43
+ PERMISSIVE
44
+ STRICT
45
+ ANY
46
+ ).each{|c| const_set c, c}
47
+
48
+ class Document
49
+ #--{{{
50
+ attr "doc"
51
+ attr "stack"
52
+ attr "size"
53
+
54
+ def initialize *a, &b
55
+ #--{{{
56
+ @doc = ::REXML::Document::new(*a, &b)
57
+ @stack = [@doc]
58
+ @size = 0
59
+ #--}}}
60
+ end
61
+ def top
62
+ #--{{{
63
+ @stack.last
64
+ #--}}}
65
+ end
66
+ def push element
67
+ #--{{{
68
+ @stack.push element
69
+ #--}}}
70
+ end
71
+ def pop
72
+ #--{{{
73
+ @stack.pop unless @stack.size == 1
74
+ #--}}}
75
+ end
76
+ def tracking_additions
77
+ #--{{{
78
+ n = @size
79
+ yield
80
+ return @size - n
81
+ #--}}}
82
+ end
83
+ def to_str port = ""
84
+ #--{{{
85
+ @doc.write port, indent=-1, transitive=false, ie_hack=true
86
+ port
87
+ #--}}}
88
+ end
89
+ alias_method "to_s", "to_str"
90
+ def pretty port = ''
91
+ #--{{{
92
+ @doc.write port, indent=2, transitive=false, ie_hack=true
93
+ port
94
+ #--}}}
95
+ end
96
+ def create element
97
+ #--{{{
98
+ push element
99
+ begin
100
+ object = nil
101
+ additions =
102
+ tracking_additions do
103
+ object = yield element if block_given?
104
+ end
105
+ if object and additions.zero?
106
+ self << object
107
+ end
108
+ ensure
109
+ pop
110
+ end
111
+ self << element
112
+ element
113
+ #--}}}
114
+ end
115
+ def << object
116
+ #--{{{
117
+ t, x = top, object
118
+
119
+ if x
120
+ case t
121
+ when ::REXML::Document
122
+
123
+ begin
124
+ t <<
125
+ case x
126
+ when ::REXML::Document
127
+ x.root || ::REXML::Text::new(x.to_s)
128
+ when ::REXML::Element
129
+ x
130
+ when ::REXML::CData
131
+ x
132
+ when ::REXML::Text
133
+ x
134
+ else # string
135
+ ::REXML::Text::new(x.to_s)
136
+ end
137
+ rescue
138
+ if t.respond_to? "root"
139
+ t = t.root
140
+ retry
141
+ else
142
+ raise
143
+ end
144
+ end
145
+
146
+ when ::REXML::Element
147
+ t <<
148
+ case x
149
+ when ::REXML::Document
150
+ x.root || ::REXML::Text::new(x.to_s)
151
+ when ::REXML::Element
152
+ x
153
+ when ::REXML::CData
154
+ #::REXML::Text::new(x.write(""))
155
+ x
156
+ when ::REXML::Text
157
+ x
158
+ else # string
159
+ ::REXML::Text::new(x.to_s)
160
+ end
161
+
162
+ when ::REXML::Text
163
+ t <<
164
+ case x
165
+ when ::REXML::Document
166
+ x.write ""
167
+ when ::REXML::Element
168
+ x.write ""
169
+ when ::REXML::CData
170
+ x.write ""
171
+ when ::REXML::Text
172
+ x.write ""
173
+ else # string
174
+ x.to_s
175
+ end
176
+
177
+ else # other - try anyhow
178
+ t <<
179
+ case x
180
+ when ::REXML::Document
181
+ x.write ""
182
+ when ::REXML::Element
183
+ x.write ""
184
+ when ::REXML::CData
185
+ x.write ""
186
+ when ::REXML::Text
187
+ x.write ""
188
+ else # string
189
+ x.to_s
190
+ end
191
+ end
192
+ end
193
+
194
+ @size += 1
195
+ self
196
+ #--}}}
197
+ end
198
+ #--}}}
199
+ end
200
+
201
+ module Markup
202
+ #--{{{
203
+ class Error < ::StandardError; end
204
+
205
+ module InstanceMethods
206
+ #--{{{
207
+ def method_missing m, *a, &b
208
+ #--{{{
209
+ m = m.to_s
210
+
211
+ tag_method, tag_name = xx_class::xx_tag_method_name m
212
+
213
+ c_method_missing = xx_class::xx_config_for "method_missing", xx_which
214
+ c_tags = xx_class::xx_config_for "tags", xx_which
215
+
216
+ pat =
217
+ case c_method_missing
218
+ when ::XX::CRAZY_LIKE_A_HELL
219
+ %r/.*/
220
+ when ::XX::PERMISSIVE
221
+ %r/_$/o
222
+ when ::XX::STRICT
223
+ %r/_$/o
224
+ else
225
+ super(m.to_sym, *a, &b)
226
+ end
227
+
228
+ super(m.to_sym, *a, &b) unless m =~ pat
229
+
230
+ if c_method_missing == ::XX::STRICT
231
+ super(m.to_sym, *a, &b) unless c_tags.include? tag_name
232
+ end
233
+
234
+ ret, defined = nil
235
+
236
+ begin
237
+ xx_class::xx_define_tmp_method tag_method
238
+ xx_class::xx_define_tag_method tag_method, tag_name
239
+ ret = send tag_method, *a, &b
240
+ defined = true
241
+ ensure
242
+ xx_class::xx_remove_tag_method tag_method unless defined
243
+ end
244
+
245
+ ret
246
+ #--}}}
247
+ end
248
+ def xx_tag_ tag_name, *a, &b
249
+ #--{{{
250
+ tag_method, tag_name = xx_class::xx_tag_method_name tag_name
251
+
252
+ ret, defined = nil
253
+
254
+ begin
255
+ xx_class::xx_define_tmp_method tag_method
256
+ xx_class::xx_define_tag_method tag_method, tag_name
257
+ ret = send tag_method, *a, &b
258
+ defined = true
259
+ ensure
260
+ xx_class::xx_remove_tag_method tag_method unless defined
261
+ end
262
+
263
+ ret
264
+ #--}}}
265
+ end
266
+ alias_method "g_", "xx_tag_"
267
+ def xx_which *argv
268
+ #--{{{
269
+ @xx_which = nil unless defined? @xx_which
270
+ if argv.empty?
271
+ @xx_which
272
+ else
273
+ xx_which = @xx_which
274
+ begin
275
+ @xx_which = argv.shift
276
+ return yield
277
+ ensure
278
+ @xx_which = xx_which
279
+ end
280
+ end
281
+ #--}}}
282
+ end
283
+ def xx_with_doc_in_effect *a, &b
284
+ #--{{{
285
+ @xx_docs ||= []
286
+ doc = ::XX::Document::new(*a)
287
+ ddoc = doc.doc
288
+ begin
289
+ @xx_docs.push doc
290
+ b.call doc if b
291
+
292
+ doctype = xx_config_for "doctype", xx_which
293
+ if doctype
294
+ unless ddoc.doctype
295
+ doctype = ::REXML::DocType::new doctype unless
296
+ ::REXML::DocType === doctype
297
+ ddoc << doctype
298
+ end
299
+ end
300
+
301
+ xmldecl = xx_config_for "xmldecl", xx_which
302
+ if xmldecl
303
+ if ddoc.xml_decl == ::REXML::XMLDecl::default
304
+ xmldecl = ::REXML::XMLDecl::new xmldecl unless
305
+ ::REXML::XMLDecl === xmldecl
306
+ ddoc << xmldecl
307
+ end
308
+ end
309
+
310
+ return doc
311
+ ensure
312
+ @xx_docs.pop
313
+ end
314
+ #--}}}
315
+ end
316
+ def xx_doc
317
+ #--{{{
318
+ @xx_docs.last rescue raise "no xx_doc in effect!"
319
+ #--}}}
320
+ end
321
+ def xx_text_ *objects, &b
322
+ #--{{{
323
+ doc = xx_doc
324
+
325
+ text =
326
+ ::REXML::Text::new("",
327
+ respect_whitespace=true, parent=nil
328
+ )
329
+
330
+ objects.each do |object|
331
+ text << object.to_s if object
332
+ end
333
+
334
+ doc.create text, &b
335
+ #--}}}
336
+ end
337
+ alias_method "text_", "xx_text_"
338
+ alias_method "t_", "xx_text_"
339
+ def xx_markup_ *objects, &b
340
+ #--{{{
341
+ doc = xx_doc
342
+
343
+ doc2 = ::REXML::Document::new ""
344
+
345
+ objects.each do |object|
346
+ (doc2.root ? doc2.root : doc2) << ::REXML::Document::new(object.to_s)
347
+ end
348
+
349
+
350
+ ret = doc.create doc2, &b
351
+ puts doc2.to_s
352
+ STDIN.gets
353
+ ret
354
+ #--}}}
355
+ end
356
+ alias_method "x_", "xx_markup_"
357
+ def xx_any_ *objects, &b
358
+ #--{{{
359
+ doc = xx_doc
360
+ nothing = %r/.^/m
361
+
362
+ text =
363
+ ::REXML::Text::new("",
364
+ respect_whitespace=true, parent=nil, raw=true, entity_filter=nil, illegal=nothing
365
+ )
366
+
367
+ objects.each do |object|
368
+ text << object.to_s if object
369
+ end
370
+
371
+ doc.create text, &b
372
+ #--}}}
373
+ end
374
+ alias_method "h_", "xx_any_"
375
+ remove_method "x_" if instance_methods.include? "x_"
376
+ alias_method "x_", "xx_any_" # supplant for now
377
+ def xx_cdata_ *objects, &b
378
+ #--{{{
379
+ doc = xx_doc
380
+
381
+ cdata = ::REXML::CData::new ""
382
+
383
+ objects.each do |object|
384
+ cdata << object.to_s if object
385
+ end
386
+
387
+ doc.create cdata, &b
388
+ #--}}}
389
+ end
390
+ alias_method "c_", "xx_cdata_"
391
+ def xx_parse_attributes string
392
+ #--{{{
393
+ string = string.to_s
394
+ tokens = string.split %r/,/o
395
+ tokens.map{|t| t.sub!(%r/[^=]+=/){|key_eq| key_eq.chop << " : "}}
396
+ xx_parse_yaml_attributes(tokens.join(','))
397
+ #--}}}
398
+ end
399
+ alias_method "att_", "xx_parse_attributes"
400
+ def xx_parse_yaml_attributes string
401
+ #--{{{
402
+ require "yaml"
403
+ string = string.to_s
404
+ string = "{" << string unless string =~ %r/^\s*[{]/o
405
+ string = string << "}" unless string =~ %r/[}]\s*$/o
406
+ obj = ::YAML::load string
407
+ raise ArgumentError, "<#{ obj.class }> not Hash!" unless Hash === obj
408
+ obj
409
+ #--}}}
410
+ end
411
+ alias_method "at_", "xx_parse_yaml_attributes"
412
+ alias_method "yat_", "xx_parse_yaml_attributes"
413
+ def xx_class
414
+ #--{{{
415
+ @xx_class ||= self.class
416
+ #--}}}
417
+ end
418
+ def xx_tag_method_name *a, &b
419
+ #--{{{
420
+ xx_class.xx_tag_method_name(*a, &b)
421
+ #--}}}
422
+ end
423
+ def xx_define_tmp_method *a, &b
424
+ #--{{{
425
+ xx_class.xx_define_tmp_methodr(*a, &b)
426
+ #--}}}
427
+ end
428
+ def xx_define_tag_method *a, &b
429
+ #--{{{
430
+ xx_class.xx_define_tag_method(*a, &b)
431
+ #--}}}
432
+ end
433
+ def xx_remove_tag_method *a, &b
434
+ #--{{{
435
+ xx_class.xx_tag_remove_method(*a, &b)
436
+ #--}}}
437
+ end
438
+ def xx_ancestors
439
+ #--{{{
440
+ raise Error, "no xx_which in effect" unless xx_which
441
+ xx_class.xx_ancestors xx_which
442
+ #--}}}
443
+ end
444
+ def xx_config
445
+ #--{{{
446
+ xx_class.xx_config
447
+ #--}}}
448
+ end
449
+ def xx_config_for *a, &b
450
+ #--{{{
451
+ xx_class.xx_config_for(*a, &b)
452
+ #--}}}
453
+ end
454
+ def xx_configure *a, &b
455
+ #--{{{
456
+ xx_class.xx_configure(*a, &b)
457
+ #--}}}
458
+ end
459
+ #--}}}
460
+ end
461
+
462
+ module ClassMethods
463
+ #--{{{
464
+ def xx_tag_method_name m
465
+ #--{{{
466
+ m = m.to_s
467
+ tag_method, tag_name = m, m.gsub(%r/_+$/, "")
468
+ [ tag_method, tag_name ]
469
+ #--}}}
470
+ end
471
+ def xx_define_tmp_method m
472
+ #--{{{
473
+ define_method(m){ raise NotImplementedError, m.to_s }
474
+ #--}}}
475
+ end
476
+ def xx_define_tag_method tag_method, tag_name = nil
477
+ #--{{{
478
+ tag_method = tag_method.to_s
479
+ tag_name ||= tag_method.gsub %r/_+$/, ""
480
+
481
+ remove_method tag_method if instance_methods.include? tag_method
482
+ module_eval <<-code, __FILE__, __LINE__+1
483
+ def #{ tag_method } *a, &b
484
+ hashes, nothashes = a.partition{|x| Hash === x}
485
+
486
+ doc = xx_doc
487
+ element = ::REXML::Element::new '#{ tag_name }'
488
+
489
+ hashes.each{|h| h.each{|k,v| element.add_attribute k.to_s, v}}
490
+ nothashes.each{|nh| element << ::REXML::Text::new(nh.to_s)}
491
+
492
+ doc.create element, &b
493
+ end
494
+ code
495
+ tag_method
496
+ #--}}}
497
+ end
498
+ def xx_remove_tag_method tag_method
499
+ #--{{{
500
+ remove_method tag_method rescue nil
501
+ #--}}}
502
+ end
503
+ def xx_ancestors xx_which = self
504
+ #--{{{
505
+ list = []
506
+ ancestors.each do |a|
507
+ list << a if a < xx_which
508
+ end
509
+ xx_which.ancestors.each do |a|
510
+ list << a if a <= Markup
511
+ end
512
+ list
513
+ #--}}}
514
+ end
515
+ def xx_config
516
+ #--{{{
517
+ @@xx_config ||= Hash::new{|h,k| h[k] = {}}
518
+ #--}}}
519
+ end
520
+ def xx_config_for key, xx_which = nil
521
+ #--{{{
522
+ key = key.to_s
523
+ xx_which ||= self
524
+ xx_ancestors(xx_which).each do |a|
525
+ if xx_config[a].has_key? key
526
+ return xx_config[a][key]
527
+ end
528
+ end
529
+ nil
530
+ #--}}}
531
+ end
532
+ def xx_configure key, value, xx_which = nil
533
+ #--{{{
534
+ key = key.to_s
535
+ xx_which ||= self
536
+ xx_config[xx_which][key] = value
537
+ #--}}}
538
+ end
539
+ #--}}}
540
+ end
541
+
542
+ extend ClassMethods
543
+ include InstanceMethods
544
+
545
+ def self::included other, *a, &b
546
+ #--{{{
547
+ ret = super
548
+ other.module_eval do
549
+ include Markup::InstanceMethods
550
+ extend Markup::ClassMethods
551
+ class << self
552
+ define_method("included", Markup::XX_MARKUP_RECURSIVE_INCLUSION_PROC)
553
+ end
554
+ end
555
+ ret
556
+ #--}}}
557
+ end
558
+ XX_MARKUP_RECURSIVE_INCLUSION_PROC = method("included").to_proc
559
+
560
+ xx_configure "method_missing", XX::PERMISSIVE
561
+ xx_configure "tags", []
562
+ xx_configure "doctype", nil
563
+ xx_configure "xmldecl", nil
564
+ #--}}}
565
+ end
566
+
567
+ module XHTML
568
+ #--{{{
569
+ include Markup
570
+ xx_configure "doctype", %(html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd")
571
+
572
+ def xhtml_ which = XHTML, *a, &b
573
+ #--{{{
574
+ xx_which(which) do
575
+ doc = xx_with_doc_in_effect(*a, &b)
576
+ ddoc = doc.doc
577
+ root = ddoc.root
578
+ if root and root.name and root.name =~ %r/^html$/i
579
+ if root.attribute("lang",nil).nil? or root.attribute("lang",nil).to_s.empty?
580
+ root.add_attribute "lang", "en"
581
+ end
582
+ if root.attribute("xml:lang").nil? or root.attribute("xml:lang").to_s.empty?
583
+ root.add_attribute "xml:lang", "en"
584
+ end
585
+ if root.namespace.nil? or root.namespace.to_s.empty?
586
+ root.add_namespace "http://www.w3.org/1999/xhtml"
587
+ end
588
+ end
589
+ doc
590
+ end
591
+ #--}}}
592
+ end
593
+
594
+ module Strict
595
+ #--{{{
596
+ include XHTML
597
+ xx_configure "doctype", %(html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd")
598
+ xx_configure "tags", %w(
599
+ html head body div span DOCTYPE title link meta style p
600
+ h1 h2 h3 h4 h5 h6 strong em abbr acronym address bdo blockquote cite q code
601
+ ins del dfn kbd pre samp var br a base img
602
+ area map object param ul ol li dl dt dd table
603
+ tr td th tbody thead tfoot col colgroup caption form input
604
+ textarea select option optgroup button label fieldset legend script noscript b
605
+ i tt sub sup big small hr
606
+ )
607
+ xx_configure "method_missing", ::XX::STRICT
608
+
609
+ def xhtml_ which = XHTML::Strict, *a, &b
610
+ #--{{{
611
+ super(which, *a, &b)
612
+ #--}}}
613
+ end
614
+ #--}}}
615
+ end
616
+
617
+ module Transitional
618
+ #--{{{
619
+ include XHTML
620
+ xx_configure "doctype", %(html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd")
621
+ def xhtml_ which = XHTML::Transitional, *a, &b
622
+ #--{{{
623
+ super(which, *a, &b)
624
+ #--}}}
625
+ end
626
+ #--}}}
627
+ end
628
+ #--}}}
629
+ end
630
+
631
+ module HTML4
632
+ #--{{{
633
+ include Markup
634
+ xx_configure "doctype", %(html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN")
635
+
636
+ def html4_ which = HTML4, *a, &b
637
+ #--{{{
638
+ xx_which(which){ xx_with_doc_in_effect(*a, &b) }
639
+ #--}}}
640
+ end
641
+
642
+ module Strict
643
+ #--{{{
644
+ include HTML4
645
+ xx_configure "doctype", %(html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN")
646
+ xx_configure "tags", %w(
647
+ html head body div span DOCTYPE title link meta style p
648
+ h1 h2 h3 h4 h5 h6 strong em abbr acronym address bdo blockquote cite q code
649
+ ins del dfn kbd pre samp var br a base img
650
+ area map object param ul ol li dl dt dd table
651
+ tr td th tbody thead tfoot col colgroup caption form input
652
+ textarea select option optgroup button label fieldset legend script noscript b
653
+ i tt sub sup big small hr
654
+ )
655
+ xx_configure "method_missing", ::XX::STRICT
656
+ def html4_ which = HTML4::Strict, *a, &b
657
+ #--{{{
658
+ super(which, *a, &b)
659
+ #--}}}
660
+ end
661
+ #--}}}
662
+ end
663
+
664
+ module Transitional
665
+ #--{{{
666
+ include HTML4
667
+ xx_configure "doctype", %(html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN")
668
+ def html4_ which = HTML4::Transitional, *a, &b
669
+ #--{{{
670
+ super(which, *a, &b)
671
+ #--}}}
672
+ end
673
+ #--}}}
674
+ end
675
+ #--}}}
676
+ end
677
+ HTML = HTML4
678
+
679
+ module XML
680
+ #--{{{
681
+ include Markup
682
+ xx_configure "xmldecl", ::REXML::XMLDecl::new
683
+
684
+ def xml_ *a, &b
685
+ #--{{{
686
+ xx_which(XML){ xx_with_doc_in_effect(*a, &b)}
687
+ #--}}}
688
+ end
689
+ #--}}}
690
+ end
691
+ #--}}}
692
+ end
693
+
694
+ $__xx_rb__ = __FILE__
695
+ end
696
+
697
+
698
+
699
+
700
+
701
+
702
+
703
+
704
+
705
+
706
+ #
707
+ # simple examples - see samples/ dir for more complete examples
708
+ #
709
+
710
+ if __FILE__ == $0
711
+
712
+ class Table < ::Array
713
+ include XX::XHTML::Strict
714
+ include XX::HTML4::Strict
715
+ include XX::XML
716
+
717
+ def doc
718
+ html_{
719
+ head_{ title_{ "xhtml/html4/xml demo" } }
720
+
721
+ div_{
722
+ h_{ "< malformed html & un-escaped symbols" }
723
+ }
724
+
725
+ t_{ "escaped & text > <" }
726
+
727
+ x_{ "<any_valid> xml </any_valid>" }
728
+
729
+ div_(:style => :sweet){
730
+ em_ "this is a table"
731
+
732
+ table_(:width => 42, :height => 42){
733
+ each{|row| tr_{ row.each{|cell| td_ cell } } }
734
+ }
735
+ }
736
+
737
+ script_(:type => :dangerous){ cdata_{ "javascript" } }
738
+ }
739
+ end
740
+ def to_xhtml
741
+ xhtml_{ doc }
742
+ end
743
+ def to_html4
744
+ html4_{ doc }
745
+ end
746
+ def to_xml
747
+ xml_{ doc }
748
+ end
749
+ end
750
+
751
+ table = Table[ %w( 0 1 2 ), %w( a b c ) ]
752
+
753
+ methods = %w( to_xhtml to_html4 to_xml )
754
+
755
+ methods.each do |method|
756
+ 2.times{ puts "-" * 42 }
757
+ puts(table.send(method).pretty)
758
+ puts
759
+ end
760
+
761
+ end