savage 1.1.5 → 1.1.6
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/VERSION +1 -1
- data/lib/savage/parser.rb +10 -8
- data/savage.gemspec +3 -3
- data/spec/savage/parser_spec.rb +22 -0
- metadata +5 -5
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.6
|
data/lib/savage/parser.rb
CHANGED
@@ -7,8 +7,8 @@ module Savage
|
|
7
7
|
raise TypeError if (subpaths.empty?)
|
8
8
|
path = Path.new
|
9
9
|
path.subpaths = []
|
10
|
-
subpaths.
|
11
|
-
path.subpaths << parse_subpath(subpath)
|
10
|
+
subpaths.each_with_index do |subpath, i|
|
11
|
+
path.subpaths << parse_subpath(subpath, i == 0)
|
12
12
|
end
|
13
13
|
path
|
14
14
|
end
|
@@ -27,29 +27,31 @@ module Savage
|
|
27
27
|
subpaths
|
28
28
|
end
|
29
29
|
|
30
|
-
def parse_subpath(parsable)
|
30
|
+
def parse_subpath(parsable, force_absolute=false)
|
31
31
|
subpath = SubPath.new
|
32
|
-
subpath.directions = extract_directions parsable
|
32
|
+
subpath.directions = extract_directions parsable, force_absolute
|
33
33
|
subpath
|
34
34
|
end
|
35
35
|
|
36
|
-
def extract_directions(parsable)
|
36
|
+
def extract_directions(parsable, force_absolute=false)
|
37
37
|
directions = []
|
38
|
+
i = 0
|
38
39
|
parsable.scan /[MmLlHhVvQqCcTtSsAaZz](?:\d|[eE.,+-]|\W)*/m do |match_group|
|
39
|
-
direction = build_direction
|
40
|
+
direction = build_direction $&, force_absolute && i == 0
|
40
41
|
if direction.kind_of?(Array)
|
41
42
|
directions.concat direction
|
42
43
|
else
|
43
44
|
directions << direction
|
44
45
|
end
|
46
|
+
i += 1
|
45
47
|
end
|
46
48
|
directions
|
47
49
|
end
|
48
50
|
|
49
|
-
def build_direction(parsable)
|
51
|
+
def build_direction(parsable, force_absolute=false)
|
50
52
|
directions = []
|
51
53
|
coordinates = extract_coordinates parsable
|
52
|
-
absolute = (parsable[0,1] == parsable[0,1].upcase) ? true : false
|
54
|
+
absolute = (force_absolute || parsable[0,1] == parsable[0,1].upcase) ? true : false
|
53
55
|
recurse_code = parsable[0,1]
|
54
56
|
|
55
57
|
# we need to handle this separately, since ClosePath doesn't take any coordinates
|
data/savage.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "savage"
|
8
|
-
s.version = "1.1.
|
8
|
+
s.version = "1.1.6"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jeremy Holland"]
|
12
|
-
s.date = "
|
12
|
+
s.date = "2012-08-02"
|
13
13
|
s.description = "A little gem for extracting and manipulating SVG vector path data."
|
14
14
|
s.email = "jeremy@jeremypholland.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -62,7 +62,7 @@ Gem::Specification.new do |s|
|
|
62
62
|
]
|
63
63
|
s.homepage = "http://github.com/awebneck/savage"
|
64
64
|
s.require_paths = ["lib"]
|
65
|
-
s.rubygems_version = "1.8.
|
65
|
+
s.rubygems_version = "1.8.15"
|
66
66
|
s.summary = "A little library to manipulate SVG path data"
|
67
67
|
|
68
68
|
if s.respond_to? :specification_version then
|
data/spec/savage/parser_spec.rb
CHANGED
@@ -12,6 +12,7 @@ describe Parser do
|
|
12
12
|
lambda { Parser.parse("M100 200") }.should_not raise_error
|
13
13
|
lambda { Parser.parse(2) }.should raise_error
|
14
14
|
end
|
15
|
+
|
15
16
|
it 'should return a path object with one subpath containing one move_to when the string is only a move_to command' do
|
16
17
|
path = Parser.parse("M100 200")
|
17
18
|
path.class.should == Path
|
@@ -20,6 +21,15 @@ describe Parser do
|
|
20
21
|
path.subpaths.last.directions.last.class.should == Directions::MoveTo
|
21
22
|
end
|
22
23
|
|
24
|
+
it 'should return a path object with one subpath containing an absolute move_to even when the string starts with a relative move_to command' do
|
25
|
+
path = Parser.parse("m100 200")
|
26
|
+
path.class.should == Path
|
27
|
+
path.subpaths.length.should == 1
|
28
|
+
path.subpaths.last.directions.length.should == 1
|
29
|
+
path.subpaths.last.directions.last.class.should == Directions::MoveTo
|
30
|
+
path.subpaths.last.directions.last.should be_absolute
|
31
|
+
end
|
32
|
+
|
23
33
|
it 'should handle comma separated coordinates' do
|
24
34
|
path = Parser.parse("M100,200")
|
25
35
|
path.class.should == Path
|
@@ -37,6 +47,7 @@ describe Parser do
|
|
37
47
|
path.subpaths.last.directions[1].should_not be_absolute
|
38
48
|
path.subpaths.last.directions[1].class.should == Directions::LineTo
|
39
49
|
end
|
50
|
+
|
40
51
|
it 'should return a path object with one subpath containing a move_to and a horizontal_to when the string is a move_to command followed by a horizontal_to command' do
|
41
52
|
path = Parser.parse("M100 200H-342.65")
|
42
53
|
path.class.should == Path
|
@@ -45,6 +56,7 @@ describe Parser do
|
|
45
56
|
path.subpaths.last.directions[0].class.should == Directions::MoveTo
|
46
57
|
path.subpaths.last.directions[1].class.should == Directions::HorizontalTo
|
47
58
|
end
|
59
|
+
|
48
60
|
it 'should return a path object with one subpath containing a move_to and a vertical_to when the string is a move_to command followed by a vertical_to command' do
|
49
61
|
path = Parser.parse("M100 200V-342.65")
|
50
62
|
path.class.should == Path
|
@@ -53,6 +65,7 @@ describe Parser do
|
|
53
65
|
path.subpaths.last.directions[0].class.should == Directions::MoveTo
|
54
66
|
path.subpaths.last.directions[1].class.should == Directions::VerticalTo
|
55
67
|
end
|
68
|
+
|
56
69
|
it 'should return a path object with one subpath containing a move_to and a full cubic_curve_to when the string is a move_to command followed by a full cubic_curve_to command' do
|
57
70
|
path = Parser.parse("M100 200C-342.65-32 1.233-34 255 12")
|
58
71
|
path.class.should == Path
|
@@ -62,6 +75,7 @@ describe Parser do
|
|
62
75
|
path.subpaths.last.directions[1].class.should == Directions::CubicCurveTo
|
63
76
|
path.subpaths.last.directions[1].command_code.should == 'C'
|
64
77
|
end
|
78
|
+
|
65
79
|
it 'should return a path object with one subpath containing a move_to and a short cubic_curve_to when the string is a move_to command followed by a short cubic_curve_to command' do
|
66
80
|
path = Parser.parse("M100 200S1.233-34 255 12")
|
67
81
|
path.class.should == Path
|
@@ -71,6 +85,7 @@ describe Parser do
|
|
71
85
|
path.subpaths.last.directions[1].class.should == Directions::CubicCurveTo
|
72
86
|
path.subpaths.last.directions[1].command_code.should == 'S'
|
73
87
|
end
|
88
|
+
|
74
89
|
it 'should return a path object with one subpath containing a move_to and a full quadratic_curve_to when the string is a move_to command followed by a full quadratic_curve_to command' do
|
75
90
|
path = Parser.parse("M100 200Q1.233-34 255 12")
|
76
91
|
path.class.should == Path
|
@@ -80,6 +95,7 @@ describe Parser do
|
|
80
95
|
path.subpaths.last.directions[1].class.should == Directions::QuadraticCurveTo
|
81
96
|
path.subpaths.last.directions[1].command_code.should == 'Q'
|
82
97
|
end
|
98
|
+
|
83
99
|
it 'should return a path object with one subpath containing a move_to and a short quadratic_curve_to when the string is a move_to command followed by a short quadratic_curve_to command' do
|
84
100
|
path = Parser.parse("M100 200T255 12")
|
85
101
|
path.class.should == Path
|
@@ -98,6 +114,7 @@ describe Parser do
|
|
98
114
|
path.subpaths.last.directions[1].class.should == Directions::ArcTo
|
99
115
|
path.subpaths.last.directions[1].command_code.should == 'A'
|
100
116
|
end
|
117
|
+
|
101
118
|
it 'should return a path object with one subpath containing a move_to, a line_to, and a close_path command when the string is a move_to command followed by a line_to followed by a close_path command' do
|
102
119
|
path = Parser.parse("M100 200l-342.65 21Z")
|
103
120
|
path.class.should == Path
|
@@ -121,6 +138,7 @@ describe Parser do
|
|
121
138
|
path.subpaths.last.directions[1].target.x.should == 300
|
122
139
|
path.subpaths.last.directions[1].target.y.should == 400
|
123
140
|
end
|
141
|
+
|
124
142
|
it 'should return a path object with one subpath containing two line_to directions when the string is a line_to command followed by implicit coordinates' do
|
125
143
|
path = Parser.parse("L100 200 300 400")
|
126
144
|
path.class.should == Path
|
@@ -133,6 +151,7 @@ describe Parser do
|
|
133
151
|
path.subpaths.last.directions[1].target.x.should == 300
|
134
152
|
path.subpaths.last.directions[1].target.y.should == 400
|
135
153
|
end
|
154
|
+
|
136
155
|
it 'should return a path object with one subpath containing a move_to and a line_to direction when the string is a move_to command followed by implicit coordinates' do
|
137
156
|
path = Parser.parse("M100 200 300 400")
|
138
157
|
path.class.should == Path
|
@@ -145,6 +164,7 @@ describe Parser do
|
|
145
164
|
path.subpaths.last.directions[1].target.x.should == 300
|
146
165
|
path.subpaths.last.directions[1].target.y.should == 400
|
147
166
|
end
|
167
|
+
|
148
168
|
it 'should return a path object with one subpath containing a move_to and two line_to directions when the string is a move_to command followed by more than one set of implicit coordinates' do
|
149
169
|
path = Parser.parse("M100 200 300 400 500 600 ")
|
150
170
|
path.class.should == Path
|
@@ -160,6 +180,7 @@ describe Parser do
|
|
160
180
|
path.subpaths.last.directions[2].target.x.should == 500
|
161
181
|
path.subpaths.last.directions[2].target.y.should == 600
|
162
182
|
end
|
183
|
+
|
163
184
|
it 'should return a path object with two subpaths containing one line_to directions each when the string is two move_to commands each followed by a line_to command' do
|
164
185
|
path = Parser.parse("M100 200 332 -12.3M594 230-423 11.1")
|
165
186
|
path.class.should == Path
|
@@ -178,6 +199,7 @@ describe Parser do
|
|
178
199
|
path.subpaths[1].directions[1].target.x.should == -423
|
179
200
|
path.subpaths[1].directions[1].target.y.should == 11.1
|
180
201
|
end
|
202
|
+
|
181
203
|
it 'should generate the same string given to it (assuming float values are used), if not changed in the interim' do
|
182
204
|
path_string = "M100.0 200.0A255.0 12.0-123.0 1 0 23.0-93.4L100.0 200.0 300.0 400.0Q1.233-34.0 255.0 12.0T255.0 12.0H-342.65Z"
|
183
205
|
path = Parser.parse(path_string)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: savage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-08-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &8559400 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: 2.3.0
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *8559400
|
25
25
|
description: A little gem for extracting and manipulating SVG vector path data.
|
26
26
|
email: jeremy@jeremypholland.com
|
27
27
|
executables: []
|
@@ -92,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
92
92
|
version: '0'
|
93
93
|
requirements: []
|
94
94
|
rubyforge_project:
|
95
|
-
rubygems_version: 1.8.
|
95
|
+
rubygems_version: 1.8.15
|
96
96
|
signing_key:
|
97
97
|
specification_version: 3
|
98
98
|
summary: A little library to manipulate SVG path data
|