ruby_svg_light 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY.md +31 -0
- data/README.md +71 -0
- data/Rakefile +11 -0
- data/examples/text_position.rb +71 -0
- data/examples/text_position.svg +285 -0
- data/lib/ruby_svg_light.rb +35 -15
- data/spec/ruby_svg_light_shapes_spec.rb +70 -0
- data/spec/ruby_svg_light_text_spec.rb +126 -0
- metadata +11 -4
data/HISTORY.md
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
HISTORY/Changelog
|
2
|
+
=================
|
3
|
+
|
4
|
+
0.0.3
|
5
|
+
-----
|
6
|
+
|
7
|
+
Text placemnet options
|
8
|
+
1) Added :text_horizontal_centre=>true
|
9
|
+
2) Added :text_vertical_centre=>true
|
10
|
+
3) Added :text_centre
|
11
|
+
|
12
|
+
Added Specs for basic shapes and text allingment
|
13
|
+
|
14
|
+
0.0.2
|
15
|
+
-----
|
16
|
+
|
17
|
+
Added Rakefile
|
18
|
+
Added support for ellipse
|
19
|
+
|
20
|
+
0.0.1
|
21
|
+
-----
|
22
|
+
|
23
|
+
Initial build with:
|
24
|
+
circle
|
25
|
+
rectangle
|
26
|
+
line
|
27
|
+
text
|
28
|
+
|
29
|
+
Retrival of svg is via to_file or to_s
|
30
|
+
|
31
|
+
|
data/README.md
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
RubySVGLight
|
2
|
+
============
|
3
|
+
|
4
|
+
Install
|
5
|
+
-------
|
6
|
+
|
7
|
+
gem install ruby_svg_light
|
8
|
+
|
9
|
+
Usage
|
10
|
+
-----
|
11
|
+
|
12
|
+
Create a new document (canvas) with RubySVGLight::Document.new then add the shapes you require to it. Finally use to_file to generate the file or call to_s to return the string of the SVG (useful for webapps).
|
13
|
+
|
14
|
+
Shapes available (x and y starting coordinates and cx and cy center of circle and ellipse)
|
15
|
+
|
16
|
+
circle(cx, cy, radius)
|
17
|
+
rectangle(x, y, width, height)
|
18
|
+
line(x, y, width, height)
|
19
|
+
text(x, y, 'text')
|
20
|
+
ellipse(cx, cy, horizontal_radius, vertical_radius)
|
21
|
+
|
22
|
+
All can take a options hash as a final option. Supported options are:
|
23
|
+
|
24
|
+
options[:stroke]
|
25
|
+
options[:stroke_width]
|
26
|
+
options[:fill]
|
27
|
+
options[:font_size]
|
28
|
+
|
29
|
+
Global options can also be set by passing to new or options, as seen in second example.
|
30
|
+
|
31
|
+
|
32
|
+
Examples
|
33
|
+
--------
|
34
|
+
|
35
|
+
require 'ruby_svg_light'
|
36
|
+
a = RubySVGLight::Document.new()
|
37
|
+
a.circle(20,10,10)
|
38
|
+
a.to_file('test.svg')
|
39
|
+
|
40
|
+
Second Example, From the Examples directory
|
41
|
+
|
42
|
+
require 'ruby_svg_light'
|
43
|
+
canvas = RubySVGLight::Document.new
|
44
|
+
canvas.circle(40,40,20)
|
45
|
+
canvas.rectangle(80,20,40,40)
|
46
|
+
canvas.line(20,80,100,0)
|
47
|
+
canvas.line(20,105,100,0)
|
48
|
+
|
49
|
+
#Set Global Options
|
50
|
+
options = {:font_size=>'12px'}
|
51
|
+
canvas.options(options)
|
52
|
+
canvas.text(20,100, 'HelloWorld!')
|
53
|
+
|
54
|
+
#Set Local Options
|
55
|
+
canvas.text(20,130, 'HelloWorld!', {:font_size=>'18px'})
|
56
|
+
|
57
|
+
canvas.to_file('shapes.svg')
|
58
|
+
|
59
|
+
Text placment options
|
60
|
+
|
61
|
+
canvas.text(0,20, 'HelloWorld!', {:text_horizontal_centre=>true})
|
62
|
+
canvas.text(0,0, 'HelloWorld!', {:text_vertical_centre=>true})
|
63
|
+
# Centre Horizontally and Vertically
|
64
|
+
canvas.text(0,40, 'HelloWorld!', {:text_centre=>true})
|
65
|
+
|
66
|
+
|
67
|
+
|
68
|
+
TODO
|
69
|
+
----
|
70
|
+
|
71
|
+
Add support for path
|
data/Rakefile
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'rspec/core/rake_task'
|
2
|
+
|
3
|
+
file_list = FileList['spec/*_spec.rb']
|
4
|
+
|
5
|
+
RSpec::Core::RakeTask.new('spec') do |t|
|
6
|
+
t.pattern = file_list
|
7
|
+
t.rspec_opts = ["--colour", "--format progress", "-p"]
|
8
|
+
end
|
9
|
+
|
10
|
+
desc 'Default: run specs.'
|
11
|
+
task :default => 'spec'
|
@@ -0,0 +1,71 @@
|
|
1
|
+
|
2
|
+
test = false #require 'ruby_svg_light'
|
3
|
+
if not test
|
4
|
+
require '../lib/ruby_svg_light'
|
5
|
+
end
|
6
|
+
|
7
|
+
def drawbox_with_crosshairs(canvas, x, y, width, height)
|
8
|
+
hheight = height/2
|
9
|
+
hwidth = width/2
|
10
|
+
pointer = 20
|
11
|
+
hpointer = pointer/2
|
12
|
+
|
13
|
+
canvas.rectangle(x,y,width,height)
|
14
|
+
canvas.line(x+hwidth-hpointer,y+hheight,pointer,0)
|
15
|
+
canvas.line(x+hwidth,y+hheight-hpointer,0,pointer)
|
16
|
+
end
|
17
|
+
|
18
|
+
canvas = RubySVGLight::Document.new
|
19
|
+
width,height = 100,40
|
20
|
+
x,y = 20,20
|
21
|
+
drawbox_with_crosshairs(canvas, x ,y, width, height)
|
22
|
+
canvas.text( x+(100/2), y+(40/2), 'HelloWorld', {:font_size=>'12px'})
|
23
|
+
# Demo of expected positioning
|
24
|
+
canvas.rectangle(x+width+20,y,width,height, {:fill=>'white'})
|
25
|
+
canvas.rectangle(x+width+20+(width/2),y,width/2,height/2, {:fill=>'green'})
|
26
|
+
|
27
|
+
|
28
|
+
x,y = 20,4*20
|
29
|
+
drawbox_with_crosshairs(canvas, x ,y, 100, 40)
|
30
|
+
canvas.text( x+(100/2), y+(40/2), 'HelloWorld', {:font_size=>'12px',:text_horizontal_top=>true})
|
31
|
+
# Demo of expected positioning
|
32
|
+
canvas.rectangle(x+width+20,y,width,height, {:fill=>'white'})
|
33
|
+
canvas.rectangle(x+width+20+(width/2),y,width/2,height/2, {:fill=>'green'})
|
34
|
+
|
35
|
+
|
36
|
+
x,y = 20,7*20
|
37
|
+
drawbox_with_crosshairs(canvas, x ,y, 100, 40)
|
38
|
+
canvas.text( x+(100/2), y+(40/2), 'HelloWorld', {:font_size=>'12px',:text_horizontal_middle=>true})
|
39
|
+
# Demo of expected positioning
|
40
|
+
canvas.rectangle(x+width+20,y,width,height, {:fill=>'white'})
|
41
|
+
canvas.rectangle(x+width+20+(width/4),y,width/2,height/2, {:fill=>'green'})
|
42
|
+
|
43
|
+
|
44
|
+
x,y = 20,10*20
|
45
|
+
drawbox_with_crosshairs(canvas, x ,y, 100, 40)
|
46
|
+
canvas.text( x+(100/2), y+(40/2), 'HelloWorld', {:font_size=>'12px',:text_horizontal_bottom=>true})
|
47
|
+
# Demo of expected positioning
|
48
|
+
canvas.rectangle(x+width+20,y,width,height, {:fill=>'white'})
|
49
|
+
canvas.rectangle(x+width+20+(width/2),y,width/2,height/2, {:fill=>'green'})
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
x,y = 20,13*20
|
56
|
+
drawbox_with_crosshairs(canvas, x ,y, 100, 40)
|
57
|
+
canvas.text( x+(100/2), y+(40/2), 'HelloWorld', {:font_size=>'12px',:text_vertical_middle=>true})
|
58
|
+
# Demo of expected positioning
|
59
|
+
canvas.rectangle(x+width+20,y,width,height, {:fill=>'white'})
|
60
|
+
canvas.rectangle(x+width+20+(width/2),y+(height/4),width/2,height/2, {:fill=>'green'})
|
61
|
+
|
62
|
+
|
63
|
+
x,y = 20,16*20
|
64
|
+
drawbox_with_crosshairs(canvas, x ,y, 100, 40)
|
65
|
+
canvas.text( x+(100/2), y+(40/2), 'HelloWorld', {:font_size=>'12px',:text_horizontal_middle=>true, :text_vertical_middle=>true})
|
66
|
+
# Demo of expected positioning
|
67
|
+
canvas.rectangle(x+width+20,y,width,height, {:fill=>'white'})
|
68
|
+
canvas.rectangle(x+width+20+(width/4),y+(height/4),width/2,height/2, {:fill=>'green'})
|
69
|
+
|
70
|
+
|
71
|
+
canvas.to_file('text_position.svg')
|
@@ -0,0 +1,285 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
3
|
+
|
4
|
+
<svg
|
5
|
+
width="100%"
|
6
|
+
height="100%"
|
7
|
+
version="1.1"
|
8
|
+
xmlns="http://www.w3.org/2000/svg">
|
9
|
+
|
10
|
+
<rect
|
11
|
+
x="20" y="20"
|
12
|
+
width="100" height="40"
|
13
|
+
fill="white"
|
14
|
+
stroke="#000000"
|
15
|
+
stroke-width="1"
|
16
|
+
/>
|
17
|
+
|
18
|
+
<line
|
19
|
+
x1="60" y1="40"
|
20
|
+
x2="80" y2="40"
|
21
|
+
stroke="#000000"
|
22
|
+
stroke-width="1"
|
23
|
+
/>
|
24
|
+
|
25
|
+
<line
|
26
|
+
x1="70" y1="30"
|
27
|
+
x2="70" y2="50"
|
28
|
+
stroke="#000000"
|
29
|
+
stroke-width="1"
|
30
|
+
/>
|
31
|
+
|
32
|
+
<text
|
33
|
+
x="70" y="40"
|
34
|
+
font-size="12px"
|
35
|
+
fill="#000000"
|
36
|
+
font-family="Sans"
|
37
|
+
>HelloWorld
|
38
|
+
</text>
|
39
|
+
<rect
|
40
|
+
x="140" y="20"
|
41
|
+
width="100" height="40"
|
42
|
+
fill="white"
|
43
|
+
stroke="#000000"
|
44
|
+
stroke-width="1"
|
45
|
+
/>
|
46
|
+
|
47
|
+
<rect
|
48
|
+
x="190" y="20"
|
49
|
+
width="50" height="20"
|
50
|
+
fill="green"
|
51
|
+
stroke="#000000"
|
52
|
+
stroke-width="1"
|
53
|
+
/>
|
54
|
+
|
55
|
+
<rect
|
56
|
+
x="20" y="80"
|
57
|
+
width="100" height="40"
|
58
|
+
fill="white"
|
59
|
+
stroke="#000000"
|
60
|
+
stroke-width="1"
|
61
|
+
/>
|
62
|
+
|
63
|
+
<line
|
64
|
+
x1="60" y1="100"
|
65
|
+
x2="80" y2="100"
|
66
|
+
stroke="#000000"
|
67
|
+
stroke-width="1"
|
68
|
+
/>
|
69
|
+
|
70
|
+
<line
|
71
|
+
x1="70" y1="90"
|
72
|
+
x2="70" y2="110"
|
73
|
+
stroke="#000000"
|
74
|
+
stroke-width="1"
|
75
|
+
/>
|
76
|
+
|
77
|
+
<text
|
78
|
+
x="70" y="100"
|
79
|
+
style="text-anchor: top; "
|
80
|
+
font-size="12px"
|
81
|
+
fill="#000000"
|
82
|
+
font-family="Sans"
|
83
|
+
>HelloWorld
|
84
|
+
</text>
|
85
|
+
<rect
|
86
|
+
x="140" y="80"
|
87
|
+
width="100" height="40"
|
88
|
+
fill="white"
|
89
|
+
stroke="#000000"
|
90
|
+
stroke-width="1"
|
91
|
+
/>
|
92
|
+
|
93
|
+
<rect
|
94
|
+
x="190" y="80"
|
95
|
+
width="50" height="20"
|
96
|
+
fill="green"
|
97
|
+
stroke="#000000"
|
98
|
+
stroke-width="1"
|
99
|
+
/>
|
100
|
+
|
101
|
+
<rect
|
102
|
+
x="20" y="140"
|
103
|
+
width="100" height="40"
|
104
|
+
fill="white"
|
105
|
+
stroke="#000000"
|
106
|
+
stroke-width="1"
|
107
|
+
/>
|
108
|
+
|
109
|
+
<line
|
110
|
+
x1="60" y1="160"
|
111
|
+
x2="80" y2="160"
|
112
|
+
stroke="#000000"
|
113
|
+
stroke-width="1"
|
114
|
+
/>
|
115
|
+
|
116
|
+
<line
|
117
|
+
x1="70" y1="150"
|
118
|
+
x2="70" y2="170"
|
119
|
+
stroke="#000000"
|
120
|
+
stroke-width="1"
|
121
|
+
/>
|
122
|
+
|
123
|
+
<text
|
124
|
+
x="70" y="160"
|
125
|
+
style="text-anchor: middle; "
|
126
|
+
font-size="12px"
|
127
|
+
fill="#000000"
|
128
|
+
font-family="Sans"
|
129
|
+
>HelloWorld
|
130
|
+
</text>
|
131
|
+
<rect
|
132
|
+
x="140" y="140"
|
133
|
+
width="100" height="40"
|
134
|
+
fill="white"
|
135
|
+
stroke="#000000"
|
136
|
+
stroke-width="1"
|
137
|
+
/>
|
138
|
+
|
139
|
+
<rect
|
140
|
+
x="165" y="140"
|
141
|
+
width="50" height="20"
|
142
|
+
fill="green"
|
143
|
+
stroke="#000000"
|
144
|
+
stroke-width="1"
|
145
|
+
/>
|
146
|
+
|
147
|
+
<rect
|
148
|
+
x="20" y="200"
|
149
|
+
width="100" height="40"
|
150
|
+
fill="white"
|
151
|
+
stroke="#000000"
|
152
|
+
stroke-width="1"
|
153
|
+
/>
|
154
|
+
|
155
|
+
<line
|
156
|
+
x1="60" y1="220"
|
157
|
+
x2="80" y2="220"
|
158
|
+
stroke="#000000"
|
159
|
+
stroke-width="1"
|
160
|
+
/>
|
161
|
+
|
162
|
+
<line
|
163
|
+
x1="70" y1="210"
|
164
|
+
x2="70" y2="230"
|
165
|
+
stroke="#000000"
|
166
|
+
stroke-width="1"
|
167
|
+
/>
|
168
|
+
|
169
|
+
<text
|
170
|
+
x="70" y="220"
|
171
|
+
style="text-anchor: bottom; "
|
172
|
+
font-size="12px"
|
173
|
+
fill="#000000"
|
174
|
+
font-family="Sans"
|
175
|
+
>HelloWorld
|
176
|
+
</text>
|
177
|
+
<rect
|
178
|
+
x="140" y="200"
|
179
|
+
width="100" height="40"
|
180
|
+
fill="white"
|
181
|
+
stroke="#000000"
|
182
|
+
stroke-width="1"
|
183
|
+
/>
|
184
|
+
|
185
|
+
<rect
|
186
|
+
x="190" y="200"
|
187
|
+
width="50" height="20"
|
188
|
+
fill="green"
|
189
|
+
stroke="#000000"
|
190
|
+
stroke-width="1"
|
191
|
+
/>
|
192
|
+
|
193
|
+
<rect
|
194
|
+
x="20" y="260"
|
195
|
+
width="100" height="40"
|
196
|
+
fill="white"
|
197
|
+
stroke="#000000"
|
198
|
+
stroke-width="1"
|
199
|
+
/>
|
200
|
+
|
201
|
+
<line
|
202
|
+
x1="60" y1="280"
|
203
|
+
x2="80" y2="280"
|
204
|
+
stroke="#000000"
|
205
|
+
stroke-width="1"
|
206
|
+
/>
|
207
|
+
|
208
|
+
<line
|
209
|
+
x1="70" y1="270"
|
210
|
+
x2="70" y2="290"
|
211
|
+
stroke="#000000"
|
212
|
+
stroke-width="1"
|
213
|
+
/>
|
214
|
+
|
215
|
+
<text
|
216
|
+
x="70" y="280"
|
217
|
+
style="dominant-baseline: central; "
|
218
|
+
font-size="12px"
|
219
|
+
fill="#000000"
|
220
|
+
font-family="Sans"
|
221
|
+
>HelloWorld
|
222
|
+
</text>
|
223
|
+
<rect
|
224
|
+
x="140" y="260"
|
225
|
+
width="100" height="40"
|
226
|
+
fill="white"
|
227
|
+
stroke="#000000"
|
228
|
+
stroke-width="1"
|
229
|
+
/>
|
230
|
+
|
231
|
+
<rect
|
232
|
+
x="190" y="270"
|
233
|
+
width="50" height="20"
|
234
|
+
fill="green"
|
235
|
+
stroke="#000000"
|
236
|
+
stroke-width="1"
|
237
|
+
/>
|
238
|
+
|
239
|
+
<rect
|
240
|
+
x="20" y="320"
|
241
|
+
width="100" height="40"
|
242
|
+
fill="white"
|
243
|
+
stroke="#000000"
|
244
|
+
stroke-width="1"
|
245
|
+
/>
|
246
|
+
|
247
|
+
<line
|
248
|
+
x1="60" y1="340"
|
249
|
+
x2="80" y2="340"
|
250
|
+
stroke="#000000"
|
251
|
+
stroke-width="1"
|
252
|
+
/>
|
253
|
+
|
254
|
+
<line
|
255
|
+
x1="70" y1="330"
|
256
|
+
x2="70" y2="350"
|
257
|
+
stroke="#000000"
|
258
|
+
stroke-width="1"
|
259
|
+
/>
|
260
|
+
|
261
|
+
<text
|
262
|
+
x="70" y="340"
|
263
|
+
style="dominant-baseline: central; text-anchor: middle; "
|
264
|
+
font-size="12px"
|
265
|
+
fill="#000000"
|
266
|
+
font-family="Sans"
|
267
|
+
>HelloWorld
|
268
|
+
</text>
|
269
|
+
<rect
|
270
|
+
x="140" y="320"
|
271
|
+
width="100" height="40"
|
272
|
+
fill="white"
|
273
|
+
stroke="#000000"
|
274
|
+
stroke-width="1"
|
275
|
+
/>
|
276
|
+
|
277
|
+
<rect
|
278
|
+
x="165" y="330"
|
279
|
+
width="50" height="20"
|
280
|
+
fill="green"
|
281
|
+
stroke="#000000"
|
282
|
+
stroke-width="1"
|
283
|
+
/>
|
284
|
+
|
285
|
+
</svg>
|
data/lib/ruby_svg_light.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
|
2
2
|
module RubySVGLight
|
3
|
-
VERSION = '0.0.
|
3
|
+
VERSION = '0.0.3'
|
4
4
|
|
5
5
|
class Document
|
6
6
|
attr_reader :body
|
@@ -51,7 +51,6 @@ module RubySVGLight
|
|
51
51
|
fill="#{local_options[:fill]}"/>
|
52
52
|
}
|
53
53
|
|
54
|
-
#The call below should be in method missing add_[circle|line|rectangle]
|
55
54
|
update_size(x+radius, y+radius)
|
56
55
|
@body << text
|
57
56
|
end
|
@@ -103,22 +102,45 @@ module RubySVGLight
|
|
103
102
|
centre_text = "text-anchor:middle; dominant-baseline:central;"
|
104
103
|
local_options = calc_local_options(opts)
|
105
104
|
|
105
|
+
text_vertical_centre = local_options[:text_centre] ||
|
106
|
+
local_options[:text_vertical_middle] ||
|
107
|
+
local_options[:text_vertical_centre] ||
|
108
|
+
local_options[:text_v_middle] ||
|
109
|
+
local_options[:text_v_centre]
|
110
|
+
|
111
|
+
text_horizontal_centre = local_options[:text_centre] ||
|
112
|
+
local_options[:text_horizontal_middle] ||
|
113
|
+
local_options[:text_horizontal_centre] ||
|
114
|
+
local_options[:text_h_middle] ||
|
115
|
+
local_options[:text_h_centre]
|
116
|
+
|
117
|
+
|
118
|
+
style = ""
|
119
|
+
style << "dominant-baseline: central; " if text_vertical_centre
|
120
|
+
|
121
|
+
style << "text-anchor: top; " if local_options[:text_horizontal_top]
|
122
|
+
style << "text-anchor: middle; " if text_horizontal_centre
|
123
|
+
style << "text-anchor: bottom; " if local_options[:text_horizontal_bottom]
|
124
|
+
|
106
125
|
|
107
126
|
#Stroke is outline
|
108
127
|
#fill is normal font. ie for text fill gets stroke colour
|
109
128
|
text = %{<text
|
110
|
-
x="#{x}" y="#{y}"
|
129
|
+
x="#{x}" y="#{y}" }
|
130
|
+
|
131
|
+
text << %{
|
132
|
+
style="#{style}" } unless style == ""
|
133
|
+
|
134
|
+
text << %{
|
111
135
|
font-size="#{local_options[:font_size]}"
|
112
136
|
fill="#{local_options[:stroke]}"
|
113
137
|
font-family="Sans"
|
114
138
|
>#{input_text}
|
115
139
|
</text>
|
116
140
|
}
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
update_size(x, y)
|
121
|
-
@body << text
|
141
|
+
#Do not know height or width of text only the anchor
|
142
|
+
update_size(x, y)
|
143
|
+
@body << text
|
122
144
|
end
|
123
145
|
|
124
146
|
def options(opts={})
|
@@ -172,12 +194,6 @@ module RubySVGLight
|
|
172
194
|
end
|
173
195
|
|
174
196
|
|
175
|
-
#def finalise
|
176
|
-
# #Maybe add the initial and closing things here so we are just noramlly dealing drawn components
|
177
|
-
# @body.insert(0, header)
|
178
|
-
# @body.insert(-1, footer)
|
179
|
-
#end
|
180
|
-
|
181
197
|
# to_file includes header and footers for a complete svg file
|
182
198
|
def to_file( filename )
|
183
199
|
File.open(filename, 'w') do |f|
|
@@ -213,7 +229,11 @@ end
|
|
213
229
|
|
214
230
|
|
215
231
|
if $0 == __FILE__
|
232
|
+
filename = 'test.svg'
|
233
|
+
|
216
234
|
a = RubySVGLight::Document.new()
|
217
235
|
a.circle(20,10,10)
|
218
|
-
a.to_file(
|
236
|
+
a.to_file( filename )
|
237
|
+
|
238
|
+
puts "Created #{filename}"
|
219
239
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
def shape_contains( shape )
|
4
|
+
#This has been split over 2 lines to fix a bug in my syntax highlighter :(
|
5
|
+
regex = %{<svg[\\w\\W]*>[\\W]*<#{shape}[\\w\\W]*\/>[\\W]*<\/svg>}
|
6
|
+
return /#{regex}/
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
describe RubySVGLight do
|
12
|
+
|
13
|
+
#Hooks
|
14
|
+
before( :each ) do
|
15
|
+
@canvas = RubySVGLight::Document.new()
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
#Tests
|
21
|
+
it "Draw a circle x=10, y=20, r=30" do
|
22
|
+
@canvas.circle(10,20,30)
|
23
|
+
|
24
|
+
@canvas.to_s.should match shape_contains( 'circle' )
|
25
|
+
@canvas.to_s.should include %{cx="10"}
|
26
|
+
@canvas.to_s.should include %{cy="20"}
|
27
|
+
@canvas.to_s.should include %{r="30"}
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
it "Draw a rectangle x=10, y=20, width=30, height=40" do
|
33
|
+
@canvas.rectangle(10,20,30,40)
|
34
|
+
|
35
|
+
@canvas.to_s.should match shape_contains( 'rect' )
|
36
|
+
@canvas.to_s.should include %{x="10"}
|
37
|
+
@canvas.to_s.should include %{y="20"}
|
38
|
+
@canvas.to_s.should include %{width="30"}
|
39
|
+
@canvas.to_s.should include %{height="40"}
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
it "Draw a line x=10, y=20, width=30, height=40" do
|
45
|
+
@canvas.line(10,20,30,40)
|
46
|
+
|
47
|
+
#SVG lines are drawn specifying start and end coordinates.
|
48
|
+
#RubySVGLite uses start coordinates and height width to make it consitent with other shapes.
|
49
|
+
@canvas.to_s.should match shape_contains( 'line' )
|
50
|
+
@canvas.to_s.should include %{x1="10"}
|
51
|
+
@canvas.to_s.should include %{y1="20"}
|
52
|
+
@canvas.to_s.should include %{x2="#{10+30}"}
|
53
|
+
@canvas.to_s.should include %{y2="#{20+40}"}
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
it "Draw an ellipse x=10, y=20, width=30, height=40" do
|
59
|
+
@canvas.ellipse(10,20,30,40)
|
60
|
+
|
61
|
+
@canvas.to_s.should match shape_contains( 'ellipse' )
|
62
|
+
@canvas.to_s.should include %{cx="10"}
|
63
|
+
@canvas.to_s.should include %{cy="20"}
|
64
|
+
@canvas.to_s.should include %{rx="30"}
|
65
|
+
@canvas.to_s.should include %{ry="40"}
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
|
@@ -0,0 +1,126 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
def style_contains( format )
|
4
|
+
#This has been split over 2 lines to fix a bug in my syntax highlighter :(
|
5
|
+
regex = %{style=\"(.*;)* ?#{format};(.*;)* ? \"}
|
6
|
+
return /#{regex}/
|
7
|
+
end
|
8
|
+
|
9
|
+
describe RubySVGLight do
|
10
|
+
|
11
|
+
#Hooks
|
12
|
+
before( :each ) do
|
13
|
+
@canvas = RubySVGLight::Document.new()
|
14
|
+
# 10 Random characters for test string changes for each test
|
15
|
+
@text = (0...10).map{ (('A'..'Z').to_a + ('a'..'z').to_a)[rand(52)] }.join
|
16
|
+
end
|
17
|
+
|
18
|
+
after( :each ) do
|
19
|
+
#Verify that actual text was included regardless of options used
|
20
|
+
@canvas.to_s.should include ">#{@text}\n </text>"
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
#Tests
|
28
|
+
it "Text, default font size" do
|
29
|
+
@canvas.text( 0, 0, @text)
|
30
|
+
|
31
|
+
@canvas.to_s.should include %{font-size="24px"}
|
32
|
+
end
|
33
|
+
|
34
|
+
it "Text, set fontsize with local option" do
|
35
|
+
@canvas.text( 0, 0, @text, {:font_size=>'100px'})
|
36
|
+
|
37
|
+
@canvas.to_s.should include %{font-size="100px"}
|
38
|
+
end
|
39
|
+
|
40
|
+
it "Text, set fontsize with global option" do
|
41
|
+
@canvas.options( {:font_size=>'100px'} )
|
42
|
+
@canvas.text( 0, 0, @text)
|
43
|
+
|
44
|
+
@canvas.to_s.should include %{font-size="100px"}
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
# The 4 ways to vertically centre text
|
52
|
+
it "Text, Vertical centre with :text_vertical_centre" do
|
53
|
+
@canvas.text( 0, 0, @text, {:text_vertical_centre=>true})
|
54
|
+
|
55
|
+
@canvas.to_s.should match style_contains("dominant-baseline: central")
|
56
|
+
end
|
57
|
+
|
58
|
+
it "Text, Vertical centre with :text_vertical_middle" do
|
59
|
+
@canvas.text( 0, 0, @text, {:text_vertical_middle=>true})
|
60
|
+
|
61
|
+
@canvas.to_s.should match style_contains("dominant-baseline: central")
|
62
|
+
end
|
63
|
+
|
64
|
+
it "Text, Vertical centre with :text_v_centre" do
|
65
|
+
@canvas.text( 0, 0, @text, {:text_v_centre=>true})
|
66
|
+
|
67
|
+
@canvas.to_s.should match style_contains("dominant-baseline: central")
|
68
|
+
end
|
69
|
+
|
70
|
+
it "Text, Vertical centre with :text_v_middle" do
|
71
|
+
@canvas.text( 0, 0, @text, {:text_v_middle=>true})
|
72
|
+
|
73
|
+
@canvas.to_s.should match style_contains("dominant-baseline: central")
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
|
80
|
+
# The 4 ways to horizontally centre text
|
81
|
+
it "Text, Horizontal centre with :text_horizontal_centre" do
|
82
|
+
@canvas.text( 0, 0, @text, {:text_horizontal_centre=>true})
|
83
|
+
|
84
|
+
@canvas.to_s.should match style_contains("text-anchor: middle")
|
85
|
+
end
|
86
|
+
|
87
|
+
it "Text, Horizontal centre with :text_horizontal_middle" do
|
88
|
+
@canvas.text( 0, 0, @text, {:text_horizontal_middle=>true})
|
89
|
+
|
90
|
+
@canvas.to_s.should match style_contains("text-anchor: middle")
|
91
|
+
end
|
92
|
+
it "Text, Horizontal centre with :text_h_centre" do
|
93
|
+
@canvas.text( 0, 0, @text, {:text_h_centre=>true})
|
94
|
+
|
95
|
+
@canvas.to_s.should match style_contains("text-anchor: middle")
|
96
|
+
end
|
97
|
+
|
98
|
+
it "Text, Horizontal centre with :text_h_middle" do
|
99
|
+
@canvas.text( 0, 0, @text, {:text_h_middle=>true})
|
100
|
+
|
101
|
+
@canvas.to_s.should match style_contains("text-anchor: middle")
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
#Vertical and Horizontal centre text
|
109
|
+
it "Text, Horizintal and Vertical centre with :text_horizontal_centre and :text_vertical_centre" do
|
110
|
+
@canvas.text( 0, 0, @text, {:text_horizontal_centre=>true,:text_vertical_centre=>true})
|
111
|
+
|
112
|
+
@canvas.to_s.should match style_contains("dominant-baseline: central")
|
113
|
+
@canvas.to_s.should match style_contains("text-anchor: middle")
|
114
|
+
end
|
115
|
+
|
116
|
+
it "Text, Horizintal and Vertical centre with :text_centre" do
|
117
|
+
@canvas.text( 0, 0, @text, {:text_centre=>true})
|
118
|
+
|
119
|
+
@canvas.to_s.should match style_contains("dominant-baseline: central")
|
120
|
+
@canvas.to_s.should match style_contains("text-anchor: middle")
|
121
|
+
end
|
122
|
+
|
123
|
+
|
124
|
+
end
|
125
|
+
|
126
|
+
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_svg_light
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Morgan Prior
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-06-04 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -29,11 +29,18 @@ extra_rdoc_files: []
|
|
29
29
|
|
30
30
|
files:
|
31
31
|
- LICENSE.rtf
|
32
|
+
- README.md
|
33
|
+
- HISTORY.md
|
34
|
+
- Rakefile
|
32
35
|
- examples/shapes.rb
|
33
36
|
- examples/shapes.svg
|
37
|
+
- examples/text_position.rb
|
38
|
+
- examples/text_position.svg
|
34
39
|
- lib/ruby_svg.rb
|
35
40
|
- lib/ruby_svg.rb.original
|
36
41
|
- lib/ruby_svg_light.rb
|
42
|
+
- spec/ruby_svg_light_shapes_spec.rb
|
43
|
+
- spec/ruby_svg_light_text_spec.rb
|
37
44
|
- spec/ruby_svg_light_width_spec.rb
|
38
45
|
- spec/spec_helper.rb
|
39
46
|
has_rdoc: true
|