savage 1.1.3 → 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.3
1
+ 1.1.4
data/lib/savage/parser.rb CHANGED
@@ -18,7 +18,7 @@ module Savage
18
18
  subpaths = []
19
19
  if move_index = parsable.index(/[Mm]/)
20
20
  subpaths << parsable[0...move_index] if move_index > 0
21
- parsable.scan /[Mm](?:\d|[.,-]|[LlHhVvQqCcTtSsAaZz]|\W)+/m do |match_group|
21
+ parsable.scan /[Mm](?:\d|[eE.,-]|[LlHhVvQqCcTtSsAaZz]|\W)+/m do |match_group|
22
22
  subpaths << $&
23
23
  end
24
24
  else
@@ -35,7 +35,7 @@ module Savage
35
35
 
36
36
  def extract_directions(parsable)
37
37
  directions = []
38
- parsable.scan /[MmLlHhVvQqCcTtSsAaZz](?:\d|[.,-]|\W)*/m do |match_group|
38
+ parsable.scan /[MmLlHhVvQqCcTtSsAaZz](?:\d|[eE.,-]|\W)*/m do |match_group|
39
39
  direction = build_direction $&
40
40
  if direction.kind_of?(Array)
41
41
  directions.concat direction
@@ -47,89 +47,87 @@ module Savage
47
47
  end
48
48
 
49
49
  def build_direction(parsable)
50
- direction = nil
51
- implicit_directions = false
50
+ directions = []
52
51
  coordinates = extract_coordinates parsable
53
52
  absolute = (parsable[0,1] == parsable[0,1].upcase) ? true : false
54
53
  recurse_code = parsable[0,1]
55
- case recurse_code
56
- when /[Mm]/
57
- x = coordinates.shift
58
- y = coordinates.shift
59
- raise TypeError if x.nil? || y.nil?
60
- direction = Directions::MoveTo.new(x,y,absolute)
61
- recurse_code = 'L'
62
- when /[Ll]/
63
- x = coordinates.shift
64
- y = coordinates.shift
65
- raise TypeError if x.nil? || y.nil?
66
- direction = Directions::LineTo.new(x,y,absolute)
67
- when /[Hh]/
68
- target = coordinates.shift
69
- raise TypeError if target.nil?
70
- direction = Directions::HorizontalTo.new(target,absolute)
71
- when /[Vv]/
72
- target = coordinates.shift
73
- raise TypeError if target.nil?
74
- direction = Directions::VerticalTo.new(target,absolute)
75
- when /[Cc]/
76
- control_1_x = coordinates.shift
77
- control_1_y = coordinates.shift
78
- control_2_x = coordinates.shift
79
- control_2_y = coordinates.shift
80
- x = coordinates.shift
81
- y = coordinates.shift
82
- raise TypeError if x.nil? || y.nil? || control_1_x.nil? || control_1_y.nil? || control_2_x.nil? || control_2_y.nil?
83
- direction = Directions::CubicCurveTo.new(control_1_x,control_1_y,control_2_x,control_2_y,x,y,absolute)
84
- when /[Ss]/
85
- control_2_x = coordinates.shift
86
- control_2_y = coordinates.shift
87
- x = coordinates.shift
88
- y = coordinates.shift
89
- raise TypeError if x.nil? || y.nil? || control_2_x.nil? || control_2_y.nil?
90
- direction = Directions::CubicCurveTo.new(control_2_x,control_2_y,x,y,absolute)
91
- when /[Qq]/
92
- control_x = coordinates.shift
93
- control_y = coordinates.shift
94
- x = coordinates.shift
95
- y = coordinates.shift
96
- raise TypeError if x.nil? || y.nil? || control_x.nil? || control_y.nil?
97
- direction = Directions::QuadraticCurveTo.new(control_x,control_y,x,y,absolute)
98
- when /[Tt]/
99
- x = coordinates.shift
100
- y = coordinates.shift
101
- raise TypeError if x.nil? || y.nil?
102
- direction = Directions::QuadraticCurveTo.new(x,y,absolute)
103
- when /[Aa]/
104
- rx = coordinates.shift
105
- ry = coordinates.shift
106
- rotation = coordinates.shift
107
- large_arc = (coordinates.shift > 0) ? true : false
108
- sweep = (coordinates.shift > 0) ? true : false
109
- x = coordinates.shift
110
- y = coordinates.shift
111
- raise TypeError if x.nil? || y.nil? || rx.nil? || ry.nil? || rotation.nil?
112
- direction = Directions::ArcTo.new(rx,ry,rotation,large_arc,sweep,x,y,absolute)
113
- when /[Zz]/
114
- direction = Directions::ClosePath.new(absolute)
115
- when /[^MmLlHhVvCcSsQqTtAaZz]/
116
- coordinates = []
117
- raise TypeError
54
+
55
+ # we need to handle this separately, since ClosePath doesn't take any coordinates
56
+ if coordinates.empty? && recurse_code =~ /[Zz]/
57
+ directions << Directions::ClosePath.new(absolute)
118
58
  end
119
- unless coordinates.empty?
120
- recursed_direction = build_direction(coordinates.join(' ').insert(0,recurse_code))
121
- if recursed_direction.kind_of?(Array)
122
- direction = [direction].concat recursed_direction
123
- else
124
- direction = [direction,recursed_direction]
59
+
60
+ until coordinates.empty?
61
+ case recurse_code
62
+ when /[Mm]/
63
+ x = coordinates.shift
64
+ y = coordinates.shift
65
+ raise TypeError if x.nil? || y.nil?
66
+ directions << Directions::MoveTo.new(x,y,absolute)
67
+ recurse_code = 'L'
68
+ when /[Ll]/
69
+ x = coordinates.shift
70
+ y = coordinates.shift
71
+ raise TypeError if x.nil? || y.nil?
72
+ directions << Directions::LineTo.new(x,y,absolute)
73
+ when /[Hh]/
74
+ target = coordinates.shift
75
+ raise TypeError if target.nil?
76
+ directions << Directions::HorizontalTo.new(target,absolute)
77
+ when /[Vv]/
78
+ target = coordinates.shift
79
+ raise TypeError if target.nil?
80
+ directions << Directions::VerticalTo.new(target,absolute)
81
+ when /[Cc]/
82
+ control_1_x = coordinates.shift
83
+ control_1_y = coordinates.shift
84
+ control_2_x = coordinates.shift
85
+ control_2_y = coordinates.shift
86
+ x = coordinates.shift
87
+ y = coordinates.shift
88
+ raise TypeError if x.nil? || y.nil? || control_1_x.nil? || control_1_y.nil? || control_2_x.nil? || control_2_y.nil?
89
+ directions << Directions::CubicCurveTo.new(control_1_x,control_1_y,control_2_x,control_2_y,x,y,absolute)
90
+ when /[Ss]/
91
+ control_2_x = coordinates.shift
92
+ control_2_y = coordinates.shift
93
+ x = coordinates.shift
94
+ y = coordinates.shift
95
+ raise TypeError if x.nil? || y.nil? || control_2_x.nil? || control_2_y.nil?
96
+ directions << Directions::CubicCurveTo.new(control_2_x,control_2_y,x,y,absolute)
97
+ when /[Qq]/
98
+ control_x = coordinates.shift
99
+ control_y = coordinates.shift
100
+ x = coordinates.shift
101
+ y = coordinates.shift
102
+ raise TypeError if x.nil? || y.nil? || control_x.nil? || control_y.nil?
103
+ directions << Directions::QuadraticCurveTo.new(control_x,control_y,x,y,absolute)
104
+ when /[Tt]/
105
+ x = coordinates.shift
106
+ y = coordinates.shift
107
+ raise TypeError if x.nil? || y.nil?
108
+ directions << Directions::QuadraticCurveTo.new(x,y,absolute)
109
+ when /[Aa]/
110
+ rx = coordinates.shift
111
+ ry = coordinates.shift
112
+ rotation = coordinates.shift
113
+ large_arc = (coordinates.shift > 0) ? true : false
114
+ sweep = (coordinates.shift > 0) ? true : false
115
+ x = coordinates.shift
116
+ y = coordinates.shift
117
+ raise TypeError if x.nil? || y.nil? || rx.nil? || ry.nil? || rotation.nil?
118
+ directions << Directions::ArcTo.new(rx,ry,rotation,large_arc,sweep,x,y,absolute)
119
+ when /[^MmLlHhVvCcSsQqTtAaZz]/
120
+ coordinates = []
121
+ raise TypeError
125
122
  end
126
123
  end
127
- direction
124
+
125
+ directions
128
126
  end
129
127
 
130
128
  def extract_coordinates(command_string)
131
129
  coordinates = []
132
- command_string.scan(/-?\d+(\.\d+)?/) do |match_group|
130
+ command_string.scan(/-?\d+(\.\d+)?([eE]-?\d+)?/) do |match_group|
133
131
  coordinates << $&.to_f
134
132
  end
135
133
  coordinates
data/savage.gemspec CHANGED
@@ -4,14 +4,14 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{savage}
8
- s.version = "1.1.3"
7
+ s.name = "savage"
8
+ s.version = "1.1.4"
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 = %q{2011-07-21}
13
- s.description = %q{A little gem for extracting and manipulating SVG vector path data.}
14
- s.email = %q{jeremy@jeremypholland.com}
12
+ s.date = "2011-12-02"
13
+ s.description = "A little gem for extracting and manipulating SVG vector path data."
14
+ s.email = "jeremy@jeremypholland.com"
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
17
17
  "README.rdoc"
@@ -60,10 +60,10 @@ Gem::Specification.new do |s|
60
60
  "spec/shared/point_target.rb",
61
61
  "spec/spec_helper.rb"
62
62
  ]
63
- s.homepage = %q{http://github.com/awebneck/savage}
63
+ s.homepage = "http://github.com/awebneck/savage"
64
64
  s.require_paths = ["lib"]
65
- s.rubygems_version = %q{1.6.2}
66
- s.summary = %q{A little library to manipulate SVG path data}
65
+ s.rubygems_version = "1.8.10"
66
+ s.summary = "A little library to manipulate SVG path data"
67
67
 
68
68
  if s.respond_to? :specification_version then
69
69
  s.specification_version = 3
@@ -191,5 +191,12 @@ describe Parser do
191
191
  path.subpaths[0].directions.length.should == 2
192
192
  path.subpaths[1].directions.length.should == 6
193
193
  end
194
+
195
+ it "should support scienfitic notation in paths (eg. 2e-5)" do
196
+ # this is a 100x100 square
197
+ path = Parser.parse "M 0,0 L 1e2,0 100,1000e-1 L 0,100"
198
+ points = path.directions.map{|d| [d.target.x, d.target.y] }
199
+ points.should == [[0.0, 0.0], [100.0, 0.0], [100.0, 100.0], [0.0, 100.0]]
200
+ end
194
201
  end
195
202
  end
metadata CHANGED
@@ -1,50 +1,46 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: savage
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.4
4
5
  prerelease:
5
- version: 1.1.3
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Jeremy Holland
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-07-21 00:00:00 -05:00
14
- default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
12
+ date: 2011-12-02 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
17
15
  name: rspec
18
- prerelease: false
19
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &70224833773340 !ruby/object:Gem::Requirement
20
17
  none: false
21
- requirements:
22
- - - ">="
23
- - !ruby/object:Gem::Version
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
24
21
  version: 2.3.0
25
22
  type: :development
26
- version_requirements: *id001
27
- - !ruby/object:Gem::Dependency
28
- name: activesupport
29
23
  prerelease: false
30
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *70224833773340
25
+ - !ruby/object:Gem::Dependency
26
+ name: activesupport
27
+ requirement: &70224833766920 !ruby/object:Gem::Requirement
31
28
  none: false
32
- requirements:
33
- - - ">="
34
- - !ruby/object:Gem::Version
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
35
32
  version: 2.3.5
36
33
  type: :runtime
37
- version_requirements: *id002
34
+ prerelease: false
35
+ version_requirements: *70224833766920
38
36
  description: A little gem for extracting and manipulating SVG vector path data.
39
37
  email: jeremy@jeremypholland.com
40
38
  executables: []
41
-
42
39
  extensions: []
43
-
44
- extra_rdoc_files:
40
+ extra_rdoc_files:
45
41
  - LICENSE
46
42
  - README.rdoc
47
- files:
43
+ files:
48
44
  - .document
49
45
  - .rspec
50
46
  - LICENSE
@@ -87,33 +83,28 @@ files:
87
83
  - spec/shared/direction.rb
88
84
  - spec/shared/point_target.rb
89
85
  - spec/spec_helper.rb
90
- has_rdoc: true
91
86
  homepage: http://github.com/awebneck/savage
92
87
  licenses: []
93
-
94
88
  post_install_message:
95
89
  rdoc_options: []
96
-
97
- require_paths:
90
+ require_paths:
98
91
  - lib
99
- required_ruby_version: !ruby/object:Gem::Requirement
92
+ required_ruby_version: !ruby/object:Gem::Requirement
100
93
  none: false
101
- requirements:
102
- - - ">="
103
- - !ruby/object:Gem::Version
104
- version: "0"
105
- required_rubygems_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ! '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
99
  none: false
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: "0"
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
111
104
  requirements: []
112
-
113
105
  rubyforge_project:
114
- rubygems_version: 1.6.2
106
+ rubygems_version: 1.8.10
115
107
  signing_key:
116
108
  specification_version: 3
117
109
  summary: A little library to manipulate SVG path data
118
110
  test_files: []
119
-