savage 1.1.3 → 1.1.4

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 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
-