dyi 0.0.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -24,339 +24,191 @@ require 'csv'
24
24
  module DYI #:nodoc:
25
25
  module Chart #:nodoc:
26
26
 
27
- module Legend
28
-
29
- private
30
-
31
- def draw_legend(names, shapes=nil, records=nil, colors=nil) #:nodoc:
32
- legend_canvas.translate(legend_point.x, legend_point.y)
33
- if show_legend?
34
- pen = Drawing::Pen.black_pen(:font => legend_font)
35
- brush = Drawing::Brush.new
36
- names.each_with_index do |name, index|
37
- y = legend_font_size * (1.2 * (index + 1))
38
- group = Shape::ShapeGroup.draw_on(legend_canvas)
39
- case shapes && shapes[index]
40
- when Shape::Base
41
- shapes[index].draw_on(group)
42
- when NilClass
43
- brush.color = colors && colors[index] || chart_color(index)
44
- brush.draw_rectangle(
45
- group,
46
- Coordinate.new(legend_font_size * 0.2, y - legend_font_size * 0.8),
47
- legend_font_size * 0.8,
48
- legend_font_size * 0.8)
49
- end
50
- pen.draw_text(
51
- group,
52
- Coordinate.new(legend_font_size * 0.2 + legend_font_size, y),
53
- name)
54
- end
55
- end
56
- end
57
-
58
- def legend_font_size #:nodoc:
59
- legend_font ? legend_font.draw_size : Font::DEFAULT_SIZE
60
- end
61
-
62
- def default_legend_point #:nodoc:
63
- Coordinate.new(0,0)
64
- end
65
-
66
- def default_legend_format #:nodoc:
67
- "{name}"
68
- end
69
-
70
- class << self
71
-
72
- private
73
-
74
- def included(klass) #:nodoc:
75
- klass.__send__(:opt_accessor, :show_legend, :type => :boolean, :default => true)
76
- klass.__send__(:opt_accessor, :legend_font, :type => :font)
77
- klass.__send__(:opt_accessor, :legend_format, :type => :string, :default_method => :default_legend_format)
78
- klass.__send__(:opt_accessor, :legend_point, :type => :point, :default_method => :default_legend_point)
79
- end
80
- end
81
- end
82
-
83
- module AxisUtil
84
-
85
- private
86
-
87
- def moderate_axis(data, axis_length, min=nil, max=nil, scale_count_limit=nil)
88
- raise ArgumentError, 'no data' if (data = data.flatten.compact).empty?
89
-
90
- axis_length = Length.new(axis_length)
91
- data_min, data_max = chart_range(data, min, max)
92
-
93
- base_value = base_value(data_min, data_max, min.nil?, max.nil?)
94
- scale_count_limit ||= (axis_length / Length.new(30)).to_i
95
- scale_count_limit = 10 if 10 < scale_count_limit
96
- scale_count_limit = 2 if scale_count_limit < 2
97
- scale_interval = scale_interval(base_value, data_min, data_max, scale_count_limit)
98
- min_scale_value = nil
99
- (base_value + scale_interval).step(data_min, -scale_interval) {|n| min_scale_value = n}
100
- min ||= (min_scale_value.nil? ? base_value : min_scale_value - scale_interval)
101
- min_scale_value ||= min + scale_interval
102
- unless max
103
- base_value.step(data_max, scale_interval) {|n| max = n}
104
- max += scale_interval if max < data_max
105
- end
106
- {
107
- :min => min || min_scale_value - scale_interval,
108
- :max => max,
109
- :axis_length => axis_length,
110
- :min_scale_value => min_scale_value,
111
- :scale_interval => scale_interval
112
- }
113
- end
114
-
115
- def top_digit(num, n=1) #:nodoc:
116
- num.div(10 ** (figures_count(num) - n + 1))
117
- end
118
-
119
- def suitable_1digit_value(a, b) #:nodoc:
120
- return a if a == b
121
- a, b = b, a if a > b
122
- return 0 if a == 0
123
- return 5 if a <= 5 && 5 <= b
124
- return 2 if a <= 2 && 2 <= b
125
- return 4 if a <= 4 && 4 <= b
126
- return 6 if a <= 6 && 6 <= b
127
- 8
128
- end
129
-
130
- def figures_count(num) #:nodoc:
131
- Math.log10(num).floor
132
- end
133
-
134
- def base_value(a, b, allow_under=true, allow_over=true) #:nodoc:
135
- return 0 if a * b <= 0 || a == b
136
- a, b = -a, -b if negative = (a < 0)
137
- a, b = b, a if a > b
138
- return 0 if ((negative && allow_over) || (!negative && allow_under)) && a < b * 0.3
139
- suitable_value_positive(a, b) * (negative ? -1 : 1)
140
- end
141
-
142
- def suitable_value_positive(a, b) #:nodoc:
143
- if figures_count(a) != (dig = figures_count(b))
144
- return 10 ** dig
145
- end
146
- n = 1
147
- n += 1 while (dig_a = top_digit(a, n)) == (dig_b = top_digit(b, n))
148
- (suitable_1digit_value(dig_a - dig_a.div(10) * 10 + (dig_a == dig_a.div(10) * 10 ? 0 : 1), dig_b - dig_b.div(10) * 10) + dig_a.div(10) * 10) * (10 ** (dig - figures_count(dig_a)))
149
- end
150
-
151
- def scale_interval(base_value, data_min, data_max, scale_count_limit) #:nodoc:
152
- if base_value - data_min < data_max - base_value
153
- allocate_scale_count = (data_max - base_value).div((data_max - data_min).quo(scale_count_limit))
154
- scale_interval_base2edge(base_value, data_max, allocate_scale_count)
27
+ module OptionCreator
28
+
29
+ # Difines a read property.
30
+ # @param [Symbol] name the property name
31
+ # @param [Hash] settings settings of the property
32
+ # @return [void]
33
+ def opt_reader(name, settings = {})
34
+ name = name.to_sym
35
+ getter_name = settings[:type] == :boolean ? name.to_s.gsub(/^(.*[^=\?])[=\?]*$/, '\1?') : name
36
+ if settings.key?(:default)
37
+ define_method(getter_name) {@options.key?(name) ? @options[name] : settings[:default]}
38
+ elsif settings.key?(:default_method)
39
+ define_method(getter_name) {@options.key?(name) ? @options[name] : __send__(settings[:default_method])}
40
+ elsif settings.key?(:default_proc)
41
+ define_method(getter_name) {@options.key?(name) ? @options[name] : settings[:default_proc].call(self)}
155
42
  else
156
- allocate_scale_count = (base_value - data_min).div((data_max - data_min).quo(scale_count_limit))
157
- scale_interval_base2edge(base_value, data_min, allocate_scale_count)
43
+ define_method(getter_name) {@options[name]}
158
44
  end
159
45
  end
160
46
 
161
- def scale_interval_base2edge(base_value, edge_value, scale_count_limit) #:nodoc:
162
- raise ArgumentError, 'base_value should not equal edge_value' if edge_value == base_value
163
- range = (base_value - edge_value).abs
47
+ # Difines a write property.
48
+ # @param [Symbol] name the property name
49
+ # @param [Hash] settings settings of the property
50
+ # @return [void]
51
+ def opt_writer(name, settings = {})
52
+ name = name.to_sym
53
+ setter_name = name.to_s.gsub(/^(.*[^=\?])[=\?]*$/, '\1=')
164
54
 
165
- top_2_digits = top_digit(range, 2)
166
- case scale_count_limit.to_i
167
- when 1
168
- case top_2_digits
169
- when 10 then label_range = 10
170
- when 11..20 then label_range = 20
171
- when 21..40 then label_range = 40
172
- when 41..50 then label_range = 50
173
- when 51..99 then label_range = 100
174
- end
175
- when 2
176
- case top_2_digits
177
- when 10 then label_range = 5
178
- when 11..20 then label_range = 10
179
- when 21..40 then label_range = 20
180
- when 41..50 then label_range = 25
181
- when 51..99 then label_range = 50
182
- end
183
- when 3
184
- case top_2_digits
185
- when 10 then label_range = 4
186
- when 11..15 then label_range = 5
187
- when 16..30 then label_range = 10
188
- when 31..60 then label_range = 20
189
- when 61..75 then label_range = 25
190
- when 76..99 then label_range = 40
191
- end
192
- when 4
193
- case top_2_digits
194
- when 10 then label_range = 2.5
195
- when 11..15 then label_range = 4
196
- when 16..20 then label_range = 5
197
- when 21..40 then label_range = 10
198
- when 41..80 then label_range = 20
199
- when 81..99 then label_range = 25
200
- end
201
- when 5
202
- case top_2_digits
203
- when 10 then label_range = 2
204
- when 11..12 then label_range = 2.5
205
- when 13..15 then label_range = 4
206
- when 16..25 then label_range = 5
207
- when 26..50 then label_range = 10
208
- when 51..99 then label_range = 20
209
- end
210
- when 6
211
- case top_2_digits
212
- when 10..12 then label_range = 2
213
- when 13..15 then label_range = 2.5
214
- when 16..20 then label_range = 4
215
- when 21..30 then label_range = 5
216
- when 31..60 then label_range = 10
217
- when 61..99 then label_range = 20
218
- end
219
- when 7
220
- case top_2_digits
221
- when 10..14 then label_range = 2
222
- when 15..17 then label_range = 2.5
223
- when 18..20 then label_range = 4
224
- when 21..35 then label_range = 5
225
- when 35..70 then label_range = 10
226
- when 71..99 then label_range = 20
227
- end
228
- when 8
229
- case top_2_digits
230
- when 10..16 then label_range = 2
231
- when 17..20 then label_range = 2.5
232
- when 21..25 then label_range = 4
233
- when 26..40 then label_range = 5
234
- when 41..80 then label_range = 10
235
- when 81..99 then label_range = 20
236
- end
237
- when 9
238
- case top_2_digits
239
- when 10..18 then label_range = 2
240
- when 19..22 then label_range = 2.5
241
- when 23..30 then label_range = 4
242
- when 31..45 then label_range = 5
243
- when 46..90 then label_range = 10
244
- when 91..99 then label_range = 20
55
+ convertor =
56
+ case settings[:type]
57
+ when :boolen then proc {|value| not not value}
58
+ when :string then proc {|value| value.to_s}
59
+ when :symbol then proc {|value| value.to_sym}
60
+ when :integer then proc {|value| value.to_i}
61
+ when :float then proc {|value| value.to_f}
62
+ when :length then proc {|value| Length.new(value)}
63
+ when :point then proc {|value| Coordinate.new(value)}
64
+ when :color then proc {|value| Color.new(value)}
65
+ when :font then proc {|value| Font.new(value)}
66
+ else proc {|value| value} if !settings.key?(:map_method) && !settings.key?(:mapper) && !settings.key?(:item_type)
67
+ end
68
+
69
+ validator =
70
+ case settings[:type]
71
+ when :symbol
72
+ if settings.key?(:valid_values)
73
+ proc {|value| raise ArgumentError, "\"#{value}\" is invalid value" unless settings[:valid_values].include?(convertor.call(value))}
245
74
  end
246
- else
247
- case top_2_digits
248
- when 10 then label_range = 1
249
- when 11..20 then label_range = 2
250
- when 21..25 then label_range = 2.5
251
- when 26..30 then label_range = 4
252
- when 31..50 then label_range = 5
253
- when 51..99 then label_range = 10
75
+ when :integer, :float
76
+ if settings.key?(:range)
77
+ proc {|value| raise ArgumentError, "\"#{value}\" is invalid value" unless settings[:range].include?(convertor.call(value))}
254
78
  end
255
- end
256
- label_range * (10 ** (figures_count(range) - 1))
257
- end
79
+ end
258
80
 
259
- def moderate_sub_axis(data, main_axis_settings, min=nil, max=nil)
260
- if min && max
261
- axis_ratio = (max - min).quo(main_axis_settings[:max] - main_axis_settings[:min])
262
- return {
263
- :max => max,
264
- :min => min,
265
- :min_scale_value => min + (main_axis_settings[:min_scale_value] - main_axis_settings[:min]) * axis_ratio,
266
- :axis_length => main_axis_settings[:axis_length],
267
- :scale_interval => main_axis_settings[:scale_interval] * axis_ratio
81
+ case settings[:type]
82
+ when :hash
83
+ raise ArgumentError, "keys is not specified" unless settings.key?(:keys)
84
+ define_method(setter_name) {|values|
85
+ if values.nil? || values.empty?
86
+ @options.delete(name)
87
+ else
88
+ @options[name] =
89
+ settings[:keys].inject({}) do |hash, key|
90
+ hash[key] =
91
+ if convertor
92
+ convertor.call(values[key])
93
+ elsif settings.key?(:map_method)
94
+ __send__(settings[:map_method], values[key])
95
+ elsif settings.key?(:mapper)
96
+ settings[:mapper].call(values[key], self)
97
+ elsif settings.key?(:item_type)
98
+ case settings[:item_type]
99
+ when :boolen then not not values[key]
100
+ when :string then values[key].to_s
101
+ when :symbol then values[key].to_sym
102
+ when :integer then values[key].to_i
103
+ when :float then values[key].to_f
104
+ when :length then Length.new(values[key])
105
+ when :point then Coordinate.new(values[key])
106
+ when :color then value[key].respond_to?(:format) ? value[key] : Color.new(values[key])
107
+ when :font then Font.new(values[key])
108
+ else values[key]
109
+ end
110
+ end if values[key]
111
+ hash
112
+ end
113
+ end
114
+ values
268
115
  }
269
- end
270
- scale_count = (main_axis_settings[:max] - main_axis_settings[:min_scale_value]).div(main_axis_settings[:scale_interval]) + (main_axis_settings[:min_scale_value] == main_axis_settings[:min] ? 0 : 1)
271
- data_min, data_max = chart_range(data, min, max)
272
-
273
- base_value = base_value(data_min, data_max, min.nil?, max.nil?)
274
-
275
- scale_interval = scale_interval(base_value, data_min, data_max, scale_count)
276
- min_scale_value = nil
277
- (base_value + scale_interval).step(data_min, -scale_interval) {|n| min_scale_value = n}
278
- min ||= (min_scale_value.nil? ? base_value : min_scale_value - scale_interval)
279
- min_scale_value ||= min + scale_interval
280
- max = scale_interval * scale_count + min
281
-
282
- {
283
- :min => min || min_scale_value - scale_interval,
284
- :max => max,
285
- :axis_length => main_axis_settings[:axis_length],
286
- :min_scale_value => min_scale_value,
287
- :scale_interval => scale_interval
288
- }
289
- end
290
-
291
- def chart_range(data, min=nil, max=nil)
292
- data = data.compact.flatten
293
- if min.nil? && max.nil?
294
- data_min, data_max =
295
- data.inject([nil, nil]) do |(_min, _max), value|
296
- [value < (_min ||= value) ? value : _min, (_max ||= value) < value ? value : _max]
116
+ when :array
117
+ define_method(setter_name) {|values|
118
+ if values.nil? || values.empty?
119
+ @options.delete(name)
120
+ else
121
+ @options[name] =
122
+ Array(values).to_a.map {|item|
123
+ if convertor
124
+ convertor.call(item)
125
+ elsif settings.key?(:map_method)
126
+ __send__(settings[:map_method], item)
127
+ elsif settings.key?(:mapper)
128
+ settings[:mapper].call(item, self)
129
+ elsif settings.key?(:item_type)
130
+ case settings[:item_type]
131
+ when :boolen then not not item
132
+ when :string then item.to_s
133
+ when :symbol then item.to_sym
134
+ when :integer then item.to_i
135
+ when :float then item.to_f
136
+ when :length then Length.new(item)
137
+ when :point then Coordinate.new(item)
138
+ when :color then item.respond_to?(:write_as) ? item : Color.new_or_nil(item)
139
+ when :font then Font.new(item)
140
+ else item
141
+ end
142
+ else
143
+ item
144
+ end
145
+ }
297
146
  end
298
- elsif min && max && max < min
299
- data_min, data_max = max, min
147
+ values
148
+ }
300
149
  else
301
- data_min = min || [data.min, max].min
302
- data_max = max || [data.max, min].max
303
- end
304
-
305
- if data_min == data_max
306
- if data_min > 0
307
- data_min = 0
308
- elsif data_max < 0
309
- data_max = 0
310
- else
311
- data_min = 0
312
- data_max = 100
313
- end
314
- end
315
- [data_min, data_max]
316
- end
317
-
318
- def value_position_on_chart(chart_margin, axis_settings, value, reverse_direction = false)
319
- axis_settings[:axis_length] *
320
- ((reverse_direction ? (axis_settings[:max] - value) : (value - axis_settings[:min])).to_f / (axis_settings[:max] - axis_settings[:min])) +
321
- Length.new(chart_margin)
322
- end
323
-
324
- def order_position_on_chart(chart_margin, axis_length, count, index, type=:point, renge_width_ratio=0, reverse_direction=false)
325
- chart_margin = Length.new(chart_margin)
326
- pos =
327
- case type
328
- when :point then index.to_f / (count - 1)
329
- when :range then (index + 0.5 - renge_width_ratio.to_f / 2) / count
330
- else raise ArgumentError, "\"#{type}\" is invalid type"
150
+ define_method(setter_name) {|value|
151
+ if value.nil?
152
+ @options.delete(name)
153
+ else
154
+ validator && validator.call(value)
155
+ @options[name] =
156
+ if convertor
157
+ convertor.call(value)
158
+ elsif settings.key?(:map_method)
159
+ __send__(settings[:map_method], value)
160
+ elsif ettings.key?(:mapper)
161
+ settings[:mapper].call(value, self)
162
+ elsif settings.key?(:item_type)
163
+ case settings[:item_type]
164
+ when :boolen then not not value
165
+ when :string then value.to_s
166
+ when :symbol then value.to_sym
167
+ when :integer then value.to_i
168
+ when :float then value.to_f
169
+ when :length then Length.new(value)
170
+ when :point then Coordinate.new(value)
171
+ when :color then Color.new(value)
172
+ when :font then Font.new(value)
173
+ else value
174
+ end
175
+ else
176
+ value
177
+ end
331
178
  end
332
- axis_length * pos + chart_margin
179
+ value
180
+ }
181
+ end
333
182
  end
334
183
 
335
- def round_top_2_digit(max, min) #:nodoc:
336
- digit = Math.log10([max.abs, min.abs].max).floor - 1
337
- [max.quo(10 ** digit).ceil * (10 ** digit), min.quo(10 ** digit).floor * (10 ** digit)]
338
- end
339
-
340
- def min_scale_value(max, min, scale_interval) #:nodoc:
341
- return scale_interval if min == 0
342
- if (max_digit = Math.log10(max).to_i) != Math.log10(min).to_i
343
- base_value = 10 ** max_digit
344
- elsif max.div(10 ** max_digit) != min.div(10 ** max_digit)
345
- base_value = 9 * 10 ** max_digit
346
- else
347
- range_digit = Math.log10(max - min).floor
348
- base_value = max.div(10 ** range_digit) * (10 ** range_digit)
349
- end
350
- base_value - ((base_value - min).quo(scale_interval).ceil - 1) * scale_interval
184
+ # Difines a read-write property.
185
+ # @param [Symbol] name the property name
186
+ # @param [Hash] settings settings of the property
187
+ # @return [void]
188
+ def opt_accessor(name, settings = {})
189
+ opt_reader(name, settings)
190
+ opt_writer(name, settings)
351
191
  end
352
192
  end
353
193
 
354
194
  class Base
195
+ extend OptionCreator
196
+
355
197
  DEFAULT_CHART_COLOR = ['#ff0f00', '#ff6600', '#ff9e01', '#fcd202', '#f8ff01', '#b0de09', '#04d215', '#0d8ecf', '#0d52d1', '#2a0cd0', '#8a0ccf', '#cd0d74']
356
198
  attr_reader :options, :data, :canvas
357
199
 
200
+ opt_accessor :background_image_url, :type => :string
201
+ opt_accessor :background_image_file, :type => :hash, :default => {}, :keys => [:path, :content_type], :item_type => :string
202
+ opt_accessor :background_image_opacity, :type => :float, :default => 1.0
203
+ opt_accessor :script_body, :type => :string
204
+ opt_accessor :css_body, :type => :string
205
+ opt_accessor :script_files, :type => :array, :item_type => :string
206
+ opt_accessor :css_files, :type => :array, :item_type => :string
207
+ opt_accessor :xsl_files, :type => :array, :item_type => :string
208
+ opt_accessor :canvas_css_class, :type => :string
209
+
358
210
  def initialize(width, height, options={})
359
- @canvas = Drawing::Canvas.new(width, height)
211
+ @canvas = Canvas.new(width, height)
360
212
  @options = {}
361
213
  options.each do |key, value|
362
214
  __send__("#{key}=", value) if respond_to?("#{key}=")
@@ -413,166 +265,36 @@ module DYI #:nodoc:
413
265
  end
414
266
 
415
267
  def chart_color(index) #:nodoc:
416
- if respond_to?(:chart_colors) && chart_colors
417
- result = chart_colors[index]
268
+ if data.has_field?(:color) && (color = data.records[index].color)
269
+ color
270
+ end
271
+ if color.nil? && respond_to?(:chart_colors) && chart_colors
272
+ color = chart_colors[index]
418
273
  end
419
- result || DEFAULT_CHART_COLOR[index % DEFAULT_CHART_COLOR.size]
274
+ color || Color.new(DEFAULT_CHART_COLOR[index % DEFAULT_CHART_COLOR.size])
420
275
  end
421
276
 
422
- class << self
423
-
424
- private
425
-
426
- def opt_reader(name, settings = {})
427
- name = name.to_sym
428
- getter_name = settings[:type] == :boolean ? name.to_s.gsub(/^(.*[^=\?])[=\?]*$/, '\1?') : name
429
- if settings.key?(:default)
430
- define_method(getter_name) {@options.key?(name) ? @options[name] : settings[:default]}
431
- elsif settings.key?(:default_method)
432
- define_method(getter_name) {@options.key?(name) ? @options[name] : __send__(settings[:default_method])}
433
- elsif settings.key?(:default_proc)
434
- define_method(getter_name) {@options.key?(name) ? @options[name] : settings[:default_proc].call(self)}
435
- else
436
- define_method(getter_name) {@options[name]}
437
- end
277
+ # @since 1.0.0
278
+ def create_vector_image #:nodoc:
279
+ @canvas.add_css_class(canvas_css_class) if canvas_css_class && !canvas_css_class.empty?
280
+ @canvas.add_script(script_body) if script_body && !script_body.empty?
281
+ @canvas.add_stylesheet(css_body) if css_body && !css_body.empty?
282
+ script_files && script_files.each do |script_file|
283
+ @canvas.reference_script_file(script_file)
438
284
  end
439
-
440
- def opt_writer(name, settings = {})
441
- name = name.to_sym
442
- setter_name = name.to_s.gsub(/^(.*[^=\?])[=\?]*$/, '\1=')
443
-
444
- convertor =
445
- case settings[:type]
446
- when :boolen then proc {|value| not not value}
447
- when :string then proc {|value| value.to_s}
448
- when :symbol then proc {|value| value.to_sym}
449
- when :integer then proc {|value| value.to_i}
450
- when :float then proc {|value| value.to_f}
451
- when :length then proc {|value| Length.new(value)}
452
- when :point then proc {|value| Coordinate.new(value)}
453
- when :color then proc {|value| Color.new(value)}
454
- when :font then proc {|value| Font.new(value)}
455
- else proc {|value| value} if !settings.key?(:map_method) && !settings.key?(:mapper) && !settings.key?(:item_type)
456
- end
457
-
458
- validator =
459
- case settings[:type]
460
- when :symbol
461
- if settings.key?(:valid_values)
462
- proc {|value| raise ArgumentError, "\"#{value}\" is invalid value" unless settings[:valid_values].include?(convertor.call(value))}
463
- end
464
- when :integer, :float
465
- if settings.key?(:range)
466
- proc {|value| raise ArgumentError, "\"#{value}\" is invalid value" unless settings[:range].include?(convertor.call(value))}
467
- end
468
- end
469
-
470
- case settings[:type]
471
- when :hash
472
- raise ArgumentError, "keys is not specified" unless settings.key?(:keys)
473
- define_method(setter_name) {|values|
474
- if values.nil? || values.empty?
475
- @options.delete(name)
476
- else
477
- @options[name] =
478
- settings[:keys].inject({}) do |hash, key|
479
- hash[key] =
480
- if convertor
481
- convertor.call(values[key])
482
- elsif settings.key?(:map_method)
483
- __send__(settings[:map_method], values[key])
484
- elsif settings.key?(:mapper)
485
- settings[:mapper].call(values[key], self)
486
- elsif settings.key?(:item_type)
487
- case settings[:item_type]
488
- when :boolen then not not values[key]
489
- when :string then values[key].to_s
490
- when :symbol then values[key].to_sym
491
- when :integer then values[key].to_i
492
- when :float then values[key].to_f
493
- when :length then Length.new(values[key])
494
- when :point then Coordinate.new(values[key])
495
- when :color then value[key].respond_to?(:format) ? value[key] : Color.new(values[key])
496
- when :font then Font.new(values[key])
497
- else values[key]
498
- end
499
- end if values[key]
500
- hash
501
- end
502
- end
503
- values
504
- }
505
- when :array
506
- define_method(setter_name) {|values|
507
- if values.nil? || values.empty?
508
- @options.delete(name)
509
- else
510
- @options[name] =
511
- Array(values).to_a.map {|item|
512
- if convertor
513
- convertor.call(item)
514
- elsif settings.key?(:map_method)
515
- __send__(settings[:map_method], item)
516
- elsif settings.key?(:mapper)
517
- settings[:mapper].call(item, self)
518
- elsif settings.key?(:item_type)
519
- case settings[:item_type]
520
- when :boolen then not not item
521
- when :string then item.to_s
522
- when :symbol then item.to_sym
523
- when :integer then item.to_i
524
- when :float then item.to_f
525
- when :length then Length.new(item)
526
- when :point then Coordinate.new(item)
527
- when :color then item.respond_to?(:write_as) ? item : Color.new(item)
528
- when :font then Font.new(item)
529
- else item
530
- end
531
- else
532
- item
533
- end
534
- }
535
- end
536
- values
537
- }
538
- else
539
- define_method(setter_name) {|value|
540
- if value.nil?
541
- @options.delete(name)
542
- else
543
- validator && validator.call(value)
544
- @options[name] =
545
- if convertor
546
- convertor.call(value)
547
- elsif settings.key?(:map_method)
548
- __send__(settings[:map_method], value)
549
- elsif ettings.key?(:mapper)
550
- settings[:mapper].call(value, self)
551
- elsif settings.key?(:item_type)
552
- case settings[:item_type]
553
- when :boolen then not not value
554
- when :string then value.to_s
555
- when :symbol then value.to_sym
556
- when :integer then value.to_i
557
- when :float then value.to_f
558
- when :length then Length.new(value)
559
- when :point then Coordinate.new(value)
560
- when :color then Color.new(value)
561
- when :font then Font.new(value)
562
- else value
563
- end
564
- else
565
- value
566
- end
567
- end
568
- value
569
- }
570
- end
285
+ css_files && css_files.each do |css_file|
286
+ @canvas.reference_stylesheet_file(css_file)
571
287
  end
572
-
573
- def opt_accessor(name, settings = {})
574
- opt_reader(name, settings)
575
- opt_writer(name, settings)
288
+ xsl_files && xsl_files.each do |xsl_file|
289
+ @canvas.reference_stylesheet_file(xsl_file, 'text/xsl')
290
+ end
291
+ brush = Drawing::Brush.new
292
+ brush.opacity = background_image_opacity if background_image_opacity != 1.0
293
+ if background_image_url
294
+ brush.import_image(canvas, [0, 0], width, height, background_image_url)
295
+ end
296
+ if background_image_file[:path]
297
+ brush.draw_image(canvas, [0, 0], width, height, background_image_file[:path], :content_type=>background_image_file[:content_type])
576
298
  end
577
299
  end
578
300
  end