prawn-svg 0.12.0.9 → 0.12.0.10
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.
- checksums.yaml +4 -4
- data/lib/prawn/svg/parser/path.rb +29 -28
- data/lib/prawn/svg/version.rb +1 -1
- data/spec/lib/path_spec.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0b52746c9532e73303a557f3036a453670acc1f
|
4
|
+
data.tar.gz: 2f60c07e2e83617b5068da3ed62aa88882964baf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec07a8b000e4564f0a13c442028cf20d388ba8d3a15309ee48e1b2858415e79d1f13a8e4e74ef4070e04dcaf6a489dfe54226b3cb58002e74a71d34ae344e3cd
|
7
|
+
data.tar.gz: 141d6c320f073e83a3360d83abf19ad71e0da9de6f6dec11af4665826f94e174075b553bf9abd08af42a4da8600f502214238ca53e0b2686866ae41d7fe4754d
|
@@ -4,43 +4,33 @@ module Prawn
|
|
4
4
|
# Raised if the SVG path cannot be parsed.
|
5
5
|
InvalidError = Class.new(StandardError)
|
6
6
|
|
7
|
+
INSIDE_SPACE_REGEXP = /[ \t\r\n,]*/
|
8
|
+
OUTSIDE_SPACE_REGEXP = /[ \t\r\n]*/
|
9
|
+
INSIDE_REGEXP = /#{INSIDE_SPACE_REGEXP}([+-]?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:(?<=[0-9])e[+-]?[0-9]+)?)/
|
10
|
+
VALUES_REGEXP = /^#{INSIDE_REGEXP}/
|
11
|
+
COMMAND_REGEXP = /^#{OUTSIDE_SPACE_REGEXP}([A-Za-z])((?:#{INSIDE_REGEXP})*)#{OUTSIDE_SPACE_REGEXP}/
|
12
|
+
|
13
|
+
|
7
14
|
#
|
8
15
|
# Parses an SVG path and returns a Prawn-compatible call tree.
|
9
16
|
#
|
10
17
|
def parse(data)
|
11
|
-
cmd = values = nil
|
12
|
-
value = ""
|
13
18
|
@subpath_initial_point = @last_point = nil
|
14
19
|
@previous_control_point = @previous_quadratic_control_point = nil
|
15
20
|
@calls = []
|
16
21
|
|
17
|
-
data.
|
18
|
-
if c >= 'A' && c <= 'Z' || (c >= 'a' && c <= 'z' && c != 'e')
|
19
|
-
values << value.to_f if value != ""
|
20
|
-
run_path_command(cmd, values) if cmd
|
21
|
-
cmd = c
|
22
|
-
values = []
|
23
|
-
value = ""
|
24
|
-
elsif c >= '0' && c <= '9' || c == '.' || c == "-" || c == "e" # handle scientific notation, e.g. 10e-4
|
25
|
-
unless cmd
|
26
|
-
raise InvalidError, "Numerical value specified before character command in SVG path data"
|
27
|
-
end
|
28
|
-
value << c
|
29
|
-
elsif c == ' ' || c == "\t" || c == "\r" || c == "\n" || c == ","
|
30
|
-
if value != ""
|
31
|
-
values << value.to_f
|
32
|
-
value = ""
|
33
|
-
end
|
34
|
-
elsif c == '-'
|
35
|
-
values << value.to_f
|
36
|
-
value = c
|
37
|
-
else
|
38
|
-
raise InvalidError, "Invalid character '#{c}' in SVG path data"
|
39
|
-
end
|
40
|
-
end
|
22
|
+
data = data.gsub(/#{OUTSIDE_SPACE_REGEXP}$/, '')
|
41
23
|
|
42
|
-
|
43
|
-
|
24
|
+
matched_commands = match_all(data, COMMAND_REGEXP)
|
25
|
+
raise InvalidError, "Invalid/unsupported syntax for SVG path data" if matched_commands.nil?
|
26
|
+
|
27
|
+
matched_commands.each do |matched_command|
|
28
|
+
command = matched_command[1]
|
29
|
+
matched_values = match_all(matched_command[2], VALUES_REGEXP)
|
30
|
+
raise "should be impossible to have invalid inside data, but we ended up here" if matched_values.nil?
|
31
|
+
values = matched_values.collect {|value| value[1].to_f}
|
32
|
+
run_path_command(command, values)
|
33
|
+
end
|
44
34
|
|
45
35
|
@calls
|
46
36
|
end
|
@@ -183,6 +173,17 @@ module Prawn
|
|
183
173
|
@previous_control_point = nil unless %w(C S).include?(upcase_command)
|
184
174
|
@previous_quadratic_control_point = nil unless %w(Q T).include?(upcase_command)
|
185
175
|
end
|
176
|
+
|
177
|
+
def match_all(string, regexp) # regexp must start with ^
|
178
|
+
result = []
|
179
|
+
while string != ""
|
180
|
+
matches = string.match(regexp)
|
181
|
+
result << matches
|
182
|
+
return if matches.nil?
|
183
|
+
string = matches.post_match
|
184
|
+
end
|
185
|
+
result
|
186
|
+
end
|
186
187
|
end
|
187
188
|
end
|
188
189
|
end
|
data/lib/prawn/svg/version.rb
CHANGED
data/spec/lib/path_spec.rb
CHANGED
@@ -9,11 +9,11 @@ describe Prawn::Svg::Parser::Path do
|
|
9
9
|
it "correctly parses a valid path" do
|
10
10
|
calls = []
|
11
11
|
@path.stub!(:run_path_command) {|*args| calls << args}
|
12
|
-
@path.parse("A12.34 -56.78 89B4 5
|
12
|
+
@path.parse("A12.34 -56.78 89B4 5 12-34 -.5.7+3 2.3e3 4e4 4e+4 c31,-2e-5C 6,7 T QX 0 Z")
|
13
13
|
|
14
14
|
calls.should == [
|
15
15
|
["A", [12.34, -56.78, 89]],
|
16
|
-
["B", [4, 5]],
|
16
|
+
["B", [4, 5, 12, -34, -0.5, 0.7, 3, 2.3e3, 4e4, 4e4]],
|
17
17
|
["c", [31, -2e-5]],
|
18
18
|
["C", [6, 7]],
|
19
19
|
["T", []],
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prawn-svg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.12.0.
|
4
|
+
version: 0.12.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roger Nesbitt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: prawn
|