dyi 0.0.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|