rasem 0.6.1 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +3 -4
- data/LICENSE.txt +2 -0
- data/README.rdoc +108 -16
- data/Rakefile +5 -7
- data/VERSION +1 -1
- data/bin/rasem +0 -0
- data/lib/rasem.rb +1 -0
- data/lib/rasem/application.rb +10 -11
- data/lib/rasem/download_documentation.rb +77 -0
- data/lib/rasem/svg_documentation.rb +5334 -0
- data/lib/rasem/svg_image.rb +689 -161
- data/spec/defs_spec.rb +103 -0
- data/spec/gradient_spec.rb +53 -0
- data/spec/path_spec.rb +227 -0
- data/spec/rasem_spec.rb +324 -116
- data/spec/spec_helper.rb +13 -0
- data/spec/transform_spec.rb +112 -0
- metadata +43 -46
data/spec/defs_spec.rb
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe Rasem::SVGTagWithParent do
|
4
|
+
|
5
|
+
it "should get a reference to the main image object" do
|
6
|
+
img = Rasem::SVGImage.new(:width => 100, :height => 100)
|
7
|
+
l = img.line(0, 0, 100, 100)
|
8
|
+
|
9
|
+
(l.img == img).should == true
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
it "should propagate the reference to the main image object" do
|
14
|
+
img = Rasem::SVGImage.new(:width => 100, :height => 100)
|
15
|
+
l = img.group.group.line(0, 0, 100, 100)
|
16
|
+
|
17
|
+
(l.img == img).should == true
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
describe Rasem::SVGImage do
|
25
|
+
|
26
|
+
it "should create a defs section" do
|
27
|
+
img = Rasem::SVGImage.new(:width => 100, :height => 100) do
|
28
|
+
defs do
|
29
|
+
group(:id => "group1") do
|
30
|
+
circle(0, 0, 20)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
img.to_s.should =~ %r{.*<svg[^>]*>.*<defs>.*<g[^>]*id="group1">.*<circle[^>]*/></g>.*</defs>.*</svg>}
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
it "should also create a defs section" do
|
40
|
+
img = Rasem::SVGImage.new(:width => 100, :height => 100) do
|
41
|
+
def_group("group1") do
|
42
|
+
circle(0, 0, 20)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
img.to_s.should =~ %r{.*<svg[^>]*>.*<defs>.*<g[^>]*id="group1">.*<circle[^>]*/></g>.*</defs>.*</svg>}
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
it "should update the existing definition" do
|
51
|
+
img = Rasem::SVGImage.new(:width => 100, :height => 100) do
|
52
|
+
def_group("group1") do
|
53
|
+
circle(0, 0, 20)
|
54
|
+
end
|
55
|
+
|
56
|
+
def_group("group1", :update) do
|
57
|
+
circle(0, 0, 40)
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
img.to_s.should =~ %r{.*<svg[^>]*>.*<defs>.*<g[^>]*id="group1">.*<circle cx="0" cy="0" r="40"[^>]*/></g>.*</defs>.*</svg>}
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
it "should skip the new definition" do
|
67
|
+
img = Rasem::SVGImage.new(:width => 100, :height => 100) do
|
68
|
+
def_group("group1") do
|
69
|
+
circle(0, 0, 20)
|
70
|
+
end
|
71
|
+
|
72
|
+
def_group("group1") do
|
73
|
+
circle(0, 0, 40)
|
74
|
+
fail "should skip the block execution"
|
75
|
+
end
|
76
|
+
|
77
|
+
def_group("group1", :skip) do
|
78
|
+
circle(0, 0, 40)
|
79
|
+
fail "should skip the block execution"
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
img.to_s.should =~ %r{.*<svg[^>]*>.*<defs>.*<g[^>]*id="group1">.*<circle cx="0" cy="0" r="20"[^>]*/></g>.*</defs>.*</svg>}
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
it "should fail with the new definition" do
|
89
|
+
img = Rasem::SVGImage.new(:width => 100, :height => 100)
|
90
|
+
img.def_group("group1") do
|
91
|
+
circle(0, 0, 20)
|
92
|
+
end
|
93
|
+
|
94
|
+
expect{img.def_group("group1", :fail) do
|
95
|
+
circle(0, 0, 40)
|
96
|
+
end}.to raise_error
|
97
|
+
|
98
|
+
img.to_s.should =~ %r{.*<svg[^>]*>.*<defs>.*<g[^>]*id="group1">.*<circle cx="0" cy="0" r="20"[^>]*/></g>.*</defs>.*</svg>}
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
end
|
103
|
+
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe Rasem::SVGLinearGradient do
|
4
|
+
|
5
|
+
it "should create a linear gradient in the defs section" do
|
6
|
+
img = Rasem::SVGImage.new(:width => 100, :height => 100) do
|
7
|
+
linearGradient("lgrad1") {}
|
8
|
+
end
|
9
|
+
|
10
|
+
img.to_s.should =~ %r{.*<svg[^>]*>.*<defs>.*<linearGradient id="lgrad1"/>.*</defs></svg}
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
it "should support adding stops" do
|
15
|
+
img = Rasem::SVGImage.new(:width => 100, :height => 100) do
|
16
|
+
linearGradient("lgrad1") do
|
17
|
+
stop("0%", "green", 1)
|
18
|
+
stop("100%", "blue", 1)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
img.to_s.should =~ %r{.*<svg[^>]*>.*<defs>.*<linearGradient id="lgrad1">.*<stop offset="0%" stop-color="green" stop-opacity="1"/>.*<stop offset="100%" stop-color="blue" stop-opacity="1"/>.*</linearGradient>.*</defs></svg}
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
describe Rasem::SVGRadialGradient do
|
29
|
+
|
30
|
+
it "should create a radial gradient in the defs section" do
|
31
|
+
img = Rasem::SVGImage.new(:width => 100, :height => 100) do
|
32
|
+
radialGradient("rgrad1") {}
|
33
|
+
end
|
34
|
+
|
35
|
+
img.to_s.should =~ %r{.*<svg[^>]*>.*<defs>.*<radialGradient id="rgrad1"/>.*</defs></svg}
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
it "should support adding stops" do
|
40
|
+
img = Rasem::SVGImage.new(:width => 100, :height => 100) do
|
41
|
+
radialGradient("rgrad1") do
|
42
|
+
stop("0%", "green", 1)
|
43
|
+
stop("100%", "blue", 1)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
img.to_s.should =~ %r{.*<svg[^>]*>.*<defs>.*<radialGradient id="rgrad1">.*<stop offset="0%" stop-color="green" stop-opacity="1"/>.*<stop offset="100%" stop-color="blue" stop-opacity="1"/>.*</radialGradient.*</defs></svg}
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
|
52
|
+
end
|
53
|
+
|
data/spec/path_spec.rb
ADDED
@@ -0,0 +1,227 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe Rasem::SVGPath do
|
4
|
+
|
5
|
+
it "should be an instance of SVGTag" do
|
6
|
+
tag = Rasem::SVGPath.new
|
7
|
+
(class_hierarchy(tag).include? Rasem::SVGTag).should == true
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
it "should create an empty path" do
|
12
|
+
tag = Rasem::SVGPath.new
|
13
|
+
tag.to_s.should =~ %r{<path d=\"\"\/>}
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
it "should add a move command" do
|
18
|
+
tag = Rasem::SVGPath.new do
|
19
|
+
moveTo(0, 0)
|
20
|
+
end
|
21
|
+
|
22
|
+
tag.to_s.should =~ %r{d=\"\s*m\s*0,0\"\/>}
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
it "should add an absolut move command" do
|
27
|
+
tag = Rasem::SVGPath.new do
|
28
|
+
moveToA(0, 0)
|
29
|
+
end
|
30
|
+
|
31
|
+
tag.to_s.should =~ %r{d=\"\s*M\s*0,0\"\/>}
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
it "should add a line command" do
|
36
|
+
tag = Rasem::SVGPath.new do
|
37
|
+
lineTo(0, 0)
|
38
|
+
end
|
39
|
+
|
40
|
+
tag.to_s.should =~ %r{d=\"\s*l\s*0,0\"\/>}
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
it "should add an absolut line command" do
|
45
|
+
tag = Rasem::SVGPath.new do
|
46
|
+
lineToA(0, 0)
|
47
|
+
end
|
48
|
+
|
49
|
+
tag.to_s.should =~ %r{d=\"\s*L\s*0,0\"\/>}
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
it "should add an horizontal line command" do
|
54
|
+
tag = Rasem::SVGPath.new do
|
55
|
+
hlineTo(0)
|
56
|
+
end
|
57
|
+
|
58
|
+
tag.to_s.should =~ %r{d=\"\s*h\s*0\"\/>}
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
it "should add an absolut horizontal line command" do
|
63
|
+
tag = Rasem::SVGPath.new do
|
64
|
+
hlineToA(0)
|
65
|
+
end
|
66
|
+
|
67
|
+
tag.to_s.should =~ %r{d=\"\s*H\s*0\"\/>}
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
it "should add an vertical line command" do
|
72
|
+
tag = Rasem::SVGPath.new do
|
73
|
+
vlineTo(0)
|
74
|
+
end
|
75
|
+
|
76
|
+
tag.to_s.should =~ %r{d=\"\s*v\s*0\"\/>}
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
it "should add an absolut vertical line command" do
|
81
|
+
tag = Rasem::SVGPath.new do
|
82
|
+
vlineToA(0)
|
83
|
+
end
|
84
|
+
|
85
|
+
tag.to_s.should =~ %r{d=\"\s*V\s*0\"\/>}
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
it "should add a curve command" do
|
90
|
+
tag = Rasem::SVGPath.new do
|
91
|
+
curveTo(10, 10, 0, 0, 5, 5)
|
92
|
+
end
|
93
|
+
|
94
|
+
tag.to_s.should =~ %r{d=\"\s*c\s*0,0\s*5,5\s*10,10\"\/>}
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
it "should add an absolut curve command" do
|
99
|
+
tag = Rasem::SVGPath.new do
|
100
|
+
curveToA(10, 10, 0, 0, 5, 5)
|
101
|
+
end
|
102
|
+
|
103
|
+
tag.to_s.should =~ %r{d=\"\s*C\s*0,0\s*5,5\s*10,10\"\/>}
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
it "should add a smooth curve command" do
|
108
|
+
tag = Rasem::SVGPath.new do
|
109
|
+
scurveTo(10, 10, 5, 5)
|
110
|
+
end
|
111
|
+
|
112
|
+
tag.to_s.should =~ %r{d=\"\s*s\s*5,5\s*10,10\"\/>}
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
it "should add an absolut smooth curve command" do
|
117
|
+
tag = Rasem::SVGPath.new do
|
118
|
+
scurveToA(10, 10, 5, 5)
|
119
|
+
end
|
120
|
+
|
121
|
+
tag.to_s.should =~ %r{d=\"\s*S\s*5,5\s*10,10\"\/>}
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
it "should add a quadratic curve command" do
|
126
|
+
tag = Rasem::SVGPath.new do
|
127
|
+
qcurveTo(10, 10, 5, 5)
|
128
|
+
end
|
129
|
+
|
130
|
+
tag.to_s.should =~ %r{d=\"\s*q\s*5,5\s*10,10\"\/>}
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
it "should add an absolut quadratic curve command" do
|
135
|
+
tag = Rasem::SVGPath.new do
|
136
|
+
qcurveToA(10, 10, 5, 5)
|
137
|
+
end
|
138
|
+
|
139
|
+
tag.to_s.should =~ %r{d=\"\s*Q\s*5,5\s*10,10\"\/>}
|
140
|
+
end
|
141
|
+
|
142
|
+
|
143
|
+
it "should add a smooth quadratic curve command" do
|
144
|
+
tag = Rasem::SVGPath.new do
|
145
|
+
sqcurveTo(10, 10)
|
146
|
+
end
|
147
|
+
|
148
|
+
tag.to_s.should =~ %r{d=\"\s*t\s*10,10\"\/>}
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
it "should add an absolut smooth quadratic curve command" do
|
153
|
+
tag = Rasem::SVGPath.new do
|
154
|
+
sqcurveToA(10, 10)
|
155
|
+
end
|
156
|
+
|
157
|
+
tag.to_s.should =~ %r{d=\"\s*T\s*10,10\"\/>}
|
158
|
+
end
|
159
|
+
|
160
|
+
|
161
|
+
it "should add an arc command" do
|
162
|
+
tag = Rasem::SVGPath.new do
|
163
|
+
arcTo(10, 10, 1, 2, 3, 4, 5)
|
164
|
+
end
|
165
|
+
|
166
|
+
tag.to_s.should =~ %r{d=\"\s*a\s*1,2\s*3\s*4,5\s*10,10\"\/>}
|
167
|
+
end
|
168
|
+
|
169
|
+
|
170
|
+
it "should add an absolut arc command" do
|
171
|
+
tag = Rasem::SVGPath.new do
|
172
|
+
arcToA(10, 10, 1, 2, 3, 4, 5)
|
173
|
+
end
|
174
|
+
|
175
|
+
tag.to_s.should =~ %r{d=\"\s*A\s*1,2\s*3\s*4,5\s*10,10\"\/>}
|
176
|
+
end
|
177
|
+
|
178
|
+
|
179
|
+
it "should add a closepath command" do
|
180
|
+
tag = Rasem::SVGPath.new do
|
181
|
+
close
|
182
|
+
end
|
183
|
+
|
184
|
+
tag.to_s.should =~ %r{d=\"\s*Z\"\/>}
|
185
|
+
end
|
186
|
+
|
187
|
+
|
188
|
+
it "should allow to combine commands" do
|
189
|
+
tag = Rasem::SVGPath.new do
|
190
|
+
moveTo(0, 0)
|
191
|
+
lineTo(0, 0)
|
192
|
+
hlineTo(0)
|
193
|
+
vlineTo(0)
|
194
|
+
curveTo(10, 10, 0, 0, 5, 5)
|
195
|
+
scurveTo(10, 10, 5, 5)
|
196
|
+
qcurveTo(10, 10, 5, 5)
|
197
|
+
sqcurveTo(10, 10)
|
198
|
+
arcTo(10, 10, 1, 2, 3, 4, 5)
|
199
|
+
close
|
200
|
+
end
|
201
|
+
|
202
|
+
tag.to_s.should =~ %r{d=\"\s*m\s*0,0\s*l\s*0,0\s*h\s*0\s*v\s*0\s*c\s*0,0\s*5,5\s*10,10\s*s\s*5,5\s*10,10\s*q\s*5,5\s*10,10\s*t\s*10,10\s*a\s*1,2\s*3\s*4,5\s*10,10\s*Z\s*\"}
|
203
|
+
|
204
|
+
|
205
|
+
tag = Rasem::SVGPath.new do
|
206
|
+
moveToA(0, 0)
|
207
|
+
lineToA(0, 0)
|
208
|
+
hlineToA(0)
|
209
|
+
vlineToA(0)
|
210
|
+
curveToA(10, 10, 0, 0, 5, 5)
|
211
|
+
scurveToA(10, 10, 5, 5)
|
212
|
+
qcurveToA(10, 10, 5, 5)
|
213
|
+
sqcurveToA(10, 10)
|
214
|
+
arcToA(10, 10, 1, 2, 3, 4, 5)
|
215
|
+
close
|
216
|
+
end
|
217
|
+
|
218
|
+
tag.to_s.should =~ %r{d=\"\s*M\s*0,0\s*L\s*0,0\s*H\s*0\s*V\s*0\s*C\s*0,0\s*5,5\s*10,10\s*S\s*5,5\s*10,10\s*Q\s*5,5\s*10,10\s*T\s*10,10\s*A\s*1,2\s*3\s*4,5\s*10,10\s*Z\s*\"}
|
219
|
+
|
220
|
+
end
|
221
|
+
|
222
|
+
|
223
|
+
|
224
|
+
|
225
|
+
|
226
|
+
end
|
227
|
+
|
data/spec/rasem_spec.rb
CHANGED
@@ -1,50 +1,206 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
require 'tempfile'
|
3
2
|
|
4
|
-
describe Rasem::
|
5
|
-
it "should
|
6
|
-
|
7
|
-
str =
|
8
|
-
str
|
9
|
-
str.should =~ %r{
|
3
|
+
describe Rasem::SVGTag do
|
4
|
+
it "should create an empty tag" do
|
5
|
+
tag = Rasem::SVGTag.new("svg")
|
6
|
+
str = ""
|
7
|
+
tag.write(str)
|
8
|
+
str.should =~ %r{<svg/>}
|
10
9
|
end
|
11
10
|
|
12
|
-
it "should
|
13
|
-
|
14
|
-
str =
|
15
|
-
str
|
11
|
+
it "should create a tag with parameters" do
|
12
|
+
tag = Rasem::SVGTag.new("svg", :width=>"100%", :height=>"100%")
|
13
|
+
str = ""
|
14
|
+
tag.write(str)
|
15
|
+
str.should =~ %r{<svg width="100%" height="100%"/>}
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should allow editing a parameter in existing tag" do
|
19
|
+
tag = Rasem::SVGTag.new("svg", :width=>"100%", :height=>"100%")
|
20
|
+
tag.height?.should == "100%"
|
21
|
+
tag.height = "15%"
|
22
|
+
tag.height?.should == "15%"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should raise errors if trying to reach invalid parameter" do
|
26
|
+
tag = Rasem::SVGTag.new("svg", :width=>"100%", :height=>"100%")
|
27
|
+
expect { tag.hight? }.to raise_error
|
28
|
+
expect { tag.higgg = "10" }.to raise_error
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should call spawn_child if possible to add that child" do
|
32
|
+
tag = Rasem::SVGTag.new("svg", :width=>"100%", :height=>"100%")
|
33
|
+
tag.should_receive('spawn_child').with(:g)
|
34
|
+
tag.g
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should not call spawn_child if not possible to add that child" do
|
38
|
+
tag = Rasem::SVGTag.new("svg", :width=>"100%", :height=>"100%")
|
39
|
+
tag.should_not_receive('spawn_child')
|
40
|
+
expect { tag.ggr }.to raise_error
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should create a child" do
|
44
|
+
tag = Rasem::SVGTag.new("svg")
|
45
|
+
tag.g
|
46
|
+
str = ""
|
47
|
+
tag.write(str)
|
48
|
+
str.should =~ %r{<svg><g/></svg>}
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should use alias for some children" do
|
52
|
+
tag = Rasem::SVGTag.new("svg")
|
53
|
+
tag.group
|
54
|
+
str = ""
|
55
|
+
tag.write(str)
|
56
|
+
str.should =~ %r{<svg><g/></svg>}
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should pass parameters to child" do
|
60
|
+
tag = Rasem::SVGTag.new("svg")
|
61
|
+
tag.group :id=>"G1", :class=>"C1"
|
62
|
+
str = ""
|
63
|
+
tag.write(str)
|
64
|
+
str.should =~ %r{<svg><g id="G1" class="C1"/></svg>}
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should raise an error when passing wrong parameter" do
|
68
|
+
tag = Rasem::SVGTag.new("svg")
|
69
|
+
expect { tag.group :height=>"100%" }.to raise_error
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should allow passing non named parameters" do
|
73
|
+
tag = Rasem::SVGTag.new("svg")
|
74
|
+
tag.line 0, 0, 100, 100
|
75
|
+
str = ""
|
76
|
+
tag.write(str)
|
77
|
+
str.should =~ %r{<svg><line x1="0" y1="0" x2="100" y2="100".*/></svg>}
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should raise error when passing not enough non named parameters" do
|
81
|
+
tag = Rasem::SVGTag.new("svg")
|
82
|
+
expect { tag.line 0, 0, 100 }.to raise_error
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should raise error when passing ill formed non named parameters (even if count matches)" do
|
86
|
+
tag = Rasem::SVGTag.new("svg")
|
87
|
+
expect { tag.line 0, 0, 100, :x2=>100 }.to raise_error
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should raise error when passing too much non named parameters" do
|
91
|
+
tag = Rasem::SVGTag.new("svg")
|
92
|
+
expect { tag.line 0, 0, 100, 10, 10 }.to raise_error
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should allow following non named parameters with named ones" do
|
96
|
+
tag = Rasem::SVGTag.new("svg")
|
97
|
+
tag.line 0, 0, 100, 100, :id=>"Line1"
|
98
|
+
str = ""
|
99
|
+
tag.write(str)
|
100
|
+
str.should =~ %r{line}
|
101
|
+
str.should =~ %r{x1="0"}
|
102
|
+
str.should =~ %r{y1="0"}
|
103
|
+
str.should =~ %r{x2="100"}
|
104
|
+
str.should =~ %r{y2="100"}
|
105
|
+
str.should =~ %r{id="Line1"}
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should use named parameters when there is a conflict" do
|
109
|
+
tag = Rasem::SVGTag.new("svg")
|
110
|
+
tag.line 0, 0, 100, 100, :x1=>"10"
|
111
|
+
str = ""
|
112
|
+
tag.write(str)
|
113
|
+
str.should =~ %r{line}
|
114
|
+
str.should =~ %r{x1="10"}
|
115
|
+
str.should_not =~ %r{x1="0"}
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should insert a child from block within" do
|
119
|
+
tag = Rasem::SVGTag.new("svg",:height=>"100%") do
|
120
|
+
g :id=>"G1" do
|
121
|
+
end
|
122
|
+
end
|
123
|
+
str = ""
|
124
|
+
tag.write(str)
|
125
|
+
str.should =~ %r{<svg height="100%"><g id="G1"/></svg>}
|
16
126
|
end
|
17
127
|
|
18
|
-
it "should
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
128
|
+
it "should nest easily" do
|
129
|
+
tag = Rasem::SVGTag.new("svg") do
|
130
|
+
g do
|
131
|
+
g do
|
132
|
+
g do
|
133
|
+
g do
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
str = ""
|
140
|
+
tag.write(str)
|
141
|
+
str.should =~ %r{<svg><g><g><g><g/></g></g></g></svg>}
|
142
|
+
end
|
143
|
+
|
144
|
+
it "should add style element if parameters contain style tag" do
|
145
|
+
tag = Rasem::SVGTag.new("svg") do
|
146
|
+
line 0, 0, 10, 10, :stroke=>"violet"
|
147
|
+
end
|
148
|
+
str = ""
|
149
|
+
tag.write(str)
|
150
|
+
str.should =~ %r{style="stroke:violet;"}
|
23
151
|
end
|
24
152
|
|
25
|
-
it "should
|
26
|
-
|
153
|
+
it "should add transform element if parameters contain style tag" do
|
154
|
+
tag = Rasem::SVGTag.new("svg") do
|
155
|
+
line 0, 0, 10, 10, :scale=>2
|
27
156
|
end
|
28
|
-
|
157
|
+
str = ""
|
158
|
+
tag.write(str)
|
159
|
+
str.should =~ /transform=".*scale\(2\).*"/
|
29
160
|
end
|
30
|
-
|
161
|
+
end
|
162
|
+
|
163
|
+
describe Rasem::SVGImage do
|
164
|
+
it "should initialize an empty image" do
|
165
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100")
|
166
|
+
str = ""
|
167
|
+
img.write(str)
|
168
|
+
str.should =~ /<svg.*width="100".*height="100"/
|
169
|
+
end
|
170
|
+
|
171
|
+
it "should initialize an empty image in given output" do
|
172
|
+
str = ""
|
173
|
+
img = Rasem::SVGImage.new({:width=>"100", :height=>"100"}, str) do
|
174
|
+
end
|
175
|
+
str.should =~ /<svg.*width="100".*height="100"/
|
176
|
+
end
|
177
|
+
|
178
|
+
it "should initialize XML correctly" do
|
179
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100")
|
180
|
+
str = ""
|
181
|
+
img.write(str)
|
182
|
+
str.should =~ /^<\?xml/
|
183
|
+
end
|
184
|
+
|
31
185
|
it "should draw line using method" do
|
32
|
-
img = Rasem::SVGImage.new(100, 100)
|
186
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100")
|
33
187
|
img.line(0, 0, 100, 100)
|
34
|
-
|
35
|
-
|
188
|
+
str = ""
|
189
|
+
img.write(str)
|
36
190
|
str.should =~ %r{<line}
|
37
191
|
str.should =~ %r{x1="0"}
|
38
192
|
str.should =~ %r{y1="0"}
|
39
193
|
str.should =~ %r{x2="100"}
|
40
194
|
str.should =~ %r{y2="100"}
|
41
195
|
end
|
42
|
-
|
196
|
+
|
43
197
|
it "should draw line using a block" do
|
44
|
-
img = Rasem::SVGImage.new(100, 100) do
|
198
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
45
199
|
line(0, 0, 100, 100)
|
46
200
|
end
|
47
|
-
str =
|
201
|
+
str = ""
|
202
|
+
img.write(str)
|
203
|
+
|
48
204
|
str.should =~ %r{<line}
|
49
205
|
str.should =~ %r{x1="0"}
|
50
206
|
str.should =~ %r{y1="0"}
|
@@ -53,19 +209,23 @@ describe Rasem::SVGImage do
|
|
53
209
|
end
|
54
210
|
|
55
211
|
it "should draw a line with style" do
|
56
|
-
img = Rasem::SVGImage.new(100, 100) do
|
212
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
57
213
|
line(0, 0, 10, 10, :fill=>"white")
|
58
214
|
end
|
59
|
-
str =
|
215
|
+
str = ""
|
216
|
+
img.write(str)
|
217
|
+
|
60
218
|
str.should =~ %r{style=}
|
61
219
|
str.should =~ %r{fill:white}
|
62
220
|
end
|
63
221
|
|
64
222
|
it "should draw a circle" do
|
65
|
-
img = Rasem::SVGImage.new(100, 100) do
|
223
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
66
224
|
circle(0, 0, 10)
|
67
225
|
end
|
68
|
-
str =
|
226
|
+
str = ""
|
227
|
+
img.write(str)
|
228
|
+
|
69
229
|
str.should =~ %r{<circle}
|
70
230
|
str.should =~ %r{cx="0"}
|
71
231
|
str.should =~ %r{cy="0"}
|
@@ -73,38 +233,46 @@ describe Rasem::SVGImage do
|
|
73
233
|
end
|
74
234
|
|
75
235
|
it "should draw a circle with style" do
|
76
|
-
img = Rasem::SVGImage.new(100, 100) do
|
236
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
77
237
|
circle(0, 0, 10, :fill=>"white")
|
78
238
|
end
|
79
|
-
str =
|
239
|
+
str = ""
|
240
|
+
img.write(str)
|
241
|
+
|
80
242
|
str.should =~ %r{style=}
|
81
243
|
str.should =~ %r{fill:white}
|
82
244
|
end
|
83
245
|
|
84
246
|
it "should draw a rectangle" do
|
85
|
-
img = Rasem::SVGImage.new(100, 100) do
|
247
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
86
248
|
rectangle(0, 0, 100, 300)
|
87
249
|
end
|
88
|
-
str =
|
250
|
+
str = ""
|
251
|
+
img.write(str)
|
252
|
+
|
89
253
|
str.should =~ %r{<rect}
|
90
254
|
str.should =~ %r{width="100"}
|
91
255
|
str.should =~ %r{height="300"}
|
92
256
|
end
|
93
257
|
|
94
258
|
it "should draw a rectangle with style" do
|
95
|
-
img = Rasem::SVGImage.new(100, 100) do
|
259
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
96
260
|
rectangle(0, 0, 10, 10, :fill=>"white")
|
97
261
|
end
|
98
|
-
str =
|
262
|
+
str = ""
|
263
|
+
img.write(str)
|
264
|
+
|
99
265
|
str.should =~ %r{style=}
|
100
266
|
str.should =~ %r{fill:white}
|
101
267
|
end
|
102
268
|
|
103
269
|
it "should draw a symmetric round-rectangle" do
|
104
|
-
img = Rasem::SVGImage.new(100, 100) do
|
270
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
105
271
|
rectangle(0, 0, 100, 300, 20)
|
106
272
|
end
|
107
|
-
str =
|
273
|
+
str = ""
|
274
|
+
img.write(str)
|
275
|
+
|
108
276
|
str.should =~ %r{<rect}
|
109
277
|
str.should =~ %r{width="100"}
|
110
278
|
str.should =~ %r{height="300"}
|
@@ -113,19 +281,23 @@ describe Rasem::SVGImage do
|
|
113
281
|
end
|
114
282
|
|
115
283
|
it "should draw a symmetric rounded-rectangle with style" do
|
116
|
-
img = Rasem::SVGImage.new(100, 100) do
|
284
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
117
285
|
rectangle(0, 0, 10, 10, 2, :fill=>"white")
|
118
286
|
end
|
119
|
-
str =
|
287
|
+
str = ""
|
288
|
+
img.write(str)
|
289
|
+
|
120
290
|
str.should =~ %r{style=}
|
121
291
|
str.should =~ %r{fill:white}
|
122
292
|
end
|
123
293
|
|
124
294
|
it "should draw a non-symmetric round-rectangle" do
|
125
|
-
img = Rasem::SVGImage.new(100, 100) do
|
295
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
126
296
|
rectangle(0, 0, 100, 300, 20, 5)
|
127
297
|
end
|
128
|
-
str =
|
298
|
+
str = ""
|
299
|
+
img.write(str)
|
300
|
+
|
129
301
|
str.should =~ %r{<rect}
|
130
302
|
str.should =~ %r{width="100"}
|
131
303
|
str.should =~ %r{height="300"}
|
@@ -134,19 +306,23 @@ describe Rasem::SVGImage do
|
|
134
306
|
end
|
135
307
|
|
136
308
|
it "should draw a non-symmetric rounded-rectangle with style" do
|
137
|
-
img = Rasem::SVGImage.new(100, 100) do
|
309
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
138
310
|
rectangle(0, 0, 10, 10, 2, 4, :fill=>"white")
|
139
311
|
end
|
140
|
-
str =
|
312
|
+
str = ""
|
313
|
+
img.write(str)
|
314
|
+
|
141
315
|
str.should =~ %r{style=}
|
142
316
|
str.should =~ %r{fill:white}
|
143
317
|
end
|
144
|
-
|
318
|
+
|
145
319
|
it "should draw an ellipse" do
|
146
|
-
img = Rasem::SVGImage.new(100, 100) do
|
320
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
147
321
|
ellipse(0, 0, 100, 300)
|
148
322
|
end
|
149
|
-
str =
|
323
|
+
str = ""
|
324
|
+
img.write(str)
|
325
|
+
|
150
326
|
str.should =~ %r{<ellipse}
|
151
327
|
str.should =~ %r{cx="0"}
|
152
328
|
str.should =~ %r{cy="0"}
|
@@ -155,178 +331,210 @@ describe Rasem::SVGImage do
|
|
155
331
|
end
|
156
332
|
|
157
333
|
it "should draw an ellipse with style" do
|
158
|
-
img = Rasem::SVGImage.new(100, 100) do
|
334
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
159
335
|
ellipse(0, 0, 3, 10, :fill=>"white")
|
160
336
|
end
|
161
|
-
str =
|
337
|
+
str = ""
|
338
|
+
img.write(str)
|
339
|
+
|
162
340
|
str.should =~ %r{style=}
|
163
341
|
str.should =~ %r{fill:white}
|
164
342
|
end
|
165
343
|
|
166
344
|
it "should draw a polygon given an array of points" do
|
167
|
-
img = Rasem::SVGImage.new(100, 100) do
|
345
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
168
346
|
polygon([[0,0], [1,2], [3,4]])
|
169
347
|
end
|
170
|
-
str =
|
348
|
+
str = ""
|
349
|
+
img.write(str)
|
350
|
+
|
171
351
|
str.should =~ %r{<polygon}
|
172
352
|
str.should =~ %r{points="0,0 1,2 3,4"}
|
173
353
|
end
|
174
354
|
|
175
355
|
it "should draw a polygon with style" do
|
176
|
-
img = Rasem::SVGImage.new(100, 100) do
|
356
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
177
357
|
polygon([[0,0], [1,2], [3,4]], :fill=>"white")
|
178
358
|
end
|
179
|
-
str =
|
359
|
+
str = ""
|
360
|
+
img.write(str)
|
361
|
+
|
180
362
|
str.should =~ %r{style=}
|
181
363
|
str.should =~ %r{fill:white}
|
182
364
|
end
|
183
365
|
|
184
366
|
it "should draw a polyline given an array of points" do
|
185
|
-
img = Rasem::SVGImage.new(100, 100) do
|
367
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
186
368
|
polyline([[0,0], [1,2], [3,4]])
|
187
369
|
end
|
188
|
-
str =
|
370
|
+
str = ""
|
371
|
+
img.write(str)
|
372
|
+
|
189
373
|
str.should =~ %r{<polyline}
|
190
374
|
str.should =~ %r{points="0,0 1,2 3,4"}
|
191
375
|
end
|
192
376
|
|
193
377
|
it "should fix style names" do
|
194
|
-
img = Rasem::SVGImage.new(100, 100) do
|
378
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
195
379
|
circle(0, 0, 10, :stroke_width=>3)
|
196
380
|
end
|
197
|
-
str =
|
381
|
+
str = ""
|
382
|
+
img.write(str)
|
383
|
+
|
198
384
|
str.should =~ %r{style=}
|
199
385
|
str.should =~ %r{stroke-width:3}
|
200
386
|
end
|
201
|
-
|
387
|
+
|
202
388
|
it "should group styles" do
|
203
|
-
img = Rasem::SVGImage.new(100, 100) do
|
389
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
204
390
|
with_style :stroke_width=>3 do
|
205
391
|
circle(0, 0, 10)
|
206
392
|
end
|
207
393
|
end
|
208
|
-
str =
|
394
|
+
str = ""
|
395
|
+
img.write(str)
|
396
|
+
|
209
397
|
str.should =~ %r{style=}
|
210
398
|
str.should =~ %r{stroke-width:3}
|
211
399
|
end
|
212
400
|
|
213
401
|
it "should group styles nesting" do
|
214
|
-
img = Rasem::SVGImage.new(100, 100) do
|
402
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
215
403
|
with_style :stroke_width=>3 do
|
216
404
|
with_style :fill=>"black" do
|
217
405
|
circle(0, 0, 10)
|
218
406
|
end
|
219
407
|
end
|
220
408
|
end
|
221
|
-
str =
|
409
|
+
str = ""
|
410
|
+
img.write(str)
|
411
|
+
|
222
412
|
str.should =~ %r{style=}
|
223
413
|
str.should =~ %r{stroke-width:3}
|
224
414
|
str.should =~ %r{fill:black}
|
225
415
|
end
|
226
416
|
|
227
417
|
it "should group styles override nesting" do
|
228
|
-
img = Rasem::SVGImage.new(100, 100) do
|
418
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
229
419
|
with_style :stroke_width=>3 do
|
230
420
|
with_style :stroke_width=>5 do
|
231
421
|
circle(0, 0, 10)
|
232
422
|
end
|
233
423
|
end
|
234
424
|
end
|
235
|
-
str =
|
425
|
+
str = ""
|
426
|
+
img.write(str)
|
427
|
+
|
236
428
|
str.should =~ %r{style=}
|
237
429
|
str.should =~ %r{stroke-width:5}
|
238
430
|
end
|
239
431
|
|
240
432
|
it "should group styles limited effect" do
|
241
|
-
img = Rasem::SVGImage.new(100, 100) do
|
433
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
242
434
|
with_style :stroke_width=>3 do
|
243
435
|
with_style :stroke_width=>5 do
|
244
436
|
end
|
245
437
|
end
|
246
438
|
circle(0, 0, 10)
|
247
439
|
end
|
248
|
-
str =
|
440
|
+
str = ""
|
441
|
+
img.write(str)
|
442
|
+
|
249
443
|
str.should_not =~ %r{stroke-width:3}
|
250
444
|
str.should_not =~ %r{stroke-width:5}
|
251
445
|
end
|
252
|
-
|
446
|
+
|
253
447
|
it "should create a group" do
|
254
|
-
img = Rasem::SVGImage.new(100, 100) do
|
448
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
255
449
|
group :stroke_width=>3 do
|
256
450
|
circle(0, 0, 10)
|
257
451
|
circle(20, 20, 10)
|
258
452
|
end
|
259
453
|
end
|
260
|
-
str =
|
454
|
+
str = ""
|
455
|
+
img.write(str)
|
456
|
+
|
261
457
|
str.should =~ %r{<g .*circle.*circle.*</g>}
|
262
458
|
end
|
263
|
-
|
459
|
+
|
460
|
+
it "should apply transforms to a group" do
|
461
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
462
|
+
group(:scale => 5, :translate => [15,20]) do
|
463
|
+
circle(0, 0, 10)
|
464
|
+
end
|
465
|
+
end
|
466
|
+
str = ""
|
467
|
+
img.write(str)
|
468
|
+
|
469
|
+
str.should =~ %r{scale\(5\)}
|
470
|
+
str.should =~ %r{translate\(15,20\)}
|
471
|
+
end
|
472
|
+
|
264
473
|
it "should update width and height after init" do
|
265
|
-
img = Rasem::SVGImage.new(100, 100) do
|
266
|
-
|
267
|
-
|
474
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
475
|
+
self.width = 200
|
476
|
+
self.height = 300
|
268
477
|
end
|
269
|
-
str =
|
478
|
+
str = ""
|
479
|
+
img.write(str)
|
480
|
+
|
270
481
|
str.should =~ %r{width="200"}
|
271
482
|
str.should =~ %r{height="300"}
|
272
483
|
end
|
273
484
|
|
274
485
|
it "should draw text" do
|
275
|
-
img = Rasem::SVGImage.new(100, 100) do
|
276
|
-
text 10, 20
|
486
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
487
|
+
text 10, 20 do
|
488
|
+
raw "Hello world!"
|
489
|
+
end
|
277
490
|
end
|
278
|
-
str =
|
491
|
+
str = ""
|
492
|
+
img.write(str)
|
493
|
+
|
279
494
|
str.should =~ %r{<text}
|
280
495
|
str.should =~ %r{x="10"}
|
281
496
|
str.should =~ %r{y="20"}
|
282
497
|
str.should =~ %r{Hello world!}
|
283
498
|
end
|
284
499
|
|
285
|
-
it "should draw multiline text" do
|
286
|
-
img = Rasem::SVGImage.new(100, 100) do
|
287
|
-
text 10, 20
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
500
|
+
# it "should draw multiline text" do
|
501
|
+
# img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
502
|
+
# text 10, 20 do
|
503
|
+
# raw "Hello\nworld!"
|
504
|
+
# end
|
505
|
+
# end
|
506
|
+
# str = ""
|
507
|
+
# img.write(str)
|
508
|
+
#
|
509
|
+
# str.should =~ %r{<text.*tspan.*tspan.*</text}
|
510
|
+
# end
|
511
|
+
|
293
512
|
it "should draw text with font" do
|
294
|
-
img = Rasem::SVGImage.new(100, 100) do
|
295
|
-
text 10, 20, "
|
513
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
514
|
+
text 10, 20, "font-family"=>"Times", "font-size"=>24 do
|
515
|
+
raw "Hello World"
|
516
|
+
end
|
296
517
|
end
|
297
|
-
str =
|
518
|
+
str = ""
|
519
|
+
img.write(str)
|
520
|
+
|
298
521
|
str.should =~ %r{font-family="Times"}
|
299
522
|
str.should =~ %r{font-size="24"}
|
300
523
|
end
|
301
524
|
|
302
|
-
it "should
|
303
|
-
|
304
|
-
|
305
|
-
rasem_file.close
|
306
|
-
|
307
|
-
File.should_not be_exists(rasem_file.path+".svg")
|
308
|
-
Rasem::Application.run!(rasem_file.path)
|
309
|
-
|
310
|
-
File.should be_exists(rasem_file.path+".svg")
|
311
|
-
end
|
312
|
-
|
313
|
-
it "should raise an exception for a malformed .rasem file" do
|
314
|
-
rasem_file = Tempfile.new("temp.rasem")
|
315
|
-
rasem_file.puts "@x.asdf"
|
316
|
-
rasem_file.close
|
317
|
-
|
318
|
-
lambda { Rasem::Application.run!(rasem_file.path) }.should raise_error
|
319
|
-
end
|
320
|
-
|
321
|
-
it "should generate only the portion of backtrace in .rasem file" do
|
322
|
-
rasem_file = Tempfile.new("temp.rasem")
|
323
|
-
rasem_file.puts "@x.asdf"
|
324
|
-
rasem_file.close
|
325
|
-
|
326
|
-
begin
|
327
|
-
Rasem::Application.run!(rasem_file.path)
|
328
|
-
rescue Exception => e
|
329
|
-
e.backtrace.should have(1).lines
|
525
|
+
it "should include an image" do
|
526
|
+
img = Rasem::SVGImage.new(:width=>"100", :height=>"100") do
|
527
|
+
image 10, 20, 30, 40, 'image.png'
|
330
528
|
end
|
529
|
+
str = ""
|
530
|
+
img.write(str)
|
531
|
+
|
532
|
+
str.should =~ %r{<image}
|
533
|
+
str.should =~ %r{x="10"}
|
534
|
+
str.should =~ %r{y="20"}
|
535
|
+
str.should =~ %r{width="30"}
|
536
|
+
str.should =~ %r{height="40"}
|
537
|
+
str.should =~ %r{xlink:href="image.png"}
|
331
538
|
end
|
539
|
+
|
332
540
|
end
|