savage 1.1.8 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +11 -5
- data/VERSION +1 -1
- data/lib/savage/direction.rb +9 -4
- data/lib/savage/directions/arc_to.rb +5 -5
- data/lib/savage/directions/close_path.rb +5 -5
- data/lib/savage/directions/coordinate_target.rb +5 -5
- data/lib/savage/directions/cubic_curve_to.rb +10 -6
- data/lib/savage/directions/point_target.rb +5 -5
- data/lib/savage/directions/quadratic_curve_to.rb +8 -4
- data/lib/savage/path.rb +9 -9
- data/savage.gemspec +2 -2
- data/spec/savage/path_spec.rb +2 -2
- metadata +2 -2
data/README.rdoc
CHANGED
@@ -4,7 +4,7 @@ A little gem for extracting and manipulating SVG vector path data, Savage will m
|
|
4
4
|
|
5
5
|
== Latest Update
|
6
6
|
|
7
|
-
Version 1.
|
7
|
+
Version 1.2.0 includes a new array abstraction (see below) and optimized implementation of Direction#to_command, courtesy of {bdon}[https://github.com/bdon]!
|
8
8
|
|
9
9
|
== Usage
|
10
10
|
|
@@ -68,6 +68,12 @@ Did you mess up before and need to change a directions coordinates after you dre
|
|
68
68
|
|
69
69
|
As you may have guessed, Savage::Path#subpaths and Savage::SubPath#directions are both just good old-fashioned arrays, so you can fiddle with them using all your favorite Enumerable tricks as always.
|
70
70
|
|
71
|
+
<b>Abstracting it to an array (new in v1.2.0!)</b>
|
72
|
+
|
73
|
+
Bang!:
|
74
|
+
|
75
|
+
path.to_a # => ["M", 100, 200, ...]
|
76
|
+
|
71
77
|
<b>Turning it back into a path data string</b>
|
72
78
|
|
73
79
|
Bang!:
|
@@ -90,10 +96,10 @@ I have no doubt that will be some problems with this thing, as well as features
|
|
90
96
|
|
91
97
|
== Contributors
|
92
98
|
|
93
|
-
* Jeremy Holland (jeremy@jeremypholland.com, github:awebneck) -- author
|
94
|
-
* Christoffer Klang (toffeklang@yahoo.se, github:christoffer) -- regexp improvements
|
95
|
-
*
|
96
|
-
* Brandon Liu (github:bdon) -- spec improvements
|
99
|
+
* Jeremy Holland (jeremy@jeremypholland.com, github:{awebneck}[https://github.com/awebneck]) -- author
|
100
|
+
* Christoffer Klang (toffeklang@yahoo.se, github:{christoffer}[https://github.com/christoffer]) -- regexp improvements
|
101
|
+
* Bartosz Dz (github:{MatmaRex}[https://github.com/matmarex]) -- parser improvements, scientific notation support, bug fixes
|
102
|
+
* Brandon Liu (github:{bdon}[https://github.com/bdon]) -- spec improvements, array abstraction
|
97
103
|
|
98
104
|
== Copyright
|
99
105
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0
|
data/lib/savage/direction.rb
CHANGED
@@ -2,18 +2,23 @@ module Savage
|
|
2
2
|
module Directions
|
3
3
|
Point = Struct.new :x, :y
|
4
4
|
end
|
5
|
-
|
5
|
+
|
6
6
|
class Direction
|
7
|
-
|
7
|
+
|
8
8
|
include Utils
|
9
|
-
|
9
|
+
|
10
10
|
def initialize(absolute)
|
11
11
|
@absolute = absolute
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
def absolute?
|
15
15
|
@absolute
|
16
16
|
end
|
17
|
+
|
18
|
+
def to_command
|
19
|
+
arr = to_a
|
20
|
+
arr[0] + arr[1..-1].join(' ').gsub(/ -/,'-')
|
21
|
+
end
|
17
22
|
end
|
18
23
|
end
|
19
24
|
|
@@ -2,7 +2,7 @@ module Savage
|
|
2
2
|
module Directions
|
3
3
|
class ArcTo < PointTarget
|
4
4
|
attr_accessor :radius, :rotation, :large_arc, :sweep
|
5
|
-
|
5
|
+
|
6
6
|
def initialize(radius_x, radius_y, rotation, large_arc, sweep, target_x, target_y, absolute=true)
|
7
7
|
super(target_x, target_y, absolute)
|
8
8
|
@radius = Point.new(radius_x, radius_y)
|
@@ -10,11 +10,11 @@ module Savage
|
|
10
10
|
@large_arc = large_arc.is_a?(Numeric) ? large_arc > 0 : large_arc
|
11
11
|
@sweep = sweep.is_a?(Numeric) ? sweep > 0 : sweep
|
12
12
|
end
|
13
|
-
|
14
|
-
def
|
15
|
-
command_code
|
13
|
+
|
14
|
+
def to_a
|
15
|
+
[command_code, @radius.x, @radius.y, @rotation, bool_to_int(@large_arc), bool_to_int(@sweep), target.x, target.y]
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
def command_code
|
19
19
|
(absolute?) ? 'A' : 'a'
|
20
20
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
module Savage
|
2
2
|
module Directions
|
3
3
|
class ClosePath < Direction
|
4
|
-
|
4
|
+
|
5
5
|
def initialize(absolute=true)
|
6
6
|
super(absolute)
|
7
7
|
end
|
8
|
-
|
9
|
-
def
|
10
|
-
command_code
|
8
|
+
|
9
|
+
def to_a
|
10
|
+
[command_code]
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def command_code
|
14
14
|
(absolute?) ? 'Z' : 'z'
|
15
15
|
end
|
@@ -1,16 +1,16 @@
|
|
1
1
|
module Savage
|
2
2
|
module Directions
|
3
3
|
class CoordinateTarget < Direction
|
4
|
-
|
4
|
+
|
5
5
|
attr_accessor :target
|
6
|
-
|
6
|
+
|
7
7
|
def initialize(target, absolute=true)
|
8
8
|
@target = target
|
9
9
|
super(absolute)
|
10
10
|
end
|
11
|
-
|
12
|
-
def
|
13
|
-
command_code
|
11
|
+
|
12
|
+
def to_a
|
13
|
+
[command_code, @target.to_s]
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -2,7 +2,7 @@ module Savage
|
|
2
2
|
module Directions
|
3
3
|
class CubicCurveTo < QuadraticCurveTo
|
4
4
|
attr_accessor :control_1
|
5
|
-
|
5
|
+
|
6
6
|
def initialize(*args)
|
7
7
|
raise ArgumentError if args.length < 4
|
8
8
|
case args.length
|
@@ -19,14 +19,18 @@ module Savage
|
|
19
19
|
super(args[2],args[3],args[4],args[5],args[6])
|
20
20
|
end
|
21
21
|
end
|
22
|
-
|
23
|
-
def
|
24
|
-
|
22
|
+
|
23
|
+
def to_a
|
24
|
+
if @control_1
|
25
|
+
[command_code, @control_1.x, @control_1.y, @control.x, @control.y, @target.x, @target.y]
|
26
|
+
else
|
27
|
+
[command_code, @control.x, @control.y, @target.x, @target.y]
|
28
|
+
end
|
25
29
|
end
|
26
|
-
|
30
|
+
|
27
31
|
def control_2; @control; end
|
28
32
|
def control_2=(value); @control = value; end
|
29
|
-
|
33
|
+
|
30
34
|
def command_code
|
31
35
|
return (absolute?) ? 'C' : 'c' if @control_1
|
32
36
|
(absolute?) ? 'S' : 's'
|
@@ -1,16 +1,16 @@
|
|
1
1
|
module Savage
|
2
2
|
module Directions
|
3
3
|
class PointTarget < Direction
|
4
|
-
|
4
|
+
|
5
5
|
attr_accessor :target
|
6
|
-
|
6
|
+
|
7
7
|
def initialize(x, y, absolute=true)
|
8
8
|
@target = Point.new(x,y)
|
9
9
|
super(absolute)
|
10
10
|
end
|
11
|
-
|
12
|
-
def
|
13
|
-
command_code
|
11
|
+
|
12
|
+
def to_a
|
13
|
+
[command_code, @target.x, @target.y]
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -2,7 +2,7 @@ module Savage
|
|
2
2
|
module Directions
|
3
3
|
class QuadraticCurveTo < PointTarget
|
4
4
|
attr_accessor :control
|
5
|
-
|
5
|
+
|
6
6
|
def initialize(*args)
|
7
7
|
raise ArgumentError if args.length < 2
|
8
8
|
case args.length
|
@@ -19,9 +19,13 @@ module Savage
|
|
19
19
|
super(args[2],args[3],args[4])
|
20
20
|
end
|
21
21
|
end
|
22
|
-
|
23
|
-
def
|
24
|
-
|
22
|
+
|
23
|
+
def to_a
|
24
|
+
if @control
|
25
|
+
[command_code, @control.x, @control.y, @target.x, @target.y]
|
26
|
+
else
|
27
|
+
[command_code, @target.x, @target.y]
|
28
|
+
end
|
25
29
|
end
|
26
30
|
|
27
31
|
def command_code
|
data/lib/savage/path.rb
CHANGED
@@ -2,30 +2,30 @@ module Savage
|
|
2
2
|
class Path
|
3
3
|
require File.dirname(__FILE__) + "/direction_proxy"
|
4
4
|
require File.dirname(__FILE__) + "/sub_path"
|
5
|
-
|
5
|
+
|
6
6
|
include Utils
|
7
7
|
include DirectionProxy
|
8
|
-
|
8
|
+
|
9
9
|
attr_accessor :subpaths
|
10
|
-
|
10
|
+
|
11
11
|
define_proxies do |sym,const|
|
12
12
|
define_method(sym) do |*args|
|
13
13
|
@subpaths.last.send(sym,*args)
|
14
|
-
end
|
14
|
+
end
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def initialize(*args)
|
18
18
|
@subpaths = [SubPath.new]
|
19
19
|
@subpaths.last.move_to(*args) if (2..3).include?(*args.length)
|
20
20
|
yield self if block_given?
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def directions
|
24
24
|
directions = []
|
25
25
|
@subpaths.each { |subpath| directions.concat(subpath.directions) }
|
26
26
|
directions
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
def move_to(*args)
|
30
30
|
unless (@subpaths.last.directions.empty?)
|
31
31
|
(@subpaths << SubPath.new(*args)).last
|
@@ -33,11 +33,11 @@ module Savage
|
|
33
33
|
@subpaths.last.move_to(*args)
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
def closed?
|
38
38
|
@subpaths.last.closed?
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
def to_command
|
42
42
|
@subpaths.collect { |subpath| subpath.to_command }.join
|
43
43
|
end
|
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.
|
8
|
+
s.version = "1.2.0"
|
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 = "2013-01-
|
12
|
+
s.date = "2013-01-10"
|
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 = [
|
data/spec/savage/path_spec.rb
CHANGED
@@ -22,7 +22,7 @@ describe Path do
|
|
22
22
|
path.subpaths.last.directions[1].class.should == Directions::LineTo
|
23
23
|
path.subpaths.last.directions[2].class.should == Directions::CubicCurveTo
|
24
24
|
path.subpaths.last.directions[3].class.should == Directions::ArcTo
|
25
|
-
|
25
|
+
|
26
26
|
path2 = Path.new do |p|
|
27
27
|
p.line_to 300, 400
|
28
28
|
p.cubic_curve_to 500,600,700,800,900,1000
|
@@ -102,4 +102,4 @@ describe Path do
|
|
102
102
|
path.to_command.should == concatenated
|
103
103
|
end
|
104
104
|
end
|
105
|
-
end
|
105
|
+
end
|
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.
|
4
|
+
version: 1.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|