Spreadsheet-HTML 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/.travis.yml +8 -0
- data/Changes +4 -0
- data/Gemfile +4 -0
- data/License.md +23 -0
- data/Rakefile +7 -0
- data/Spreadsheet-HTML.gemspec +24 -0
- data/lib/Spreadsheet/HTML.rb +204 -0
- data/lib/Spreadsheet/HTML/version.rb +5 -0
- data/readme.md +34 -0
- data/t/01-load.rb +9 -0
- data/t/02-run.rb +64 -0
- data/t/03-matrix.rb +70 -0
- data/t/04-headless.rb +70 -0
- data/t/05-theta.rb +418 -0
- data/t/06-aliases.rb +278 -0
- data/t/07-attrs.rb +184 -0
- data/t/08-tgroups.rb +132 -0
- data/t/09-padding.rb +24 -0
- metadata +111 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9f87b9dc34a54719ccd396dd5e6c45234f920f4b
|
4
|
+
data.tar.gz: 376181b18aedfd03c3f19adf58217bb775c867c8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 13c66aed213cabad46d6db74c3bedffc8cf64d5a47cd93ff03322df308e5afc33551c9fa2e3d6cf2109a78e367d474ced40fc067e01cf9ca88b29736e649fab5
|
7
|
+
data.tar.gz: 999297ba319055f39163cd2d6f495c512a830a7d5b54cff557f595b8e8b646493c757a7196ea5e1f9ca0df1a8386f97ac90157e3e35676f72be24011ba06ec2a
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Changes
ADDED
data/Gemfile
ADDED
data/License.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
Copyright (c) 2015 Jeff Anderson
|
2
|
+
================================
|
3
|
+
|
4
|
+
MIT License
|
5
|
+
-----------
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
7
|
+
a copy of this software and associated documentation files (the
|
8
|
+
"Software"), to deal in the Software without restriction, including
|
9
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
10
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
11
|
+
permit persons to whom the Software is furnished to do so, subject to
|
12
|
+
the following conditions:
|
13
|
+
|
14
|
+
The above copyright notice and this permission notice shall be
|
15
|
+
included in all copies or substantial portions of the Software.
|
16
|
+
|
17
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
18
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
19
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
20
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
21
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
22
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
23
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'Spreadsheet/HTML/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "Spreadsheet-HTML"
|
8
|
+
spec.version = Spreadsheet::HTML::VERSION
|
9
|
+
spec.authors = ["jeffa"]
|
10
|
+
spec.email = ["jeffa@cpan.org"]
|
11
|
+
spec.description = %q{Just another HTML table generator}
|
12
|
+
spec.summary = %q{Generate HTML tables with ease (HTML4, XHTML and HTML5).}
|
13
|
+
spec.homepage = "https://github.com/jeffa/spreadsheet-html-ruby"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency 'rake', '~> 0'
|
23
|
+
spec.add_runtime_dependency 'HTML-AutoTag', '~> 1.0', '>= 1.0.1'
|
24
|
+
end
|
@@ -0,0 +1,204 @@
|
|
1
|
+
require "Spreadsheet/HTML/version"
|
2
|
+
require "HTML/AutoTag"
|
3
|
+
|
4
|
+
# i cannot hasa instantiate HTML::AutoTag inside Spreadsheet::HTML?!?
|
5
|
+
module Auto
|
6
|
+
class Tag < HTML::AutoTag
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module Spreadsheet
|
11
|
+
class HTML
|
12
|
+
|
13
|
+
def self.gen( *args )
|
14
|
+
self.new.generate( *args )
|
15
|
+
end
|
16
|
+
|
17
|
+
def north( *args )
|
18
|
+
generate( *args, 'theta' => 0 )
|
19
|
+
end
|
20
|
+
|
21
|
+
def portrait( *args )
|
22
|
+
generate( *args, 'theta' => 0 )
|
23
|
+
end
|
24
|
+
|
25
|
+
def west( *args )
|
26
|
+
generate( *args, 'theta' => -270, 'tgroups' => 0 )
|
27
|
+
end
|
28
|
+
|
29
|
+
def landscape( *args )
|
30
|
+
generate( *args, 'theta' => -270, 'tgroups' => 0 )
|
31
|
+
end
|
32
|
+
|
33
|
+
def east( *args )
|
34
|
+
generate( *args, 'theta' => 90, 'tgroups' => 0, 'pinhead' => 1 )
|
35
|
+
end
|
36
|
+
|
37
|
+
def south( *args )
|
38
|
+
generate( *args, 'theta' => -180, 'tgroups' => 0, 'pinhead' => 1 )
|
39
|
+
end
|
40
|
+
|
41
|
+
def generate( *args )
|
42
|
+
params = _process( args )
|
43
|
+
|
44
|
+
if params['theta'] and params['flip']
|
45
|
+
params['theta'] *= -1
|
46
|
+
end
|
47
|
+
|
48
|
+
if !params['theta'] # north
|
49
|
+
if params['flip']
|
50
|
+
params['data'] = params['data'].map {|a| a.reverse }
|
51
|
+
end
|
52
|
+
|
53
|
+
elsif params['theta'] == 90 # east
|
54
|
+
if params['pinhead'] and !params['headless']
|
55
|
+
params['data'] = params['data'].transpose.map{|a| a.push( a.shift ) }
|
56
|
+
else
|
57
|
+
params['data'] = params['data'].transpose.map{|a| a.reverse }
|
58
|
+
end
|
59
|
+
|
60
|
+
elsif params['theta'] == -90
|
61
|
+
if params['pinhead'] and !params['headless']
|
62
|
+
params['data'] = params['data'].transpose.reverse.map {|a| a.push( a.shift ) }
|
63
|
+
else
|
64
|
+
params['data'] = params['data'].transpose.reverse.map {|a| a.reverse }
|
65
|
+
end
|
66
|
+
|
67
|
+
elsif params['theta'] == 180
|
68
|
+
if params['pinhead'] and !params['headless']
|
69
|
+
params['data'] = params['data'].push( params['data'].shift ).map {|a| a.reverse }
|
70
|
+
else
|
71
|
+
params['data'] = params['data'].reverse.map {|a| a.reverse }
|
72
|
+
end
|
73
|
+
|
74
|
+
elsif params['theta'] == -180 # south
|
75
|
+
if params['pinhead'] and !params['headless']
|
76
|
+
params['data'] = params['data'].push( params['data'].shift )
|
77
|
+
else
|
78
|
+
params['data'] = params['data'].reverse
|
79
|
+
end
|
80
|
+
|
81
|
+
elsif params['theta'] == 270
|
82
|
+
params['data'] = params['data'].transpose.reverse
|
83
|
+
|
84
|
+
elsif params['theta'] == -270 # west
|
85
|
+
params['data'] = params['data'].transpose
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
return _make_table( params )
|
90
|
+
end
|
91
|
+
|
92
|
+
def initialize( *args )
|
93
|
+
(args[0] || []).each do |key,val|
|
94
|
+
self.instance_eval { class << self; self end }.send(:attr_accessor, key)
|
95
|
+
self.send( "#{key}=", val )
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def _make_table( params )
|
100
|
+
cdata = [] # TODO: insert caption and colgroup
|
101
|
+
|
102
|
+
if params['tgroups'] && params['tgroups'] > 0
|
103
|
+
|
104
|
+
body = params['data']
|
105
|
+
head = body.shift() unless params['matrix'] && data.size() > 2
|
106
|
+
foot = body.pop() if !params['matrix'] && params['tgroups'] > 1 and data.size() > 2
|
107
|
+
|
108
|
+
head_row = { 'tag' => 'tr', 'attr' => params['thead.tr'] || {}, 'cdata' => head }
|
109
|
+
foot_row = { 'tag' => 'tr', 'attr' => params['tfoot.tr'] || {}, 'cdata' => foot }
|
110
|
+
body_rows = body.map{ |r| { 'tag' => 'tr', 'attr' => params['tr'] || {}, 'cdata' => r } }
|
111
|
+
|
112
|
+
cdata.push({ 'tag' => 'thead', 'attr' => params['thead'] || {}, 'cdata' => head_row }) if head
|
113
|
+
cdata.push({ 'tag' => 'tfoot', 'attr' => params['tfoot'] || {}, 'cdata' => foot_row }) if foot
|
114
|
+
cdata.push({ 'tag' => 'tbody', 'attr' => params['tbody'] || {}, 'cdata' => body_rows })
|
115
|
+
|
116
|
+
else
|
117
|
+
cdata.push( params['data'].map { |c| { 'tag' => 'tr', 'attr' => params['tr'] || {}, 'cdata' => c } } )
|
118
|
+
end
|
119
|
+
|
120
|
+
return params['auto'].tag( 'tag' => 'table', 'attr' => params['table'] || {}, 'cdata' => cdata )
|
121
|
+
end
|
122
|
+
|
123
|
+
def _process( args )
|
124
|
+
params = _args( args )
|
125
|
+
|
126
|
+
# headings is an alias for -r0
|
127
|
+
params['-r0'] = params['headings']
|
128
|
+
|
129
|
+
index = {}
|
130
|
+
if params['data'][0].size()
|
131
|
+
# implement index mapping
|
132
|
+
end
|
133
|
+
|
134
|
+
data = []
|
135
|
+
empty = params.has_key?('empty') ? params['empty'] : ' '
|
136
|
+
tag = ( params['matrix'] or params['headless'] ) ? 'td' : 'th'
|
137
|
+
|
138
|
+
params['data'].each do |row|
|
139
|
+
r = []
|
140
|
+
row.each do |col|
|
141
|
+
r.push( { 'tag' => tag, 'attr' => params[tag] || {}, 'cdata' => col.to_s } )
|
142
|
+
end
|
143
|
+
data.push( r )
|
144
|
+
tag = 'td'
|
145
|
+
end
|
146
|
+
|
147
|
+
params['data'] = data
|
148
|
+
params['data'].shift if params['headless']
|
149
|
+
|
150
|
+
return params
|
151
|
+
end
|
152
|
+
|
153
|
+
def _args( things )
|
154
|
+
|
155
|
+
data = []
|
156
|
+
args = []
|
157
|
+
while !things.empty?
|
158
|
+
|
159
|
+
if things[0].kind_of?(Array)
|
160
|
+
data.push( things.shift() )
|
161
|
+
if things[0].kind_of?(Array)
|
162
|
+
data.push( things.shift() )
|
163
|
+
else
|
164
|
+
args.push( things.shift() ) if !things.empty?
|
165
|
+
args.push( things.shift() ) if !things.empty?
|
166
|
+
end
|
167
|
+
else
|
168
|
+
args.push( things.shift() ) if !things.empty?
|
169
|
+
args.push( things.shift() ) if !things.empty?
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
|
174
|
+
params = {}
|
175
|
+
self.instance_variables.each do |attr|
|
176
|
+
params[attr[1..-1]] = self.instance_variable_get attr
|
177
|
+
end
|
178
|
+
|
179
|
+
(args || []).each do |hash|
|
180
|
+
hash.each do |key,val|
|
181
|
+
params[key] = val
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
params['auto'] = Auto::Tag.new(
|
186
|
+
'encodes' => params['encodes'],
|
187
|
+
'indent' => params['indent'],
|
188
|
+
'level' => params['level'],
|
189
|
+
'sorted' => params['attr_sort'],
|
190
|
+
)
|
191
|
+
|
192
|
+
if !params['data'] and data[0].kind_of?(Array)
|
193
|
+
data = [ data ] if !data[0][0].kind_of?(Array)
|
194
|
+
params['data'] = data[0]
|
195
|
+
end
|
196
|
+
|
197
|
+
params['data'] = params['data'].clone
|
198
|
+
|
199
|
+
return params
|
200
|
+
end
|
201
|
+
|
202
|
+
end
|
203
|
+
|
204
|
+
end
|
data/readme.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
Spreadsheet-HTML (ruby)
|
2
|
+
=======================
|
3
|
+
Just another HTML table generator for ruby.
|
4
|
+
|
5
|
+
Description
|
6
|
+
-----------
|
7
|
+
Generate HTML tables with ease (HTML4, XHTML and HTML5).
|
8
|
+
|
9
|
+
Synopsis
|
10
|
+
--------
|
11
|
+
```ruby
|
12
|
+
require 'Spreadsheet/HTML'
|
13
|
+
|
14
|
+
data = Array[ [1,2,3], [4,5,6] ]
|
15
|
+
generator = Spreadsheet::HTML.new()
|
16
|
+
puts generator.generate( data )
|
17
|
+
puts generator.generate( 'data' => data )
|
18
|
+
|
19
|
+
generator = Spreadsheet::HTML.new( 'data' => data )
|
20
|
+
puts generator.portrait()
|
21
|
+
puts generator.landscape()
|
22
|
+
```
|
23
|
+
|
24
|
+
Installation
|
25
|
+
------------
|
26
|
+
We are currently pre-Alpha, so installation is not recommended.
|
27
|
+
|
28
|
+
* rake test
|
29
|
+
* rake build
|
30
|
+
* ~~rake install~~ :skull:
|
31
|
+
|
32
|
+
License and Copyright
|
33
|
+
---------------------
|
34
|
+
See [License](License.md).
|
data/t/01-load.rb
ADDED
data/t/02-run.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "Spreadsheet/HTML"
|
3
|
+
|
4
|
+
class Test_Run < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def test_instance
|
7
|
+
|
8
|
+
data = Array[[1,'a'], [2,'b']]
|
9
|
+
html = '<table><tr><th>1</th><th>a</th></tr><tr><td>2</td><td>b</td></tr></table>'
|
10
|
+
|
11
|
+
assert_equal(
|
12
|
+
html,
|
13
|
+
Spreadsheet::HTML.new( 'data' => data ).generate(),
|
14
|
+
"via constructor"
|
15
|
+
)
|
16
|
+
|
17
|
+
gen = Spreadsheet::HTML.new
|
18
|
+
|
19
|
+
assert_equal(
|
20
|
+
html,
|
21
|
+
gen.generate( [1,'a'], [2,'b'] ),
|
22
|
+
"two array refs"
|
23
|
+
)
|
24
|
+
|
25
|
+
assert_equal(
|
26
|
+
html,
|
27
|
+
gen.generate( data ),
|
28
|
+
"one array ref"
|
29
|
+
)
|
30
|
+
|
31
|
+
assert_equal(
|
32
|
+
html,
|
33
|
+
gen.generate( 'data' => data ),
|
34
|
+
"one named arg"
|
35
|
+
)
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_class
|
40
|
+
|
41
|
+
data = Array[[1,'a'], [2,'b']]
|
42
|
+
html = '<table><tr><th>1</th><th>a</th></tr><tr><td>2</td><td>b</td></tr></table>'
|
43
|
+
|
44
|
+
assert_equal(
|
45
|
+
html,
|
46
|
+
Spreadsheet::HTML.gen( [1,'a'], [2,'b'] ),
|
47
|
+
"two array refs"
|
48
|
+
)
|
49
|
+
|
50
|
+
assert_equal(
|
51
|
+
html,
|
52
|
+
Spreadsheet::HTML.gen( data ),
|
53
|
+
"one array ref"
|
54
|
+
)
|
55
|
+
|
56
|
+
assert_equal(
|
57
|
+
html,
|
58
|
+
Spreadsheet::HTML.gen( 'data' => data ),
|
59
|
+
"one named arg"
|
60
|
+
)
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
data/t/03-matrix.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "Spreadsheet/HTML"
|
3
|
+
|
4
|
+
class Test_Matrix < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def test_instance
|
7
|
+
|
8
|
+
data = Array[[1,'a'], [2,'b']]
|
9
|
+
html = '<table><tr><td>1</td><td>a</td></tr><tr><td>2</td><td>b</td></tr></table>'
|
10
|
+
|
11
|
+
assert_equal(
|
12
|
+
html,
|
13
|
+
Spreadsheet::HTML.new( 'data' => data, 'matrix' => 1 ).generate(),
|
14
|
+
"via constructor only"
|
15
|
+
)
|
16
|
+
|
17
|
+
assert_equal(
|
18
|
+
html,
|
19
|
+
Spreadsheet::HTML.new( 'data' => data ).generate( 'matrix' => 1 ),
|
20
|
+
"via constructor and method"
|
21
|
+
)
|
22
|
+
|
23
|
+
gen = Spreadsheet::HTML.new
|
24
|
+
|
25
|
+
assert_equal(
|
26
|
+
html,
|
27
|
+
gen.generate( [1,'a'], [2,'b'], 'matrix' => 1 ),
|
28
|
+
"two array refs"
|
29
|
+
)
|
30
|
+
|
31
|
+
assert_equal(
|
32
|
+
html,
|
33
|
+
gen.generate( data, 'matrix' => 1 ),
|
34
|
+
"one array ref"
|
35
|
+
)
|
36
|
+
|
37
|
+
assert_equal(
|
38
|
+
html,
|
39
|
+
gen.generate( 'data' => data, 'matrix' => 1 ),
|
40
|
+
"one named arg"
|
41
|
+
)
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_class
|
46
|
+
|
47
|
+
data = Array[[1,'a'], [2,'b']]
|
48
|
+
html = '<table><tr><td>1</td><td>a</td></tr><tr><td>2</td><td>b</td></tr></table>'
|
49
|
+
|
50
|
+
assert_equal(
|
51
|
+
html,
|
52
|
+
Spreadsheet::HTML.gen( [1,'a'], [2,'b'], 'matrix' => 1 ),
|
53
|
+
"two array refs"
|
54
|
+
)
|
55
|
+
|
56
|
+
assert_equal(
|
57
|
+
html,
|
58
|
+
Spreadsheet::HTML.gen( data, 'matrix' => 1 ),
|
59
|
+
"one array ref"
|
60
|
+
)
|
61
|
+
|
62
|
+
assert_equal(
|
63
|
+
html,
|
64
|
+
Spreadsheet::HTML.gen( 'data' => data, 'matrix' => 1 ),
|
65
|
+
"one named arg"
|
66
|
+
)
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|