prawn-svg 0.21.0 → 0.22.1
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/.travis.yml +6 -0
- data/README.md +11 -4
- data/lib/prawn-svg.rb +9 -6
- data/lib/prawn/svg/attributes.rb +6 -0
- data/lib/prawn/svg/attributes/clip_path.rb +17 -0
- data/lib/prawn/svg/attributes/display.rb +5 -0
- data/lib/prawn/svg/attributes/font.rb +38 -0
- data/lib/prawn/svg/attributes/opacity.rb +15 -0
- data/lib/prawn/svg/attributes/stroke.rb +35 -0
- data/lib/prawn/svg/attributes/transform.rb +50 -0
- data/lib/prawn/svg/calculators/aspect_ratio.rb +1 -1
- data/lib/prawn/svg/calculators/document_sizing.rb +2 -2
- data/lib/prawn/svg/calculators/pixels.rb +1 -1
- data/lib/prawn/svg/color.rb +44 -14
- data/lib/prawn/svg/document.rb +6 -5
- data/lib/prawn/svg/elements.rb +33 -0
- data/lib/prawn/svg/elements/base.rb +228 -0
- data/lib/prawn/svg/elements/circle.rb +25 -0
- data/lib/prawn/svg/elements/container.rb +15 -0
- data/lib/prawn/svg/elements/ellipse.rb +23 -0
- data/lib/prawn/svg/elements/gradient.rb +117 -0
- data/lib/prawn/svg/elements/ignored.rb +5 -0
- data/lib/prawn/svg/elements/image.rb +85 -0
- data/lib/prawn/svg/elements/line.rb +16 -0
- data/lib/prawn/svg/elements/path.rb +405 -0
- data/lib/prawn/svg/elements/polygon.rb +17 -0
- data/lib/prawn/svg/elements/polyline.rb +22 -0
- data/lib/prawn/svg/elements/rect.rb +33 -0
- data/lib/prawn/svg/elements/root.rb +9 -0
- data/lib/prawn/svg/elements/style.rb +10 -0
- data/lib/prawn/svg/elements/text.rb +87 -0
- data/lib/prawn/svg/elements/use.rb +29 -0
- data/lib/prawn/svg/extension.rb +2 -2
- data/lib/prawn/svg/font.rb +3 -3
- data/lib/prawn/svg/interface.rb +12 -5
- data/lib/prawn/svg/url_loader.rb +1 -1
- data/lib/prawn/svg/version.rb +2 -2
- data/prawn-svg.gemspec +3 -3
- data/spec/integration_spec.rb +59 -2
- data/spec/prawn/svg/attributes/font_spec.rb +49 -0
- data/spec/prawn/svg/attributes/transform_spec.rb +56 -0
- data/spec/prawn/svg/calculators/aspect_ratio_spec.rb +2 -2
- data/spec/prawn/svg/calculators/document_sizing_spec.rb +3 -3
- data/spec/prawn/svg/color_spec.rb +36 -15
- data/spec/prawn/svg/document_spec.rb +4 -4
- data/spec/prawn/svg/elements/base_spec.rb +125 -0
- data/spec/prawn/svg/elements/gradient_spec.rb +61 -0
- data/spec/prawn/svg/elements/path_spec.rb +123 -0
- data/spec/prawn/svg/elements/style_spec.rb +23 -0
- data/spec/prawn/svg/{parser → elements}/text_spec.rb +7 -8
- data/spec/prawn/svg/font_spec.rb +12 -12
- data/spec/prawn/svg/interface_spec.rb +7 -7
- data/spec/prawn/svg/url_loader_spec.rb +2 -2
- data/spec/sample_svg/gradients.svg +40 -0
- data/spec/sample_svg/rect02.svg +8 -11
- data/spec/spec_helper.rb +1 -1
- metadata +46 -18
- data/lib/prawn/svg/element.rb +0 -304
- data/lib/prawn/svg/parser.rb +0 -268
- data/lib/prawn/svg/parser/image.rb +0 -81
- data/lib/prawn/svg/parser/path.rb +0 -392
- data/lib/prawn/svg/parser/text.rb +0 -80
- data/spec/prawn/svg/element_spec.rb +0 -127
- data/spec/prawn/svg/parser/path_spec.rb +0 -89
- data/spec/prawn/svg/parser_spec.rb +0 -55
@@ -1,8 +1,8 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../../spec_helper'
|
2
2
|
|
3
|
-
describe Prawn::
|
3
|
+
describe Prawn::SVG::Calculators::AspectRatio do
|
4
4
|
def test(*args)
|
5
|
-
aspect = Prawn::
|
5
|
+
aspect = Prawn::SVG::Calculators::AspectRatio.new(*args)
|
6
6
|
[[aspect.width, aspect.height], [aspect.x, aspect.y]]
|
7
7
|
end
|
8
8
|
|
@@ -1,13 +1,13 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../../spec_helper'
|
2
2
|
|
3
|
-
describe Prawn::
|
3
|
+
describe Prawn::SVG::Calculators::DocumentSizing do
|
4
4
|
let(:attributes) do
|
5
5
|
{"width" => "150", "height" => "200", "viewBox" => "0 -30 300 800", "preserveAspectRatio" => "xMaxYMid meet"}
|
6
6
|
end
|
7
7
|
|
8
8
|
let(:bounds) { [1200, 800] }
|
9
9
|
|
10
|
-
let(:sizing) { Prawn::
|
10
|
+
let(:sizing) { Prawn::SVG::Calculators::DocumentSizing.new(bounds, attributes) }
|
11
11
|
|
12
12
|
describe "#initialize" do
|
13
13
|
it "takes bounds and a set of attributes and calls set_from_attributes" do
|
@@ -17,7 +17,7 @@ describe Prawn::Svg::Calculators::DocumentSizing do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
describe "#set_from_attributes" do
|
20
|
-
let(:sizing) { Prawn::
|
20
|
+
let(:sizing) { Prawn::SVG::Calculators::DocumentSizing.new(bounds) }
|
21
21
|
|
22
22
|
it "sets ivars from the passed-in attributes hash" do
|
23
23
|
sizing.set_from_attributes(attributes)
|
@@ -1,40 +1,61 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
|
3
|
-
describe Prawn::
|
4
|
-
describe
|
3
|
+
describe Prawn::SVG::Color do
|
4
|
+
describe "::color_to_hex" do
|
5
5
|
it "converts #xxx to a hex value" do
|
6
|
-
Prawn::
|
6
|
+
Prawn::SVG::Color.color_to_hex("#9ab").should == "99aabb"
|
7
7
|
end
|
8
8
|
|
9
9
|
it "converts #xxxxxx to a hex value" do
|
10
|
-
Prawn::
|
10
|
+
Prawn::SVG::Color.color_to_hex("#9ab123").should == "9ab123"
|
11
11
|
end
|
12
12
|
|
13
13
|
it "converts an html colour name to a hex value" do
|
14
|
-
Prawn::
|
14
|
+
Prawn::SVG::Color.color_to_hex("White").should == "ffffff"
|
15
15
|
end
|
16
16
|
|
17
17
|
it "converts an rgb string to a hex value" do
|
18
|
-
Prawn::
|
19
|
-
Prawn::
|
18
|
+
Prawn::SVG::Color.color_to_hex("rgb(16, 32, 48)").should == "102030"
|
19
|
+
Prawn::SVG::Color.color_to_hex("rgb(-5, 50%, 120%)").should == "007fff"
|
20
20
|
end
|
21
21
|
|
22
22
|
it "scans the string and finds the first colour it can parse" do
|
23
|
-
Prawn::
|
23
|
+
Prawn::SVG::Color.color_to_hex("function(#someurl, 0) nonexistent rgb( 3 ,4,5 ) white").should == "030405"
|
24
24
|
end
|
25
25
|
|
26
26
|
it "ignores url()s" do
|
27
|
-
expect(Prawn::
|
27
|
+
expect(Prawn::SVG::Color.color_to_hex("url(#someplace) red")).to eq 'ff0000'
|
28
28
|
end
|
29
29
|
|
30
|
-
it "returns
|
31
|
-
expect(Prawn::
|
30
|
+
it "returns black if the color doesn't exist" do
|
31
|
+
expect(Prawn::SVG::Color.color_to_hex("blurble")).to eq '000000'
|
32
32
|
end
|
33
33
|
|
34
|
-
it "
|
35
|
-
expect
|
36
|
-
|
37
|
-
|
34
|
+
it "returns nil if there's no fallback after a url()" do
|
35
|
+
expect(Prawn::SVG::Color.color_to_hex("url(#someplace)")).to be nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "::parse" do
|
40
|
+
let(:gradients) { {"flan" => flan_gradient, "drob" => drob_gradient} }
|
41
|
+
let(:flan_gradient) { double }
|
42
|
+
let(:drob_gradient) { double }
|
43
|
+
|
44
|
+
it "returns a list of all colors parsed, ignoring impossible or non-existent colors" do
|
45
|
+
results = Prawn::SVG::Color.parse("url(#nope) url(#flan) blurble green #123", gradients)
|
46
|
+
expect(results).to eq [
|
47
|
+
flan_gradient,
|
48
|
+
Prawn::SVG::Color::Hex.new("008000"),
|
49
|
+
Prawn::SVG::Color::Hex.new("112233")
|
50
|
+
]
|
51
|
+
end
|
52
|
+
|
53
|
+
it "appends black to the list if there aren't any url() references" do
|
54
|
+
results = Prawn::SVG::Color.parse("blurble green", gradients)
|
55
|
+
expect(results).to eq [
|
56
|
+
Prawn::SVG::Color::Hex.new("008000"),
|
57
|
+
Prawn::SVG::Color::Hex.new("000000")
|
58
|
+
]
|
38
59
|
end
|
39
60
|
end
|
40
61
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
|
3
|
-
describe Prawn::
|
3
|
+
describe Prawn::SVG::Document do
|
4
4
|
before do
|
5
|
-
sizing = instance_double(Prawn::
|
5
|
+
sizing = instance_double(Prawn::SVG::Calculators::DocumentSizing, viewport_width: 600, viewport_height: 400, viewport_diagonal: 500, :requested_width= => nil, :requested_height= => nil)
|
6
6
|
expect(sizing).to receive(:calculate)
|
7
|
-
expect(Prawn::
|
7
|
+
expect(Prawn::SVG::Calculators::DocumentSizing).to receive(:new).and_return(sizing)
|
8
8
|
end
|
9
9
|
|
10
|
-
let(:document) { Prawn::
|
10
|
+
let(:document) { Prawn::SVG::Document.new("<svg></svg>", [100, 100], {}) }
|
11
11
|
|
12
12
|
describe :points do
|
13
13
|
it "converts a variety of measurement units to points" do
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Prawn::SVG::Elements::Base do
|
4
|
+
let(:svg) { "<svg></svg>" }
|
5
|
+
let(:document) { Prawn::SVG::Document.new(svg, [800, 600], {}) }
|
6
|
+
let(:parent_calls) { [] }
|
7
|
+
let(:element) { Prawn::SVG::Elements::Base.new(document, document.root, parent_calls, {}) }
|
8
|
+
|
9
|
+
describe "#initialize" do
|
10
|
+
let(:svg) { '<something id="hello"/>' }
|
11
|
+
|
12
|
+
it "adds itself to the elements_by_id hash if an id attribute is supplied" do
|
13
|
+
element
|
14
|
+
expect(document.elements_by_id["hello"]).to eq element
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#process" do
|
19
|
+
it "calls #parse and #apply so subclasses can parse the element" do
|
20
|
+
expect(element).to receive(:parse).ordered
|
21
|
+
expect(element).to receive(:apply).ordered
|
22
|
+
element.process
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "applying calls from the standard attributes" do
|
26
|
+
let(:svg) do
|
27
|
+
<<-SVG
|
28
|
+
<something transform="rotate(90)" fill-opacity="0.5" fill="red" stroke="blue" stroke-width="5" font-family="Helvetica"/>
|
29
|
+
SVG
|
30
|
+
end
|
31
|
+
|
32
|
+
it "appends the relevant calls" do
|
33
|
+
element.process
|
34
|
+
expect(element.base_calls).to eq [
|
35
|
+
["rotate", [-90.0, {origin: [0, 150.0]}], [
|
36
|
+
["transparent", [0.5, 1], [
|
37
|
+
["fill_color", ["ff0000"], []],
|
38
|
+
["stroke_color", ["0000ff"], []],
|
39
|
+
["line_width", [5.0], []],
|
40
|
+
["font", ["Helvetica", {:style=>:normal}], [
|
41
|
+
["fill_and_stroke", [], []]
|
42
|
+
]]
|
43
|
+
]]
|
44
|
+
]]
|
45
|
+
]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
it "appends calls to the parent element" do
|
50
|
+
expect(element).to receive(:apply) do
|
51
|
+
element.send :add_call, "test", "argument"
|
52
|
+
end
|
53
|
+
|
54
|
+
element.process
|
55
|
+
expect(element.parent_calls).to eq [["end_path", [], [["test", ["argument"], []]]]]
|
56
|
+
end
|
57
|
+
|
58
|
+
it "quietly absorbs a SkipElementQuietly exception" do
|
59
|
+
expect(element).to receive(:parse).and_raise(Prawn::SVG::Elements::Base::SkipElementQuietly)
|
60
|
+
expect(element).to_not receive(:apply)
|
61
|
+
element.process
|
62
|
+
expect(document.warnings).to be_empty
|
63
|
+
end
|
64
|
+
|
65
|
+
it "absorbs a SkipElementError exception, logging a warning" do
|
66
|
+
expect(element).to receive(:parse).and_raise(Prawn::SVG::Elements::Base::SkipElementError, "hello")
|
67
|
+
expect(element).to_not receive(:apply)
|
68
|
+
element.process
|
69
|
+
expect(document.warnings).to eq ["hello"]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe "#parse_fill_and_stroke_attributes_and_call" do
|
74
|
+
before do
|
75
|
+
element.send(:combine_attributes_and_style_declarations)
|
76
|
+
end
|
77
|
+
|
78
|
+
subject { element.send :parse_fill_and_stroke_attributes_and_call }
|
79
|
+
|
80
|
+
it "doesn't change anything if no fill attribute provided" do
|
81
|
+
subject
|
82
|
+
expect(element.state[:fill]).to be nil
|
83
|
+
end
|
84
|
+
|
85
|
+
it "doesn't change anything if 'inherit' fill attribute provided" do
|
86
|
+
element.attributes['fill'] = 'inherit'
|
87
|
+
subject
|
88
|
+
expect(element.state[:fill]).to be nil
|
89
|
+
end
|
90
|
+
|
91
|
+
it "turns off filling if 'none' fill attribute provided" do
|
92
|
+
element.attributes['fill'] = 'none'
|
93
|
+
subject
|
94
|
+
expect(element.state[:fill]).to be false
|
95
|
+
end
|
96
|
+
|
97
|
+
it "uses the fill attribute's color" do
|
98
|
+
expect(element).to receive(:add_call).with('fill_color', 'ff0000')
|
99
|
+
element.attributes['fill'] = 'red'
|
100
|
+
subject
|
101
|
+
expect(element.state[:fill]).to be true
|
102
|
+
end
|
103
|
+
|
104
|
+
it "uses black if the fill attribute's color is unparseable" do
|
105
|
+
expect(element).to receive(:add_call).with('fill_color', '000000')
|
106
|
+
element.attributes['fill'] = 'blarble'
|
107
|
+
subject
|
108
|
+
expect(element.state[:fill]).to be true
|
109
|
+
end
|
110
|
+
|
111
|
+
it "uses the color attribute if 'currentColor' fill attribute provided" do
|
112
|
+
expect(element).to receive(:add_call).with('fill_color', 'ff0000')
|
113
|
+
element.attributes['fill'] = 'currentColor'
|
114
|
+
element.attributes['color'] = 'red'
|
115
|
+
subject
|
116
|
+
expect(element.state[:fill]).to be true
|
117
|
+
end
|
118
|
+
|
119
|
+
it "turns off filling if UnresolvableURLWithNoFallbackError is raised" do
|
120
|
+
element.attributes['fill'] = 'url()'
|
121
|
+
subject
|
122
|
+
expect(element.state[:fill]).to be false
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Prawn::SVG::Elements::Gradient do
|
4
|
+
let(:document) { Prawn::SVG::Document.new(svg, [800, 600], {width: 800, height: 600}) }
|
5
|
+
let(:element) { Prawn::SVG::Elements::Gradient.new(document, document.root, [], {}) }
|
6
|
+
|
7
|
+
before do
|
8
|
+
allow(element).to receive(:assert_compatible_prawn_version)
|
9
|
+
element.process
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "object bounding box" do
|
13
|
+
let(:svg) do
|
14
|
+
<<-SVG
|
15
|
+
<linearGradient id="flag" x1="0" x2="0.2" y1="0" y2="1">
|
16
|
+
<stop offset="25%" stop-color="red"/>
|
17
|
+
<stop offset="50%" stop-color="white"/>
|
18
|
+
<stop offset="75%" stop-color="blue"/>
|
19
|
+
</linearGradient>
|
20
|
+
SVG
|
21
|
+
end
|
22
|
+
|
23
|
+
it "is stored in the document gradients table" do
|
24
|
+
expect(document.gradients["flag"]).to eq element
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returns correct gradient arguments for an element" do
|
28
|
+
arguments = element.gradient_arguments(double(bounding_box: [100, 100, 200, 0]))
|
29
|
+
expect(arguments).to eq(
|
30
|
+
from: [100.0, 100.0],
|
31
|
+
to: [120.0, 0.0],
|
32
|
+
stops: [[0, "ff0000"], [0.25, "ff0000"], [0.5, "ffffff"], [0.75, "0000ff"], [1, "0000ff"]]
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "returns nil if the element doesn't have a bounding box" do
|
37
|
+
arguments = element.gradient_arguments(double(bounding_box: nil))
|
38
|
+
expect(arguments).to be nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "user space on use" do
|
43
|
+
let(:svg) do
|
44
|
+
<<-SVG
|
45
|
+
<linearGradient id="flag" gradientUnits="userSpaceOnUse" x1="100" y1="500" x2="200" y2="600">
|
46
|
+
<stop offset="0" stop-color="red"/>
|
47
|
+
<stop offset="1" stop-color="blue"/>
|
48
|
+
</linearGradient>
|
49
|
+
SVG
|
50
|
+
end
|
51
|
+
|
52
|
+
it "returns correct gradient arguments for an element" do
|
53
|
+
arguments = element.gradient_arguments(double)
|
54
|
+
expect(arguments).to eq(
|
55
|
+
from: [100.0, 100.0],
|
56
|
+
to: [200.0, 0.0],
|
57
|
+
stops: [[0, "ff0000"], [1, "0000ff"]]
|
58
|
+
)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Prawn::SVG::Elements::Path do
|
4
|
+
let(:source) { double(name: "path", attributes: {}) }
|
5
|
+
let(:path) { Prawn::SVG::Elements::Path.new(nil, source, [], {}) }
|
6
|
+
|
7
|
+
before do
|
8
|
+
allow(path).to receive(:attributes).and_return("d" => d)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "command parsing" do
|
12
|
+
context "with a valid path" do
|
13
|
+
let(:d) { "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" }
|
14
|
+
|
15
|
+
it "correctly parses" do
|
16
|
+
calls = []
|
17
|
+
path.stub(:run_path_command) {|*args| calls << args}
|
18
|
+
path.parse
|
19
|
+
|
20
|
+
calls.should == [
|
21
|
+
["A", [12.34, -56.78, 89]],
|
22
|
+
["B", [4, 5, 12, -34, -0.5, 0.7, 3, 2.3e3, 4e4, 4e4]],
|
23
|
+
["c", [31, -2e-5]],
|
24
|
+
["C", [6, 7]],
|
25
|
+
["T", []],
|
26
|
+
["Q", []],
|
27
|
+
["X", [0]],
|
28
|
+
["Z", []]
|
29
|
+
]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "with m and M commands" do
|
34
|
+
let(:d) { "M 1,2 3,4 m 5,6 7,8" }
|
35
|
+
|
36
|
+
it "treats subsequent points to m/M command as relative/absolute depending on command" do
|
37
|
+
[
|
38
|
+
["M", [1,2,3,4]],
|
39
|
+
["L", [3,4]],
|
40
|
+
["m", [5,6,7,8]],
|
41
|
+
["l", [7,8]]
|
42
|
+
].each do |args|
|
43
|
+
path.should_receive(:run_path_command).with(*args).and_call_original
|
44
|
+
end
|
45
|
+
|
46
|
+
path.parse
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "with an empty path" do
|
51
|
+
let(:d) { "" }
|
52
|
+
|
53
|
+
it "correctly parses" do
|
54
|
+
path.should_not_receive(:run_path_command)
|
55
|
+
path.parse
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context "with a path with invalid characters" do
|
60
|
+
let(:d) { "M 10 % 20" }
|
61
|
+
|
62
|
+
it "raises" do
|
63
|
+
expect { path.parse }.to raise_error(Prawn::SVG::Elements::Base::SkipElementError)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "with a path with numerical data before a command letter" do
|
68
|
+
let(:d) { "M 10 % 20" }
|
69
|
+
|
70
|
+
it "raises" do
|
71
|
+
expect { path.parse }.to raise_error(Prawn::SVG::Elements::Base::SkipElementError)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context "when given an A path" do
|
77
|
+
subject { path.parse; path.commands }
|
78
|
+
|
79
|
+
context "that is pretty normal" do
|
80
|
+
let(:d) { "M 100 200 A 10 10 0 0 1 200 200" }
|
81
|
+
|
82
|
+
it "uses bezier curves to approximate an arc path" do
|
83
|
+
expect(subject).to eq [
|
84
|
+
["move_to", [100.0, 200.0]],
|
85
|
+
["curve_to", [150.0, 150.0, 100.0, 172.57081148225683, 122.57081148225683, 150.0]],
|
86
|
+
["curve_to", [200.0, 200.0, 177.42918851774317, 150.0, 200.0, 172.57081148225683]]
|
87
|
+
]
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context "with an identical start and end point" do
|
92
|
+
let(:d) { "M 100 200 A 30 30 0 0 1 100 200" }
|
93
|
+
|
94
|
+
it "ignores the path" do
|
95
|
+
expect(subject).to eq [
|
96
|
+
["move_to", [100.0, 200.0]]
|
97
|
+
]
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context "with an rx of 0" do
|
102
|
+
let(:d) { "M 100 200 A 0 10 0 0 1 200 200" }
|
103
|
+
|
104
|
+
it "substitutes a line_to" do
|
105
|
+
expect(subject).to eq [
|
106
|
+
["move_to", [100.0, 200.0]],
|
107
|
+
["line_to", [200.0, 200.0]]
|
108
|
+
]
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context "with an ry of 0" do
|
113
|
+
let(:d) { "M 100 200 A 10 0 0 0 1 200 200" }
|
114
|
+
|
115
|
+
it "substitutes a line_to" do
|
116
|
+
expect(subject).to eq [
|
117
|
+
["move_to", [100.0, 200.0]],
|
118
|
+
["line_to", [200.0, 200.0]]
|
119
|
+
]
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Prawn::SVG::Elements::Style do
|
4
|
+
let(:svg) do
|
5
|
+
<<-SVG
|
6
|
+
<style>a
|
7
|
+
before>
|
8
|
+
x <![CDATA[ y
|
9
|
+
inside <>>
|
10
|
+
k ]]> j
|
11
|
+
after
|
12
|
+
z</style>
|
13
|
+
SVG
|
14
|
+
end
|
15
|
+
|
16
|
+
let(:document) { Prawn::SVG::Document.new(svg, [800, 600], {}) }
|
17
|
+
let(:element) { Prawn::SVG::Elements::Style.new(document, document.root, [], {}) }
|
18
|
+
|
19
|
+
it "correctly collects the style information in a <style> tag" do
|
20
|
+
expect(document.css_parser).to receive(:add_block!).with("a\n before>\n x y\n inside <>>\n k j\n after\nz")
|
21
|
+
element.process
|
22
|
+
end
|
23
|
+
end
|