rasem 0.0.0 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/rasem/svg_image.rb +103 -0
- data/spec/rasem_spec.rb +80 -5
- metadata +5 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.1.0
|
@@ -0,0 +1,103 @@
|
|
1
|
+
class Rasem::SVGImage
|
2
|
+
|
3
|
+
def initialize(*args, &block)
|
4
|
+
if args.length == 3
|
5
|
+
@output = create_output(args.shift)
|
6
|
+
else
|
7
|
+
@output = create_output(nil)
|
8
|
+
end
|
9
|
+
|
10
|
+
write_header(*args)
|
11
|
+
if block
|
12
|
+
self.instance_exec(&block)
|
13
|
+
self.close
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# Draw a straight line between the two end points
|
18
|
+
def line(x1, y1, x2, y2)
|
19
|
+
@output << %Q{<line x1="#{x1}" y1="#{y1}" x2="#{x2}" y2="#{y2}"/>}
|
20
|
+
end
|
21
|
+
|
22
|
+
# Draw a circle given a center and a radius
|
23
|
+
def circle(cx, cy, r)
|
24
|
+
@output << %Q{<circle cx="#{cx}" cy="#{cy}" r="#{r}"/>}
|
25
|
+
end
|
26
|
+
|
27
|
+
# Draw a rectangle or rounded rectangle
|
28
|
+
def rectangle(x, y, width, height, rx=nil, ry=rx)
|
29
|
+
@output << %Q{<rect x="#{x}" y="#{y}" width="#{width}" height="#{height}"}
|
30
|
+
@output << %Q{ rx="#{rx}" ry="#{ry}"} if rx && ry
|
31
|
+
@output << %Q{/>}
|
32
|
+
end
|
33
|
+
|
34
|
+
# Draw an circle given a center and two radii
|
35
|
+
def ellipse(cx, cy, rx, ry)
|
36
|
+
@output << %Q{<ellipse cx="#{cx}" cy="#{cy}" rx="#{rx}" ry="#{ry}"/>}
|
37
|
+
end
|
38
|
+
|
39
|
+
def polygon(*args)
|
40
|
+
polything("polygon", *args)
|
41
|
+
end
|
42
|
+
|
43
|
+
def polyline(*args)
|
44
|
+
polything("polyline", *args)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Closes the file. No more drawing is possible after this
|
48
|
+
def close
|
49
|
+
write_close
|
50
|
+
@closed = true
|
51
|
+
end
|
52
|
+
|
53
|
+
def output
|
54
|
+
@output.to_s
|
55
|
+
end
|
56
|
+
|
57
|
+
def closed?
|
58
|
+
@closed
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
# Creates an object for ouput out of an argument
|
63
|
+
def create_output(arg)
|
64
|
+
if arg.nil?
|
65
|
+
""
|
66
|
+
elsif arg.respond_to?(:<<)
|
67
|
+
arg
|
68
|
+
else
|
69
|
+
raise "Illegal output object: #{arg.inspect}"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Writes file header
|
74
|
+
def write_header(width, height)
|
75
|
+
@output << <<-HEADER
|
76
|
+
<?xml version="1.0" standalone="no"?>
|
77
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
78
|
+
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
79
|
+
<svg width="#{width}" height="#{height}" version="1.1"
|
80
|
+
xmlns="http://www.w3.org/2000/svg">
|
81
|
+
HEADER
|
82
|
+
end
|
83
|
+
|
84
|
+
# Write the closing tag of the file
|
85
|
+
def write_close
|
86
|
+
@output << "</svg>"
|
87
|
+
end
|
88
|
+
|
89
|
+
# Draws either a polygon or polyline according to the first parameter
|
90
|
+
def polything(name, *args)
|
91
|
+
return if args.empty?
|
92
|
+
coords = args.flatten
|
93
|
+
raise "Illegal number of coordinates (should be even)" if coords.length.odd?
|
94
|
+
@output << %Q{<#{name} points="}
|
95
|
+
until coords.empty? do
|
96
|
+
x = coords.shift
|
97
|
+
y = coords.shift
|
98
|
+
@output << "#{x},#{y}"
|
99
|
+
@output << " " unless coords.empty?
|
100
|
+
end
|
101
|
+
@output << %{"/>}
|
102
|
+
end
|
103
|
+
end
|
data/spec/rasem_spec.rb
CHANGED
@@ -4,8 +4,8 @@ describe Rasem::SVGImage do
|
|
4
4
|
it "should initialize an empty image" do
|
5
5
|
img = Rasem::SVGImage.new("", 100, 100)
|
6
6
|
str = img.output
|
7
|
-
str.should =~
|
8
|
-
str.should =~
|
7
|
+
str.should =~ %r{width="100"}
|
8
|
+
str.should =~ %r{height="100"}
|
9
9
|
end
|
10
10
|
|
11
11
|
it "should close an image" do
|
@@ -26,7 +26,11 @@ describe Rasem::SVGImage do
|
|
26
26
|
img.line(0, 0, 100, 100)
|
27
27
|
img.close
|
28
28
|
str = img.output
|
29
|
-
str.should =~ %r{<line
|
29
|
+
str.should =~ %r{<line}
|
30
|
+
str.should =~ %r{x1="0"}
|
31
|
+
str.should =~ %r{y1="0"}
|
32
|
+
str.should =~ %r{x2="100"}
|
33
|
+
str.should =~ %r{y2="100"}
|
30
34
|
end
|
31
35
|
|
32
36
|
it "should draw line using a block" do
|
@@ -34,7 +38,11 @@ describe Rasem::SVGImage do
|
|
34
38
|
line(0, 0, 100, 100)
|
35
39
|
end
|
36
40
|
str = img.output
|
37
|
-
str.should =~ %r{<line
|
41
|
+
str.should =~ %r{<line}
|
42
|
+
str.should =~ %r{x1="0"}
|
43
|
+
str.should =~ %r{y1="0"}
|
44
|
+
str.should =~ %r{x2="100"}
|
45
|
+
str.should =~ %r{y2="100"}
|
38
46
|
end
|
39
47
|
|
40
48
|
it "should draw a circle" do
|
@@ -42,7 +50,74 @@ describe Rasem::SVGImage do
|
|
42
50
|
circle(0, 0, 10)
|
43
51
|
end
|
44
52
|
str = img.output
|
45
|
-
str.should =~ %r{<circle
|
53
|
+
str.should =~ %r{<circle}
|
54
|
+
str.should =~ %r{cx="0"}
|
55
|
+
str.should =~ %r{cy="0"}
|
56
|
+
str.should =~ %r{r="10"}
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should draw a rectangle" do
|
60
|
+
img = Rasem::SVGImage.new("", 100, 100) do
|
61
|
+
rectangle(0, 0, 100, 300)
|
62
|
+
end
|
63
|
+
str = img.output
|
64
|
+
str.should =~ %r{<rect}
|
65
|
+
str.should =~ %r{width="100"}
|
66
|
+
str.should =~ %r{height="300"}
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should draw a symmetric round-rectangle" do
|
70
|
+
img = Rasem::SVGImage.new("", 100, 100) do
|
71
|
+
rectangle(0, 0, 100, 300, 20)
|
72
|
+
end
|
73
|
+
str = img.output
|
74
|
+
str.should =~ %r{<rect}
|
75
|
+
str.should =~ %r{width="100"}
|
76
|
+
str.should =~ %r{height="300"}
|
77
|
+
str.should =~ %r{rx="20"}
|
78
|
+
str.should =~ %r{ry="20"}
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should draw a non-symmetric round-rectangle" do
|
82
|
+
img = Rasem::SVGImage.new("", 100, 100) do
|
83
|
+
rectangle(0, 0, 100, 300, 20, 5)
|
84
|
+
end
|
85
|
+
str = img.output
|
86
|
+
str.should =~ %r{<rect}
|
87
|
+
str.should =~ %r{width="100"}
|
88
|
+
str.should =~ %r{height="300"}
|
89
|
+
str.should =~ %r{rx="20"}
|
90
|
+
str.should =~ %r{ry="5"}
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should draw an ellipse" do
|
94
|
+
img = Rasem::SVGImage.new("", 100, 100) do
|
95
|
+
ellipse(0, 0, 100, 300)
|
96
|
+
end
|
97
|
+
str = img.output
|
98
|
+
str.should =~ %r{<ellipse}
|
99
|
+
str.should =~ %r{cx="0"}
|
100
|
+
str.should =~ %r{cy="0"}
|
101
|
+
str.should =~ %r{rx="100"}
|
102
|
+
str.should =~ %r{ry="300"}
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should draw a polygon given an array of points" do
|
106
|
+
img = Rasem::SVGImage.new("", 100, 100) do
|
107
|
+
polygon([[0,0], [1,2], [3,4]])
|
108
|
+
end
|
109
|
+
str = img.output
|
110
|
+
str.should =~ %r{<polygon}
|
111
|
+
str.should =~ %r{points="0,0 1,2 3,4"}
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should draw a polyline given an array of points" do
|
115
|
+
img = Rasem::SVGImage.new("", 100, 100) do
|
116
|
+
polyline([[0,0], [1,2], [3,4]])
|
117
|
+
end
|
118
|
+
str = img.output
|
119
|
+
str.should =~ %r{<polyline}
|
120
|
+
str.should =~ %r{points="0,0 1,2 3,4"}
|
46
121
|
end
|
47
122
|
|
48
123
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
+
- 1
|
7
8
|
- 0
|
8
|
-
|
9
|
-
version: 0.0.0
|
9
|
+
version: 0.1.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Ahmed Eldawy
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-04-
|
17
|
+
date: 2011-04-10 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -93,6 +93,7 @@ files:
|
|
93
93
|
- Rakefile
|
94
94
|
- VERSION
|
95
95
|
- lib/rasem.rb
|
96
|
+
- lib/rasem/svg_image.rb
|
96
97
|
- spec/rasem_spec.rb
|
97
98
|
- spec/spec_helper.rb
|
98
99
|
has_rdoc: true
|
@@ -109,7 +110,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
109
110
|
requirements:
|
110
111
|
- - ">="
|
111
112
|
- !ruby/object:Gem::Version
|
112
|
-
hash: -
|
113
|
+
hash: -2310388374687668377
|
113
114
|
segments:
|
114
115
|
- 0
|
115
116
|
version: "0"
|