dyi 0.0.2 → 1.0.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.
@@ -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