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.
- data/CHANGES +13 -0
- data/examples/animation.rb +28 -0
- data/examples/class_diagram.rb +1 -1
- data/examples/css.rb +34 -0
- data/examples/line_and_bar.rb +1 -2
- data/examples/line_chart.rb +5 -6
- data/examples/logo.rb +1 -1
- data/examples/pie_chart.rb +11 -4
- data/examples/simple_shapes.rb +1 -1
- data/lib/dyi.rb +8 -2
- data/lib/dyi/animation.rb +259 -0
- data/lib/dyi/canvas.rb +202 -0
- data/lib/dyi/chart.rb +2 -0
- data/lib/dyi/chart/array_reader.rb +112 -63
- data/lib/dyi/chart/axis_util.rb +298 -0
- data/lib/dyi/chart/base.rb +188 -466
- data/lib/dyi/chart/csv_reader.rb +0 -4
- data/lib/dyi/chart/legend.rb +82 -0
- data/lib/dyi/chart/line_chart.rb +31 -23
- data/lib/dyi/chart/pie_chart.rb +237 -30
- data/lib/dyi/color.rb +1 -1
- data/lib/dyi/drawing.rb +8 -1
- data/lib/dyi/drawing/clipping.rb +14 -1
- data/lib/dyi/drawing/pen.rb +12 -2
- data/lib/dyi/element.rb +167 -0
- data/lib/dyi/event.rb +148 -0
- data/lib/dyi/formatter/base.rb +43 -3
- data/lib/dyi/formatter/eps_formatter.rb +2 -2
- data/lib/dyi/formatter/svg_formatter.rb +430 -74
- data/lib/dyi/painting.rb +6 -1
- data/lib/dyi/script.rb +29 -0
- data/lib/dyi/script/ecmascript.rb +273 -0
- data/lib/dyi/script/simple_script.rb +94 -0
- data/lib/dyi/shape.rb +5 -1331
- data/lib/dyi/shape/base.rb +612 -0
- data/lib/dyi/shape/path.rb +902 -0
- data/lib/dyi/stylesheet.rb +86 -0
- data/lib/ironruby.rb +11 -11
- metadata +17 -4
- data/lib/dyi/drawing/canvas.rb +0 -100
data/lib/dyi/chart/base.rb
CHANGED
@@ -24,339 +24,191 @@ require 'csv'
|
|
24
24
|
module DYI #:nodoc:
|
25
25
|
module Chart #:nodoc:
|
26
26
|
|
27
|
-
module
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
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
|
-
|
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
|
-
|
162
|
-
|
163
|
-
|
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
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
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
|
-
|
247
|
-
|
248
|
-
|
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
|
-
|
256
|
-
label_range * (10 ** (figures_count(range) - 1))
|
257
|
-
end
|
79
|
+
end
|
258
80
|
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
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
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
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
|
-
|
299
|
-
|
147
|
+
values
|
148
|
+
}
|
300
149
|
else
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
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
|
-
|
179
|
+
value
|
180
|
+
}
|
181
|
+
end
|
333
182
|
end
|
334
183
|
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
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 =
|
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
|
417
|
-
|
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
|
-
|
274
|
+
color || Color.new(DEFAULT_CHART_COLOR[index % DEFAULT_CHART_COLOR.size])
|
420
275
|
end
|
421
276
|
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
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
|
-
|
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
|
-
|
574
|
-
|
575
|
-
|
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
|