ruport 1.0.2 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +3 -0
- data/README +11 -5
- data/Rakefile +2 -2
- data/examples/btree/commaleon/commaleon.rb +1 -1
- data/examples/simple_templating_example.rb +34 -0
- data/examples/tattle_rubygems_version.rb +6 -5
- data/examples/trac_ticket_status.rb +2 -2
- data/lib/ruport.rb +5 -4
- data/lib/ruport/acts_as_reportable.rb +63 -37
- data/lib/ruport/data.rb +1 -0
- data/lib/ruport/data/feeder.rb +111 -0
- data/lib/ruport/data/grouping.rb +84 -22
- data/lib/ruport/data/record.rb +1 -1
- data/lib/ruport/data/table.rb +127 -87
- data/lib/ruport/formatter.rb +22 -9
- data/lib/ruport/formatter/csv.rb +27 -3
- data/lib/ruport/formatter/html.rb +26 -6
- data/lib/ruport/formatter/pdf.rb +169 -36
- data/lib/ruport/formatter/template.rb +167 -0
- data/lib/ruport/formatter/text.rb +47 -15
- data/lib/ruport/query.rb +1 -1
- data/lib/ruport/renderer.rb +46 -56
- data/test/acts_as_reportable_test.rb +20 -20
- data/test/csv_formatter_test.rb +26 -1
- data/test/data_feeder_test.rb +88 -0
- data/test/grouping_test.rb +90 -4
- data/test/html_formatter_test.rb +25 -2
- data/test/pdf_formatter_test.rb +69 -3
- data/test/query_test.rb +3 -2
- data/test/record_test.rb +2 -1
- data/test/renderer_test.rb +49 -3
- data/test/sql_split_test.rb +4 -2
- data/test/table_test.rb +159 -65
- data/test/template_test.rb +37 -0
- data/test/text_formatter_test.rb +33 -1
- metadata +9 -4
- data/lib/ruport/renderer.rb.orig +0 -542
- data/test/renderer_test.rb.orig +0 -512
data/lib/ruport/formatter.rb
CHANGED
@@ -66,7 +66,7 @@ module Ruport
|
|
66
66
|
#
|
67
67
|
module RenderingTools
|
68
68
|
# Iterates through <tt>data</tt> and passes
|
69
|
-
# each row to render_row with the given options
|
69
|
+
# each row to render_row with the given options.
|
70
70
|
def render_data_by_row(options={},&block)
|
71
71
|
data.each do |r|
|
72
72
|
render_row(r,options,&block)
|
@@ -124,7 +124,9 @@ module Ruport
|
|
124
124
|
def render_helper(rend_klass, source_data,options={},&block)
|
125
125
|
options = {:data => source_data,
|
126
126
|
:io => output,
|
127
|
-
:layout => false }.merge(options)
|
127
|
+
:layout => false }.merge(options)
|
128
|
+
|
129
|
+
options[:io] = "" if self.class.kind_of?(Ruport::Formatter::PDF)
|
128
130
|
rend_klass.render(format,options) do |rend|
|
129
131
|
block[rend] if block
|
130
132
|
end
|
@@ -140,11 +142,11 @@ module Ruport
|
|
140
142
|
# Set automatically by Renderer#render(format) or Renderer#render_format
|
141
143
|
attr_accessor :format
|
142
144
|
|
143
|
-
# Set automatically by Renderer#render as a Renderer::Options
|
145
|
+
# Set automatically by Renderer#render as a Renderer::Options object built
|
144
146
|
# by the hash provided.
|
145
147
|
attr_writer :options
|
146
148
|
|
147
|
-
# Registers the formatter with one or more Renderers
|
149
|
+
# Registers the formatter with one or more Renderers.
|
148
150
|
#
|
149
151
|
# renders :pdf, :for => MyRenderer
|
150
152
|
# render :text, :for => [MyRenderer,YourRenderer]
|
@@ -172,6 +174,11 @@ module Ruport
|
|
172
174
|
# Gives a list of formats registered for this formatter.
|
173
175
|
def self.formats
|
174
176
|
@formats ||= []
|
177
|
+
end
|
178
|
+
|
179
|
+
# Returns the template currently set for this formatter.
|
180
|
+
def template
|
181
|
+
Template[options.template]
|
175
182
|
end
|
176
183
|
|
177
184
|
# Stores a string used for outputting formatted data.
|
@@ -180,15 +187,20 @@ module Ruport
|
|
180
187
|
@output ||= ""
|
181
188
|
end
|
182
189
|
|
183
|
-
# Provides a Renderer::Options object for storing formatting options
|
190
|
+
# Provides a Renderer::Options object for storing formatting options.
|
184
191
|
def options
|
185
192
|
@options ||= Renderer::Options.new
|
186
193
|
end
|
187
194
|
|
188
|
-
# Clears output.
|
195
|
+
# Clears the output.
|
189
196
|
def clear_output
|
190
197
|
@output.replace("")
|
191
|
-
end
|
198
|
+
end
|
199
|
+
|
200
|
+
# Saves the output to a file.
|
201
|
+
def save_output(filename)
|
202
|
+
File.open(filename,"w") {|f| f << output }
|
203
|
+
end
|
192
204
|
|
193
205
|
# Evaluates the string using ERB and returns the results.
|
194
206
|
#
|
@@ -203,7 +215,7 @@ module Ruport
|
|
203
215
|
end
|
204
216
|
end
|
205
217
|
|
206
|
-
# Provides a shortcut for per
|
218
|
+
# Provides a shortcut for per-format handlers.
|
207
219
|
#
|
208
220
|
# Example:
|
209
221
|
#
|
@@ -218,8 +230,9 @@ module Ruport
|
|
218
230
|
end
|
219
231
|
end
|
220
232
|
end
|
221
|
-
end
|
233
|
+
end
|
222
234
|
|
235
|
+
require "ruport/formatter/template"
|
223
236
|
require "ruport/formatter/csv"
|
224
237
|
require "ruport/formatter/html"
|
225
238
|
require "ruport/formatter/text"
|
data/lib/ruport/formatter/csv.rb
CHANGED
@@ -14,8 +14,8 @@
|
|
14
14
|
module Ruport
|
15
15
|
|
16
16
|
# This formatter implements the CSV format for Ruport's Row, Table, Group
|
17
|
-
# and Grouping renderers. It is a light wrapper around
|
18
|
-
# FasterCSV.
|
17
|
+
# and Grouping renderers. It is a light wrapper around
|
18
|
+
# James Edward Gray II's FasterCSV.
|
19
19
|
#
|
20
20
|
# === Rendering Options
|
21
21
|
#
|
@@ -37,6 +37,16 @@ module Ruport
|
|
37
37
|
:show_group_headers,
|
38
38
|
:style
|
39
39
|
|
40
|
+
# Hook for setting available options using a template. See the template
|
41
|
+
# documentation for the available options and their format.
|
42
|
+
def apply_template
|
43
|
+
apply_table_format_template(template.table_format)
|
44
|
+
apply_grouping_format_template(template.grouping_format)
|
45
|
+
|
46
|
+
options.format_options = template.format_options if
|
47
|
+
template.format_options
|
48
|
+
end
|
49
|
+
|
40
50
|
# Generates table header by turning column_names into a CSV row.
|
41
51
|
# Uses the row renderer to generate the actual formatted output
|
42
52
|
#
|
@@ -82,7 +92,7 @@ module Ruport
|
|
82
92
|
end
|
83
93
|
end
|
84
94
|
|
85
|
-
#
|
95
|
+
# Determines the proper style to use and renders the Grouping.
|
86
96
|
def build_grouping_body
|
87
97
|
case style
|
88
98
|
when :inline
|
@@ -110,5 +120,19 @@ module Ruport
|
|
110
120
|
output << "\n"
|
111
121
|
end
|
112
122
|
end
|
123
|
+
|
124
|
+
def apply_table_format_template(t)
|
125
|
+
t = t || {}
|
126
|
+
options.show_table_headers = t[:show_headings] unless
|
127
|
+
t[:show_headings].nil?
|
128
|
+
end
|
129
|
+
|
130
|
+
def apply_grouping_format_template(t)
|
131
|
+
t = t || {}
|
132
|
+
options.style = t[:style] if t[:style]
|
133
|
+
options.show_group_headers = t[:show_headings] unless
|
134
|
+
t[:show_headings].nil?
|
135
|
+
end
|
136
|
+
|
113
137
|
end
|
114
138
|
end
|
@@ -11,9 +11,9 @@
|
|
11
11
|
# See LICENSE and COPYING for details.
|
12
12
|
#
|
13
13
|
module Ruport
|
14
|
-
# This class produces HTML output for Ruport's Row,Table,Group, and
|
15
|
-
# renderers. It can be
|
16
|
-
# that might be useful for custom output
|
14
|
+
# This class produces HTML output for Ruport's Row, Table, Group, and
|
15
|
+
# Grouping renderers. It can be subclassed, as it has some helper methods
|
16
|
+
# that might be useful for custom output.
|
17
17
|
#
|
18
18
|
# === Rendering Options
|
19
19
|
#
|
@@ -30,10 +30,17 @@ module Ruport
|
|
30
30
|
|
31
31
|
opt_reader :show_table_headers, :show_group_headers, :style
|
32
32
|
|
33
|
+
# Hook for setting available options using a template. See the template
|
34
|
+
# documentation for the available options and their format.
|
35
|
+
def apply_template
|
36
|
+
apply_table_format_template(template.table_format)
|
37
|
+
apply_grouping_format_template(template.grouping_format)
|
38
|
+
end
|
39
|
+
|
33
40
|
# Generates table headers based on the column names of your Data::Table.
|
34
41
|
#
|
35
|
-
# This method does not do anything if options.show_table_headers is false
|
36
|
-
# the Data::Table has no column names.
|
42
|
+
# This method does not do anything if options.show_table_headers is false
|
43
|
+
# or the Data::Table has no column names.
|
37
44
|
def build_table_header
|
38
45
|
output << "\t<table>\n"
|
39
46
|
unless data.column_names.empty? || !show_table_headers
|
@@ -57,7 +64,7 @@ module Ruport
|
|
57
64
|
output << "\t</table>"
|
58
65
|
end
|
59
66
|
|
60
|
-
# Renders individual rows for the table
|
67
|
+
# Renders individual rows for the table.
|
61
68
|
def build_row
|
62
69
|
output <<
|
63
70
|
"\t\t<tr>\n\t\t\t<td>" +
|
@@ -139,6 +146,19 @@ module Ruport
|
|
139
146
|
def grouping_columns
|
140
147
|
data.data.to_a[0][1].column_names
|
141
148
|
end
|
149
|
+
|
150
|
+
def apply_table_format_template(t)
|
151
|
+
t = t || {}
|
152
|
+
options.show_table_headers = t[:show_headings] unless
|
153
|
+
t[:show_headings].nil?
|
154
|
+
end
|
155
|
+
|
156
|
+
def apply_grouping_format_template(t)
|
157
|
+
t = t || {}
|
158
|
+
options.style = t[:style] if t[:style]
|
159
|
+
options.show_group_headers = t[:show_headings] unless
|
160
|
+
t[:show_headings].nil?
|
161
|
+
end
|
142
162
|
|
143
163
|
end
|
144
164
|
end
|
data/lib/ruport/formatter/pdf.rb
CHANGED
@@ -54,9 +54,9 @@ module Ruport
|
|
54
54
|
#p "this actually gets called"
|
55
55
|
max_width = PDF::Writer::OHash.new(-1)
|
56
56
|
|
57
|
-
|
58
|
-
|
59
|
-
|
57
|
+
# Find the maximum cell widths based on the data and the headings.
|
58
|
+
# Passing through the data multiple times is unavoidable as we must
|
59
|
+
# do some analysis first.
|
60
60
|
@data.each do |row|
|
61
61
|
@cols.each do |name, column|
|
62
62
|
w = pdf.text_width(row[name].to_s, @font_size)
|
@@ -82,8 +82,7 @@ module Ruport
|
|
82
82
|
|
83
83
|
attr_writer :pdf_writer
|
84
84
|
|
85
|
-
opt_reader :
|
86
|
-
:style,
|
85
|
+
opt_reader :style,
|
87
86
|
:table_format,
|
88
87
|
:text_format,
|
89
88
|
:paper_size,
|
@@ -95,6 +94,17 @@ module Ruport
|
|
95
94
|
require "pdf/simpletable"
|
96
95
|
end
|
97
96
|
end
|
97
|
+
|
98
|
+
# Hook for setting available options using a template. See the template
|
99
|
+
# documentation for the available options and their format.
|
100
|
+
def apply_template
|
101
|
+
apply_page_format_template(template.page_format)
|
102
|
+
apply_text_format_template(template.text_format)
|
103
|
+
apply_table_format_template(template.table_format)
|
104
|
+
apply_column_format_template(template.column_format)
|
105
|
+
apply_heading_format_template(template.heading_format)
|
106
|
+
apply_grouping_format_template(template.grouping_format)
|
107
|
+
end
|
98
108
|
|
99
109
|
# Returns the current PDF::Writer object or creates a new one if it has not
|
100
110
|
# been set yet.
|
@@ -119,18 +129,18 @@ module Ruport
|
|
119
129
|
render_pdf unless options.skip_finalize_table
|
120
130
|
end
|
121
131
|
|
122
|
-
# Generates a header with the group name for Renderer::Group
|
132
|
+
# Generates a header with the group name for Renderer::Group.
|
123
133
|
def build_group_header
|
124
134
|
pad(10) { add_text data.name.to_s, :justification => :center }
|
125
135
|
end
|
126
136
|
|
127
|
-
# Renders the group as a table for Renderer::Group
|
137
|
+
# Renders the group as a table for Renderer::Group.
|
128
138
|
def build_group_body
|
129
139
|
render_table data, options.to_hash.merge(:formatter => pdf_writer)
|
130
140
|
end
|
131
141
|
|
132
142
|
# Determines which style to use and renders the main body for
|
133
|
-
# Renderer::Grouping
|
143
|
+
# Renderer::Grouping.
|
134
144
|
def build_grouping_body
|
135
145
|
case style
|
136
146
|
when :inline
|
@@ -145,13 +155,13 @@ module Ruport
|
|
145
155
|
end
|
146
156
|
end
|
147
157
|
|
148
|
-
#
|
158
|
+
# Calls <tt>render_pdf</tt>.
|
149
159
|
def finalize_grouping
|
150
160
|
render_pdf
|
151
161
|
end
|
152
162
|
|
153
|
-
# Call PDF::Writer#text with the given arguments, using
|
154
|
-
# defaults, if they are defined.
|
163
|
+
# Call PDF::Writer#text with the given arguments, using
|
164
|
+
# <tt>text_format</tt> defaults, if they are defined.
|
155
165
|
#
|
156
166
|
# Example:
|
157
167
|
#
|
@@ -164,7 +174,7 @@ module Ruport
|
|
164
174
|
pdf_writer.text(text, format_opts)
|
165
175
|
end
|
166
176
|
|
167
|
-
# Calls PDF::Writer#render and appends to <tt>output</tt
|
177
|
+
# Calls PDF::Writer#render and appends to <tt>output</tt>.
|
168
178
|
def render_pdf
|
169
179
|
output << pdf_writer.render
|
170
180
|
end
|
@@ -196,7 +206,7 @@ module Ruport
|
|
196
206
|
pdf_writer.add_image_from_file(path, x, y, img_width, img_height)
|
197
207
|
end
|
198
208
|
|
199
|
-
# Draws some text on the canvas, surrounded by a box with rounded
|
209
|
+
# Draws some text on the canvas, surrounded by a box with rounded corners.
|
200
210
|
#
|
201
211
|
# Yields an OpenStruct which options can be defined on.
|
202
212
|
#
|
@@ -254,22 +264,22 @@ module Ruport
|
|
254
264
|
end
|
255
265
|
end
|
256
266
|
|
257
|
-
#
|
258
|
-
# document
|
267
|
+
# Adds n to pdf_writer.y, moving the vertical drawing position in the
|
268
|
+
# document.
|
259
269
|
def move_cursor(n)
|
260
270
|
pdf_writer.y += n
|
261
271
|
end
|
262
272
|
|
263
|
-
#
|
273
|
+
# Moves the cursor to a specific y coordinate in the document.
|
264
274
|
def move_cursor_to(n)
|
265
275
|
pdf_writer.y = n
|
266
276
|
end
|
267
277
|
|
268
|
-
#
|
278
|
+
# Adds a specified amount of whitespace above and below the code
|
269
279
|
# in your block. For example, if you want to surround the top and
|
270
280
|
# bottom of a line of text with 5 pixels of whitespace:
|
271
281
|
#
|
272
|
-
# pad(5) { add_text "This will be padded" }
|
282
|
+
# pad(5) { add_text "This will be padded top and bottom" }
|
273
283
|
def pad(y,&block)
|
274
284
|
move_cursor(-y)
|
275
285
|
block.call
|
@@ -290,13 +300,13 @@ module Ruport
|
|
290
300
|
# For example, if you want to add a 10 pixel buffer to the bottom of a
|
291
301
|
# line of text:
|
292
302
|
#
|
293
|
-
# pad_bottom(10) { add_text "This will be padded on
|
303
|
+
# pad_bottom(10) { add_text "This will be padded on bottom" }
|
294
304
|
def pad_bottom(y,&block)
|
295
305
|
block.call
|
296
306
|
move_cursor(-y)
|
297
307
|
end
|
298
308
|
|
299
|
-
# Draws a PDF::SimpleTable using the given data (usually a Data::Table)
|
309
|
+
# Draws a PDF::SimpleTable using the given data (usually a Data::Table).
|
300
310
|
# Takes all the options you can set on a PDF::SimpleTable object,
|
301
311
|
# see the PDF::Writer API docs for details, or check our quick reference
|
302
312
|
# at:
|
@@ -327,25 +337,30 @@ module Ruport
|
|
327
337
|
pdf_writer.font_size = old
|
328
338
|
end
|
329
339
|
|
330
|
-
#
|
331
|
-
|
340
|
+
# Save the output to a file.
|
341
|
+
def save_output(filename)
|
342
|
+
File.open(filename,"wb") {|f| f << output }
|
343
|
+
end
|
344
|
+
|
345
|
+
# This module provides tools to simplify some common drawing operations.
|
346
|
+
# It is included by default in the PDF formatter.
|
332
347
|
#
|
333
348
|
module DrawingHelpers
|
334
349
|
|
335
|
-
#
|
350
|
+
# Draws a horizontal line from x1 to x2
|
336
351
|
def horizontal_line(x1,x2)
|
337
352
|
pdf_writer.line(x1,cursor,x2,cursor)
|
338
353
|
pdf_writer.stroke
|
339
354
|
end
|
340
355
|
|
341
|
-
#
|
356
|
+
# Draws a horizontal line from left_boundary to right_boundary
|
342
357
|
def horizontal_rule
|
343
358
|
horizontal_line(left_boundary,right_boundary)
|
344
359
|
end
|
345
360
|
|
346
361
|
alias_method :hr, :horizontal_rule
|
347
362
|
|
348
|
-
#
|
363
|
+
# Draws a vertical line at x from y1 to y2
|
349
364
|
def vertical_line_at(x,y1,y2)
|
350
365
|
pdf_writer.line(x,y1,x,y2)
|
351
366
|
pdf_writer.stroke
|
@@ -377,33 +392,82 @@ module Ruport
|
|
377
392
|
end
|
378
393
|
|
379
394
|
# Draws text at an absolute location, defined by
|
380
|
-
# :y, :x1|:left, :x2|:right
|
395
|
+
# :y, :x1|:left, :x2|:right
|
381
396
|
#
|
382
|
-
# All
|
397
|
+
# All options to add_text are also supported.
|
383
398
|
def draw_text(text,text_opts)
|
399
|
+
ypos = cursor
|
384
400
|
move_cursor_to(text_opts[:y]) if text_opts[:y]
|
385
401
|
add_text(text,
|
386
402
|
text_opts.merge(:absolute_left => text_opts[:x1] || text_opts[:left],
|
387
403
|
:absolute_right => text_opts[:x2] || text_opts[:right]))
|
404
|
+
move_cursor_to(ypos)
|
388
405
|
end
|
389
406
|
|
407
|
+
# Draws text at an absolute location, defined by
|
408
|
+
# :y, :x1|:left
|
409
|
+
#
|
410
|
+
# The x position defaults to the left margin and the
|
411
|
+
# y position defaults to the current cursor location.
|
412
|
+
#
|
413
|
+
# Uses PDF::Writer#add_text, so it will ignore any options not supported
|
414
|
+
# by that method.
|
415
|
+
def draw_text!(text,text_opts)
|
416
|
+
ypos = cursor
|
417
|
+
pdf_writer.add_text(text_opts[:x1] || text_opts[:left] || left_boundary,
|
418
|
+
text_opts[:y] || ypos,
|
419
|
+
text,
|
420
|
+
text_opts[:font_size],
|
421
|
+
text_opts[:angle] || 0)
|
422
|
+
move_cursor_to(ypos)
|
423
|
+
end
|
390
424
|
end
|
391
425
|
|
392
426
|
include DrawingHelpers
|
393
427
|
|
394
|
-
private
|
428
|
+
private
|
395
429
|
|
396
430
|
def apply_pdf_table_column_opts(table,table_data,format_opts)
|
397
|
-
column_opts = format_opts.delete(:column_options)
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
431
|
+
column_opts = format_opts.delete(:column_options)
|
432
|
+
|
433
|
+
if column_opts
|
434
|
+
heading_opts = column_opts.delete(:heading)
|
435
|
+
if column_opts[:justification]
|
436
|
+
heading_opts ||= {}
|
437
|
+
heading_opts = {
|
438
|
+
:justification => column_opts[:justification]
|
439
|
+
}.merge(heading_opts)
|
440
|
+
end
|
441
|
+
specific = get_specific_column_options(table_data.column_names,
|
442
|
+
column_opts)
|
443
|
+
columns = table_data.column_names.inject({}) { |s,c|
|
444
|
+
s.merge( c => ::PDF::SimpleTable::Column.new(c) { |col|
|
445
|
+
col.heading = create_heading(heading_opts)
|
446
|
+
column_opts.each { |k,v| col.send("#{k}=",v) }
|
447
|
+
# use the specific column names now
|
448
|
+
specific[c].each { |k,v| col.send("#{k}=",v) }
|
402
449
|
})
|
403
|
-
}
|
450
|
+
}
|
404
451
|
table.columns = columns
|
405
|
-
end
|
406
|
-
end
|
452
|
+
end
|
453
|
+
end
|
454
|
+
|
455
|
+
def get_specific_column_options(column_names,column_opts)
|
456
|
+
column_names.inject({}) do |s,c|
|
457
|
+
opts = column_opts.delete(c) || {}
|
458
|
+
if opts[:heading]
|
459
|
+
opts = opts.merge(:heading => create_heading(opts[:heading]))
|
460
|
+
end
|
461
|
+
s.merge(c => opts)
|
462
|
+
end
|
463
|
+
end
|
464
|
+
|
465
|
+
def create_heading(heading_opts)
|
466
|
+
heading_opts ||= {}
|
467
|
+
::PDF::SimpleTable::Column::Heading.new {|head|
|
468
|
+
heading_opts.each {|k,v| head.send("#{k}=",v) }
|
469
|
+
}
|
470
|
+
end
|
407
471
|
|
408
472
|
def grouping_columns
|
409
473
|
data.data.to_a[0][1].column_names.dup.unshift(data.grouped_by)
|
@@ -487,5 +551,74 @@ module Ruport
|
|
487
551
|
:justification => :center, :font_size => font_size)
|
488
552
|
end
|
489
553
|
|
554
|
+
def apply_page_format_template(t)
|
555
|
+
t = t || {}
|
556
|
+
options.paper_size = t[:size] if t[:size]
|
557
|
+
options.paper_orientation = t[:layout] if t[:layout]
|
558
|
+
end
|
559
|
+
|
560
|
+
def apply_text_format_template(t)
|
561
|
+
options.text_format = template.text_format if t
|
562
|
+
end
|
563
|
+
|
564
|
+
def apply_table_format_template(t)
|
565
|
+
options.table_format = template.table_format.dup if t
|
566
|
+
end
|
567
|
+
|
568
|
+
def apply_column_format_template(t)
|
569
|
+
t = t || {}
|
570
|
+
column_opts = {}
|
571
|
+
column_opts.merge!(:justification => t[:alignment]) if t[:alignment]
|
572
|
+
column_opts.merge!(:width => t[:width]) if t[:width]
|
573
|
+
unless column_opts.empty?
|
574
|
+
if options.table_format
|
575
|
+
if options.table_format[:column_options]
|
576
|
+
options.table_format[:column_options] =
|
577
|
+
column_opts.merge(options.table_format[:column_options])
|
578
|
+
else
|
579
|
+
options.table_format.merge!(:column_options => column_opts)
|
580
|
+
end
|
581
|
+
else
|
582
|
+
options.table_format = { :column_options => column_opts }
|
583
|
+
end
|
584
|
+
end
|
585
|
+
end
|
586
|
+
|
587
|
+
def apply_heading_format_template(t)
|
588
|
+
t = t || {}
|
589
|
+
heading_opts = {}
|
590
|
+
heading_opts.merge!(:justification => t[:alignment]) if t[:alignment]
|
591
|
+
heading_opts.merge!(:bold => t[:bold]) unless t[:bold].nil?
|
592
|
+
heading_opts.merge!(:title => t[:title]) if t[:title]
|
593
|
+
unless heading_opts.empty?
|
594
|
+
if options.table_format
|
595
|
+
if options.table_format[:column_options]
|
596
|
+
if options.table_format[:column_options][:heading]
|
597
|
+
options.table_format[:column_options][:heading] =
|
598
|
+
heading_opts.merge(
|
599
|
+
options.table_format[:column_options][:heading]
|
600
|
+
)
|
601
|
+
else
|
602
|
+
options.table_format[:column_options].merge!(
|
603
|
+
:heading => heading_opts
|
604
|
+
)
|
605
|
+
end
|
606
|
+
else
|
607
|
+
options.table_format.merge!(
|
608
|
+
:column_options => { :heading => heading_opts }
|
609
|
+
)
|
610
|
+
end
|
611
|
+
else
|
612
|
+
options.table_format = {
|
613
|
+
:column_options => { :heading => heading_opts }
|
614
|
+
}
|
615
|
+
end
|
616
|
+
end
|
617
|
+
end
|
618
|
+
|
619
|
+
def apply_grouping_format_template(t)
|
620
|
+
t = t || {}
|
621
|
+
options.style = t[:style] if t[:style]
|
622
|
+
end
|
490
623
|
end
|
491
624
|
end
|