html-table 1.2.2
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/CHANGES +72 -0
- data/MANIFEST +41 -0
- data/README +137 -0
- data/doc/attributes.rdoc +143 -0
- data/doc/table.rdoc +157 -0
- data/doc/table_body.rdoc +9 -0
- data/doc/table_caption.rdoc +9 -0
- data/doc/table_colgroup.rdoc +8 -0
- data/doc/table_colgroup_col.rdoc +9 -0
- data/doc/table_foot.rdoc +8 -0
- data/doc/table_head.rdoc +11 -0
- data/doc/table_row.rdoc +105 -0
- data/doc/table_row_data.rdoc +92 -0
- data/doc/table_row_header.rdoc +7 -0
- data/lib/html/attribute_handler.rb +308 -0
- data/lib/html/body.rb +34 -0
- data/lib/html/caption.rb +40 -0
- data/lib/html/col.rb +33 -0
- data/lib/html/colgroup.rb +99 -0
- data/lib/html/data.rb +56 -0
- data/lib/html/foot.rb +43 -0
- data/lib/html/head.rb +42 -0
- data/lib/html/header.rb +56 -0
- data/lib/html/html_handler.rb +94 -0
- data/lib/html/row.rb +129 -0
- data/lib/html/table.rb +227 -0
- data/lib/html/tablesection.rb +42 -0
- data/lib/html/tag_handler.rb +64 -0
- data/test/tc_attribute_handler.rb +259 -0
- data/test/tc_body.rb +97 -0
- data/test/tc_caption.rb +90 -0
- data/test/tc_col.rb +50 -0
- data/test/tc_colgroup.rb +99 -0
- data/test/tc_data.rb +87 -0
- data/test/tc_foot.rb +118 -0
- data/test/tc_head.rb +114 -0
- data/test/tc_header.rb +87 -0
- data/test/tc_html_handler.rb +47 -0
- data/test/tc_row.rb +138 -0
- data/test/tc_table.rb +163 -0
- data/test/tc_tablesection.rb +52 -0
- data/test/ts_all.rb +23 -0
- metadata +96 -0
data/lib/html/body.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
module HTML
|
2
|
+
|
3
|
+
# This class represents an HTML table body (<tbody>). It is a
|
4
|
+
# subclass of Table::TableSection.
|
5
|
+
class Table::Body < Table::TableSection
|
6
|
+
@indent_level = 3
|
7
|
+
@end_tags = true
|
8
|
+
|
9
|
+
# Returns a new Table::Body object. Optionally takes a block. If
|
10
|
+
# an argument is provided, it is treated as content.
|
11
|
+
def initialize(arg=nil)
|
12
|
+
@html_begin = "<tbody"
|
13
|
+
@html_end = "</tbody>"
|
14
|
+
yield self if block_given?
|
15
|
+
self.content = arg if arg
|
16
|
+
end
|
17
|
+
|
18
|
+
# Returns a boolean indicating whether or not end tags, </tbody>, are
|
19
|
+
# included for each Body object in the final HTML output. The
|
20
|
+
# default is true.
|
21
|
+
def self.end_tags?
|
22
|
+
@end_tags
|
23
|
+
end
|
24
|
+
|
25
|
+
# Sets whether or not end tags are included for each Body object in
|
26
|
+
# the final HTML output. The default is true. Only true or false are
|
27
|
+
# valid arguments.
|
28
|
+
def self.end_tags=(bool)
|
29
|
+
expect(bool,[TrueClass,FalseClass])
|
30
|
+
@end_tags = bool
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
data/lib/html/caption.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
module HTML
|
2
|
+
|
3
|
+
# This class represents an HTML Caption. Despite the name, it is not
|
4
|
+
# a subclass of Table. Note that end tags for this class are mandatory.
|
5
|
+
class Table::Caption
|
6
|
+
include AttributeHandler
|
7
|
+
include HtmlHandler
|
8
|
+
undef_method :configure
|
9
|
+
@indent_level = 3
|
10
|
+
|
11
|
+
# Returns a new Table::Caption object. Optionally takes a block. If
|
12
|
+
# an argument is provided it is treated as content.
|
13
|
+
def initialize(arg=nil)
|
14
|
+
@html_begin = '<caption'
|
15
|
+
@html_body = ''
|
16
|
+
@html_end = '</caption>'
|
17
|
+
yield self if block_given?
|
18
|
+
self.content = arg if arg
|
19
|
+
end
|
20
|
+
|
21
|
+
# Adds content to the Table::Caption object.
|
22
|
+
def content=(arg)
|
23
|
+
@html_body = arg.to_s
|
24
|
+
end
|
25
|
+
|
26
|
+
# Returns the number of spaces that tags for this class are indented.
|
27
|
+
# For the Table::Caption class, the indention level defaults to 3.
|
28
|
+
def self.indent_level
|
29
|
+
@indent_level
|
30
|
+
end
|
31
|
+
|
32
|
+
# Sets the number of spaces that tags for this class are indented.
|
33
|
+
def self.indent_level=(num)
|
34
|
+
expect(num,Integer)
|
35
|
+
raise ArgumentError, "indent level must be >= 0" if num < 0
|
36
|
+
@indent_level = num
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
data/lib/html/col.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
module HTML
|
2
|
+
# This class represents an HTML ColGroup column (<col>). Despite the
|
3
|
+
# name, it is not a subclass of ColGroup or Table.
|
4
|
+
class Table::ColGroup::Col
|
5
|
+
include AttributeHandler
|
6
|
+
include HtmlHandler
|
7
|
+
undef_method :configure, :content
|
8
|
+
@indent_level = 6
|
9
|
+
|
10
|
+
# Creates and returns a new ColGroup object. Optionally takes a block.
|
11
|
+
# Note that it does not accept an argument - col tags do not have content
|
12
|
+
def initialize
|
13
|
+
@html_begin = '<col'
|
14
|
+
@html_body = ''
|
15
|
+
@html_end = ''
|
16
|
+
yield self if block_given?
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns the indentation level for the tags of this class. The
|
20
|
+
# default is 6.
|
21
|
+
def self.indent_level
|
22
|
+
@indent_level
|
23
|
+
end
|
24
|
+
|
25
|
+
# Sets the indentation level for the tags of this class. The default
|
26
|
+
# is 6.
|
27
|
+
def self.indent_level=(num)
|
28
|
+
expect(num,Integer)
|
29
|
+
raise ArgumentError, "num must be >= 0" if num < 0
|
30
|
+
@indent_level = num
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module HTML
|
2
|
+
# This class represents an HTML column group (<colgroup>). It is a
|
3
|
+
# subclass of Array. The only elements it may contain are instances
|
4
|
+
# of the ColGroup::Col class.
|
5
|
+
class Table::ColGroup < Array
|
6
|
+
include AttributeHandler
|
7
|
+
include HtmlHandler
|
8
|
+
@indent_level = 3
|
9
|
+
@end_tags = true
|
10
|
+
|
11
|
+
undef_method :content
|
12
|
+
|
13
|
+
# Returns a new ColGroup object. Optionally takes a block. If an
|
14
|
+
# argument is provided, it is treated as content.
|
15
|
+
def initialize(arg = nil)
|
16
|
+
@html_begin = '<colgroup'
|
17
|
+
@html_body = ''
|
18
|
+
@html_end = '</colgroup>'
|
19
|
+
yield self if block_given?
|
20
|
+
self.push(arg) if arg
|
21
|
+
end
|
22
|
+
|
23
|
+
# Returns the indentation level for the tags of this class. The
|
24
|
+
# default is 3.
|
25
|
+
def self.indent_level
|
26
|
+
@indent_level
|
27
|
+
end
|
28
|
+
|
29
|
+
# Sets the indentation level for the tags of this class. The default
|
30
|
+
# is 3.
|
31
|
+
def self.indent_level=(num)
|
32
|
+
expect(num,Integer)
|
33
|
+
raise ArgumentError,"indent_level must be >= 0" if num < 0
|
34
|
+
@indent_level = num
|
35
|
+
end
|
36
|
+
|
37
|
+
# This method has been redefined to only allow ColGroup::Col objects
|
38
|
+
# to be assigned.
|
39
|
+
def []=(index,obj)
|
40
|
+
if obj.kind_of?(Array)
|
41
|
+
expect(obj.first,Col) # In case of 0 length Array
|
42
|
+
obj.each{ |o|
|
43
|
+
expect(o,Col)
|
44
|
+
}
|
45
|
+
else
|
46
|
+
expect(obj,Col)
|
47
|
+
end
|
48
|
+
super
|
49
|
+
end
|
50
|
+
|
51
|
+
# This method has been redefined to only allow ColGroup::Col objects
|
52
|
+
# to be pushed onto a ColGroup instance.
|
53
|
+
def push(*args)
|
54
|
+
args.each do |obj|
|
55
|
+
unless obj.kind_of?(Table::ColGroup::Col)
|
56
|
+
msg = "Can only assign Col objects to ColGroup class"
|
57
|
+
msg += ": " + obj.class.to_s
|
58
|
+
raise TypeError, msg
|
59
|
+
end
|
60
|
+
super(obj)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# This method has been redefined to only allow ColGroup::Col objects
|
65
|
+
# to be pushed onto a ColGroup instance.
|
66
|
+
def <<(obj)
|
67
|
+
unless obj.kind_of?(Table::ColGroup::Col)
|
68
|
+
msg = "Can only assign Col objects to ColGroup class"
|
69
|
+
msg += ": " + obj.class.to_s
|
70
|
+
raise TypeError, msg
|
71
|
+
end
|
72
|
+
super(obj)
|
73
|
+
end
|
74
|
+
|
75
|
+
# This method has been redefined to only allow ColGroup::Col objects
|
76
|
+
# to be unshifted onto a ColGroup instance.
|
77
|
+
def unshift(obj)
|
78
|
+
unless obj.kind_of?(Table::ColGroup::Col)
|
79
|
+
msg = "Can only assign Data and Header objects to Row class"
|
80
|
+
raise TypeError, msg
|
81
|
+
end
|
82
|
+
super
|
83
|
+
end
|
84
|
+
|
85
|
+
# Returns a boolean indicating whether or not end tags are included for
|
86
|
+
# each ColGroup object in the final HTML output. The default is true.
|
87
|
+
def self.end_tags?
|
88
|
+
@end_tags
|
89
|
+
end
|
90
|
+
|
91
|
+
# Sets whether or not end tags are included for each ColGroup object in
|
92
|
+
# the final HTML output. The default is true. Only true or false are
|
93
|
+
# valid arguments.
|
94
|
+
def self.end_tags=(bool)
|
95
|
+
expect(bool,[TrueClass,FalseClass])
|
96
|
+
@end_tags = bool
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
data/lib/html/data.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
module HTML
|
2
|
+
|
3
|
+
# This class represents HTML table data, <td>. Despite the name
|
4
|
+
# it is not a subclass of Table::Row or Table.
|
5
|
+
class Table::Row::Data
|
6
|
+
include AttributeHandler
|
7
|
+
include HtmlHandler
|
8
|
+
undef_method :configure
|
9
|
+
@indent_level = 6
|
10
|
+
@end_tags = true
|
11
|
+
|
12
|
+
# Creates and returns a Data object. Optionally takes a block. If
|
13
|
+
# an argument is provided, it is treated as content.
|
14
|
+
def initialize(arg = nil)
|
15
|
+
@html_begin = '<td'
|
16
|
+
@html_body = ''
|
17
|
+
@html_end = '</td>'
|
18
|
+
yield self if block_given?
|
19
|
+
self.content = arg if arg
|
20
|
+
end
|
21
|
+
|
22
|
+
# Adds content to the Table::Row::Data object.
|
23
|
+
def content=(arg)
|
24
|
+
@html_body = arg.to_s
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns the indentation level for the tags of this class. The
|
28
|
+
# default is 6.
|
29
|
+
def self.indent_level
|
30
|
+
@indent_level
|
31
|
+
end
|
32
|
+
|
33
|
+
# Sets the indentation level for the tags of this class. The default
|
34
|
+
# is 6.
|
35
|
+
def self.indent_level=(num)
|
36
|
+
expect(num,Integer)
|
37
|
+
raise ArgumentError,"indent_level must be >= 0" if num < 0
|
38
|
+
@indent_level = num
|
39
|
+
end
|
40
|
+
|
41
|
+
# Returns a boolean indicating whether or not end tags, </td>, are
|
42
|
+
# included for each Data object in the final HTML output. The
|
43
|
+
# default is true.
|
44
|
+
def self.end_tags?
|
45
|
+
@end_tags
|
46
|
+
end
|
47
|
+
|
48
|
+
# Sets whether or not end tags are included for each Data object in
|
49
|
+
# the final HTML output. The default is true. Only true or false are
|
50
|
+
# valid arguments.
|
51
|
+
def self.end_tags=(bool)
|
52
|
+
expect(bool,[TrueClass,FalseClass])
|
53
|
+
@end_tags = bool
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/html/foot.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
module HTML
|
2
|
+
|
3
|
+
# This class represents an HTML table foot (<tfoot>). It is a
|
4
|
+
# subclass of Table::TableSection. It is a singleton class.
|
5
|
+
class Table::Foot < Table::TableSection
|
6
|
+
private_class_method :new
|
7
|
+
@@foot = nil
|
8
|
+
@indent_level = 3
|
9
|
+
@end_tags = true
|
10
|
+
|
11
|
+
# This is our constructor for Foot objects because it is a singleton
|
12
|
+
# class. Optionally, a block may be provided. If an argument is
|
13
|
+
# provided it is treated as content.
|
14
|
+
def self.create(arg=nil, &block)
|
15
|
+
@@foot = new(arg,&block) unless @@foot
|
16
|
+
@@foot
|
17
|
+
end
|
18
|
+
|
19
|
+
# Called by create() instead of new(). This initializes the Foot class.
|
20
|
+
def initialize(arg, &block)
|
21
|
+
@html_begin = "<tfoot"
|
22
|
+
@html_end = "</tfoot>"
|
23
|
+
yield self if block_given?
|
24
|
+
self.content = arg if arg
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns a boolean indicating whether or not end tags, </tfoot>, are
|
28
|
+
# included for each Foot object in the final HTML output. The
|
29
|
+
# default is true.
|
30
|
+
def self.end_tags?
|
31
|
+
@end_tags
|
32
|
+
end
|
33
|
+
|
34
|
+
# Sets whether or not end tags are included for each Foot object in
|
35
|
+
# the final HTML output. The default is true. Only true or false are
|
36
|
+
# valid arguments.
|
37
|
+
def self.end_tags=(bool)
|
38
|
+
expect(bool, [TrueClass,FalseClass])
|
39
|
+
@end_tags = bool
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
data/lib/html/head.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
module HTML
|
2
|
+
|
3
|
+
# This class represents an HTML table head (<thead>). It is a
|
4
|
+
# subclass of Table::TableSection. It is a singleton class.
|
5
|
+
class Table::Head < Table::TableSection
|
6
|
+
private_class_method :new
|
7
|
+
@@head = nil
|
8
|
+
@indent_level = 3
|
9
|
+
@end_tags = true
|
10
|
+
|
11
|
+
# This is our constructor for Head objects because it is a singleton
|
12
|
+
# class. Optionally, a block may be provided. If an argument is
|
13
|
+
# provided it is treated as content.
|
14
|
+
def self.create(arg=nil,&block)
|
15
|
+
@@head = new(arg,&block) unless @@head
|
16
|
+
@@head
|
17
|
+
end
|
18
|
+
|
19
|
+
# Called by create() instead of new(). This initializes the Head class.
|
20
|
+
def initialize(arg,&block)
|
21
|
+
@html_begin = "<thead"
|
22
|
+
@html_end = "</thead>"
|
23
|
+
yield self if block_given?
|
24
|
+
self.content = arg if arg
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns a boolean indicating whether or not end tags, </thead>, are
|
28
|
+
# included for each Head object in the final HTML output. The
|
29
|
+
# default is true.
|
30
|
+
def self.end_tags?
|
31
|
+
@end_tags
|
32
|
+
end
|
33
|
+
|
34
|
+
# Sets whether or not end tags are included for each Head object in
|
35
|
+
# the final HTML output. The default is true. Only true or false are
|
36
|
+
# valid arguments.
|
37
|
+
def self.end_tags=(bool)
|
38
|
+
expect(bool,[TrueClass,FalseClass])
|
39
|
+
@end_tags = bool
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/html/header.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
module HTML
|
2
|
+
|
3
|
+
# This class represents an HTML table header (<th>). Despite the name
|
4
|
+
# it is not a subclass of Table or Table::Row.
|
5
|
+
class Table::Row::Header
|
6
|
+
include AttributeHandler
|
7
|
+
include HtmlHandler
|
8
|
+
undef_method :configure
|
9
|
+
@indent_level = 6
|
10
|
+
@end_tags = true
|
11
|
+
|
12
|
+
# Creates and returns a new Header object. Optionally takes a block.
|
13
|
+
# If an argument is provided, it is treated as content.
|
14
|
+
def initialize(arg = nil)
|
15
|
+
@html_begin = '<th'
|
16
|
+
@html_body = ''
|
17
|
+
@html_end = '</th>'
|
18
|
+
yield self if block_given?
|
19
|
+
self.content = arg if arg
|
20
|
+
end
|
21
|
+
|
22
|
+
# Adds content to the Table::Row::Header object.
|
23
|
+
def content=(arg)
|
24
|
+
@html_body = arg.to_s
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns the indentation level for the tags of this class. The
|
28
|
+
# default is 6.
|
29
|
+
def self.indent_level
|
30
|
+
@indent_level
|
31
|
+
end
|
32
|
+
|
33
|
+
# Sets the indentation level for the tags of this class. The default
|
34
|
+
# is 6.
|
35
|
+
def self.indent_level=(num)
|
36
|
+
expect(num,Integer)
|
37
|
+
raise ArgumentError,"indent_level must be >= 0" if num < 0
|
38
|
+
@indent_level = num
|
39
|
+
end
|
40
|
+
|
41
|
+
# Returns a boolean indicating whether or not end tags are included for
|
42
|
+
# each Header object in the final HTML output. The default is true.
|
43
|
+
def self.end_tags?
|
44
|
+
@end_tags
|
45
|
+
end
|
46
|
+
|
47
|
+
# Sets whether or not end tags are included for each Header object in
|
48
|
+
# the final HTML output. The default is true. Only true or false are
|
49
|
+
# valid arguments.
|
50
|
+
def self.end_tags=(bool)
|
51
|
+
expect(bool,[TrueClass,FalseClass])
|
52
|
+
@end_tags = bool
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module HtmlHandler
|
2
|
+
|
3
|
+
$upper = false
|
4
|
+
|
5
|
+
# Used on HTML attributes. It creates proper HTML text based on the argument
|
6
|
+
# type. A string looks like "attr='text'", a number looks like "attr=1",
|
7
|
+
# while a true value simply looks like "attr" (no equal sign).
|
8
|
+
def modify_html(attribute,arg=nil)
|
9
|
+
if @html_begin.scan(/\b#{attribute}\b/).empty?
|
10
|
+
if arg.kind_of?(Fixnum)
|
11
|
+
@html_begin << " #{attribute}=#{arg}"
|
12
|
+
elsif arg.kind_of?(TrueClass)
|
13
|
+
@html_begin << " #{attribute}"
|
14
|
+
else
|
15
|
+
@html_begin << " #{attribute}='#{arg}'"
|
16
|
+
end
|
17
|
+
else
|
18
|
+
if arg.kind_of?(Fixnum)
|
19
|
+
@html_begin.gsub!(/#{attribute}=\d+/,"#{attribute}=#{arg}")
|
20
|
+
elsif arg.kind_of?(FalseClass)
|
21
|
+
@html_begin.gsub!(/#{attribute}/,'')
|
22
|
+
else
|
23
|
+
@html_begin.gsub!(/#{attribute}=['\w\.]+/,"#{attribute}='#{arg}'")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns the HTML text for the current object. Indentation and end tag
|
29
|
+
# options are optional, based on the settings of the classes themselves.
|
30
|
+
def html
|
31
|
+
if self.class.respond_to?(:html_case)
|
32
|
+
$upper = true if self.class.html_case == "upper"
|
33
|
+
end
|
34
|
+
|
35
|
+
if $upper
|
36
|
+
@html_begin.upcase!
|
37
|
+
@html_end.upcase!
|
38
|
+
end
|
39
|
+
|
40
|
+
ilevel = 0
|
41
|
+
|
42
|
+
if self.class.respond_to?(:indent_level)
|
43
|
+
ilevel = self.class.indent_level
|
44
|
+
end
|
45
|
+
|
46
|
+
html = ' ' * ilevel + @html_begin[0..-1]
|
47
|
+
len = html.length
|
48
|
+
html[len,len] = '>'
|
49
|
+
|
50
|
+
if self.kind_of?(Array)
|
51
|
+
html << self.map{ |e| "\n" + e.html.to_s }.join
|
52
|
+
else
|
53
|
+
html << @html_body
|
54
|
+
end
|
55
|
+
|
56
|
+
#####################################################################
|
57
|
+
# Add end tags, or not, depending on whether the class supports the
|
58
|
+
# end_tags class method. Those that don't have an end_tags class
|
59
|
+
# method necessarily means that the end tag must be included.
|
60
|
+
#
|
61
|
+
# The Table.global_end_tags method overrides the individual class
|
62
|
+
# preferences with regards to end tags.
|
63
|
+
#####################################################################
|
64
|
+
if self.kind_of?(Array)
|
65
|
+
if Table.global_end_tags?
|
66
|
+
if self.class.respond_to?(:end_tags?)
|
67
|
+
html << "\n" + ' ' * ilevel + @html_end if self.class.end_tags?
|
68
|
+
else
|
69
|
+
html << "\n" + ' ' * ilevel + @html_end
|
70
|
+
end
|
71
|
+
else
|
72
|
+
unless self.class.respond_to?(:end_tags?)
|
73
|
+
html << "\n" + ' ' * ilevel + @html_end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
else
|
77
|
+
if Table.global_end_tags?
|
78
|
+
if self.class.respond_to?(:end_tags?)
|
79
|
+
html << @html_end if self.class.end_tags?
|
80
|
+
else
|
81
|
+
html << @html_end
|
82
|
+
end
|
83
|
+
else
|
84
|
+
unless self.class.respond_to?(:end_tags?)
|
85
|
+
html << @html_end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
return html
|
91
|
+
end
|
92
|
+
|
93
|
+
private :modify_html
|
94
|
+
end
|