prawn-svg 0.23.1 → 0.24.0
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 +3 -3
- data/README.md +15 -9
- data/lib/prawn-svg.rb +3 -0
- data/lib/prawn/svg/attributes.rb +1 -1
- data/lib/prawn/svg/attributes/clip_path.rb +6 -7
- data/lib/prawn/svg/attributes/opacity.rb +3 -3
- data/lib/prawn/svg/attributes/stroke.rb +6 -4
- data/lib/prawn/svg/calculators/arc_to_bezier_curve.rb +114 -0
- data/lib/prawn/svg/elements.rb +4 -1
- data/lib/prawn/svg/elements/base.rb +76 -69
- data/lib/prawn/svg/elements/container.rb +5 -6
- data/lib/prawn/svg/elements/gradient.rb +4 -4
- data/lib/prawn/svg/elements/image.rb +1 -1
- data/lib/prawn/svg/elements/line.rb +15 -7
- data/lib/prawn/svg/elements/marker.rb +72 -0
- data/lib/prawn/svg/elements/path.rb +23 -147
- data/lib/prawn/svg/elements/polygon.rb +14 -6
- data/lib/prawn/svg/elements/polyline.rb +12 -11
- data/lib/prawn/svg/elements/root.rb +3 -1
- data/lib/prawn/svg/elements/text.rb +38 -17
- data/lib/prawn/svg/font.rb +6 -6
- data/lib/prawn/svg/interface.rb +3 -0
- data/lib/prawn/svg/pathable.rb +130 -0
- data/lib/prawn/svg/properties.rb +122 -0
- data/lib/prawn/svg/state.rb +7 -29
- data/lib/prawn/svg/version.rb +1 -1
- data/spec/prawn/svg/elements/base_spec.rb +19 -32
- data/spec/prawn/svg/elements/line_spec.rb +37 -0
- data/spec/prawn/svg/elements/marker_spec.rb +90 -0
- data/spec/prawn/svg/elements/path_spec.rb +10 -10
- data/spec/prawn/svg/elements/polygon_spec.rb +49 -0
- data/spec/prawn/svg/elements/polyline_spec.rb +47 -0
- data/spec/prawn/svg/elements/style_spec.rb +1 -1
- data/spec/prawn/svg/elements/text_spec.rb +37 -5
- data/spec/prawn/svg/pathable_spec.rb +92 -0
- data/spec/prawn/svg/properties_spec.rb +186 -0
- data/spec/sample_svg/arrows.svg +73 -0
- data/spec/sample_svg/marker.svg +32 -0
- data/spec/sample_svg/polygon01.svg +25 -5
- metadata +23 -8
- data/lib/prawn/svg/attributes/color.rb +0 -5
- data/lib/prawn/svg/attributes/display.rb +0 -5
- data/lib/prawn/svg/attributes/font.rb +0 -38
- data/spec/prawn/svg/attributes/font_spec.rb +0 -52
data/lib/prawn/svg/version.rb
CHANGED
@@ -25,7 +25,7 @@ describe Prawn::SVG::Elements::Base do
|
|
25
25
|
describe "applying calls from the standard attributes" do
|
26
26
|
let(:svg) do
|
27
27
|
<<-SVG
|
28
|
-
<something transform="rotate(90)" fill-opacity="0.5" fill="red" stroke="blue" stroke-width="5"
|
28
|
+
<something transform="rotate(90)" fill-opacity="0.5" fill="red" stroke="blue" stroke-width="5"/>
|
29
29
|
SVG
|
30
30
|
end
|
31
31
|
|
@@ -37,9 +37,7 @@ describe Prawn::SVG::Elements::Base do
|
|
37
37
|
["fill_color", ["ff0000"], []],
|
38
38
|
["stroke_color", ["0000ff"], []],
|
39
39
|
["line_width", [5.0], []],
|
40
|
-
["
|
41
|
-
["fill_and_stroke", [], []]
|
42
|
-
]]
|
40
|
+
["fill_and_stroke", [], []]
|
43
41
|
]]
|
44
42
|
]]
|
45
43
|
]
|
@@ -70,59 +68,47 @@ describe Prawn::SVG::Elements::Base do
|
|
70
68
|
end
|
71
69
|
end
|
72
70
|
|
73
|
-
describe "#
|
71
|
+
describe "#apply_colors" do
|
74
72
|
before do
|
75
|
-
element.send(:
|
73
|
+
element.send(:extract_attributes_and_properties)
|
76
74
|
end
|
77
75
|
|
78
|
-
subject { element.send :
|
76
|
+
subject { element.send :apply_colors }
|
79
77
|
|
80
78
|
it "doesn't change anything if no fill attribute provided" do
|
79
|
+
expect(element).to_not receive(:add_call)
|
81
80
|
subject
|
82
|
-
expect(element.state.fill).to be true
|
83
|
-
|
84
|
-
element.state.fill = false
|
85
|
-
subject
|
86
|
-
expect(element.state.fill).to be false
|
87
81
|
end
|
88
82
|
|
89
83
|
it "doesn't change anything if 'inherit' fill attribute provided" do
|
90
|
-
element.
|
91
|
-
|
92
|
-
expect(element.state.fill).to be true
|
93
|
-
|
94
|
-
element.state.fill = false
|
84
|
+
element.properties.fill = 'inherit'
|
85
|
+
expect(element).to_not receive(:add_call)
|
95
86
|
subject
|
96
|
-
expect(element.state.fill).to be false
|
97
87
|
end
|
98
88
|
|
99
|
-
it "
|
100
|
-
element.
|
89
|
+
it "doesn't change anything if 'none' fill attribute provided" do
|
90
|
+
element.properties.fill = 'none'
|
91
|
+
expect(element).to_not receive(:add_call)
|
101
92
|
subject
|
102
|
-
expect(element.state.fill).to be false
|
103
93
|
end
|
104
94
|
|
105
95
|
it "uses the fill attribute's color" do
|
106
96
|
expect(element).to receive(:add_call).with('fill_color', 'ff0000')
|
107
|
-
element.
|
97
|
+
element.properties.fill = 'red'
|
108
98
|
subject
|
109
|
-
expect(element.state.fill).to be true
|
110
99
|
end
|
111
100
|
|
112
101
|
it "uses black if the fill attribute's color is unparseable" do
|
113
102
|
expect(element).to receive(:add_call).with('fill_color', '000000')
|
114
|
-
element.
|
103
|
+
element.properties.fill = 'blarble'
|
115
104
|
subject
|
116
|
-
expect(element.state.fill).to be true
|
117
105
|
end
|
118
106
|
|
119
107
|
it "uses the color attribute if 'currentColor' fill attribute provided" do
|
120
108
|
expect(element).to receive(:add_call).with('fill_color', 'ff0000')
|
121
|
-
element.
|
122
|
-
element.
|
123
|
-
element.send :parse_color_attribute
|
109
|
+
element.properties.fill = 'currentColor'
|
110
|
+
element.state.computed_properties.color = 'red'
|
124
111
|
subject
|
125
|
-
expect(element.state.fill).to be true
|
126
112
|
end
|
127
113
|
|
128
114
|
context "with a color attribute defined on a parent element" do
|
@@ -138,10 +124,11 @@ describe Prawn::SVG::Elements::Base do
|
|
138
124
|
end
|
139
125
|
end
|
140
126
|
|
141
|
-
it "
|
142
|
-
element.
|
127
|
+
it "computes to 'none' if UnresolvableURLWithNoFallbackError is raised" do
|
128
|
+
expect(element).to_not receive(:add_call)
|
129
|
+
element.properties.fill = 'url()'
|
143
130
|
subject
|
144
|
-
expect(element.
|
131
|
+
expect(element.computed_properties.fill).to eq 'none'
|
145
132
|
end
|
146
133
|
end
|
147
134
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Prawn::SVG::Elements::Line do
|
4
|
+
let(:document) { Prawn::SVG::Document.new(svg, [800, 600], {width: 800, height: 600}) }
|
5
|
+
|
6
|
+
subject do
|
7
|
+
Prawn::SVG::Elements::Line.new(document, document.root, [], Prawn::SVG::State.new)
|
8
|
+
end
|
9
|
+
|
10
|
+
context "with attributes specified" do
|
11
|
+
let(:svg) { '<line x1="5" y1="10" x2="15" y2="20" />' }
|
12
|
+
|
13
|
+
it "renders the line" do
|
14
|
+
subject.process
|
15
|
+
expect(subject.base_calls).to eq [
|
16
|
+
["fill", [], [
|
17
|
+
["move_to", [[5.0, 590.0]], []],
|
18
|
+
["line_to", [[15.0, 580.0]], []]]
|
19
|
+
]
|
20
|
+
]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "with no attributes specified" do
|
25
|
+
let(:svg) { '<line />' }
|
26
|
+
|
27
|
+
it "draws a line from 0,0 to 0,0" do
|
28
|
+
subject.process
|
29
|
+
expect(subject.base_calls).to eq [
|
30
|
+
["fill", [], [
|
31
|
+
["move_to", [[0, 600]], []],
|
32
|
+
["line_to", [[0, 600]], []]]
|
33
|
+
]
|
34
|
+
]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Prawn::SVG::Elements::Marker do
|
4
|
+
let(:svg) do
|
5
|
+
<<-SVG
|
6
|
+
<svg>
|
7
|
+
<marker id="Triangle"
|
8
|
+
viewBox="0 0 10 10" refX="0" refY="5"
|
9
|
+
markerUnits="strokeWidth"
|
10
|
+
markerWidth="4" markerHeight="3"
|
11
|
+
orient="auto">
|
12
|
+
<path d="M 0 0 L 10 5 L 0 10 z" />
|
13
|
+
</marker>
|
14
|
+
|
15
|
+
<line x2="10" y2="10" stroke-width="100" />
|
16
|
+
</svg>
|
17
|
+
SVG
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:document) { Prawn::SVG::Document.new(svg, [800, 600], {width: 800, height: 600}) }
|
21
|
+
let(:state) { Prawn::SVG::State.new }
|
22
|
+
|
23
|
+
let(:line_element) do
|
24
|
+
Prawn::SVG::Elements::Line.new(document, document.root.elements[2], [], state)
|
25
|
+
end
|
26
|
+
|
27
|
+
subject do
|
28
|
+
Prawn::SVG::Elements::Marker.new(document, document.root.elements[1], [], state)
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#parse" do
|
32
|
+
it "forces display none" do
|
33
|
+
subject.parse
|
34
|
+
expect(subject.properties.display).to eq 'none'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "#apply_marker" do
|
39
|
+
it "adds the line and its marker to the call stack" do
|
40
|
+
subject.process
|
41
|
+
line_element.process
|
42
|
+
|
43
|
+
# We didn't use a marker-* attribute on the <line> tag, that's
|
44
|
+
# why the apply_marker method wasn't automatically called as part
|
45
|
+
# of the line_element.process call above.
|
46
|
+
|
47
|
+
subject.apply_marker(line_element, point: [10, 10], angle: 45)
|
48
|
+
|
49
|
+
# This example follows the example in the SVG 1.1 documentation
|
50
|
+
# in section 11.6.3.
|
51
|
+
|
52
|
+
expect(line_element.base_calls).to eq [
|
53
|
+
["line_width", [100.0], []],
|
54
|
+
["fill", [], [
|
55
|
+
["move_to", [[0.0, 600.0]], []],
|
56
|
+
["line_to", [[10.0, 590.0]], []]
|
57
|
+
]
|
58
|
+
],
|
59
|
+
["save", [], []],
|
60
|
+
["transformation_matrix", [1, 0, 0, 1, 10, -10], []],
|
61
|
+
["rotate", [-45, {origin: [0, 600.0]}], [
|
62
|
+
["transformation_matrix", [100.0, 0, 0, 100.0, 0, 0], []],
|
63
|
+
["transformation_matrix", [1, 0, 0, 1, -0.0, 1.5], []],
|
64
|
+
["rectangle", [[-0.5, 600.0], 4.0, 3.0], []],
|
65
|
+
["clip", [], []],
|
66
|
+
["transformation_matrix", [0.3, 0, 0, 0.3, 0, 0], []],
|
67
|
+
["transparent", [1.0, 1.0], [
|
68
|
+
["fill_color", ["000000"], []],
|
69
|
+
["line_width", [100.0], []],
|
70
|
+
["cap_style", [:butt], []],
|
71
|
+
["undash", [], []],
|
72
|
+
["save", [], []],
|
73
|
+
["fill", [], [
|
74
|
+
["join_style", [:bevel], []],
|
75
|
+
["move_to", [[0.0, 600.0]], []],
|
76
|
+
["line_to", [[10.0, 595.0]], []],
|
77
|
+
["line_to", [[0.0, 590.0]], []],
|
78
|
+
["close_path", [], []]
|
79
|
+
]
|
80
|
+
],
|
81
|
+
["restore", [], []],
|
82
|
+
]
|
83
|
+
]
|
84
|
+
]
|
85
|
+
],
|
86
|
+
["restore", [], []]
|
87
|
+
]
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -14,7 +14,7 @@ describe Prawn::SVG::Elements::Path do
|
|
14
14
|
|
15
15
|
it "correctly parses" do
|
16
16
|
calls = []
|
17
|
-
path.stub(:
|
17
|
+
path.stub(:parse_path_command) {|*args| calls << args}
|
18
18
|
path.parse
|
19
19
|
|
20
20
|
calls.should == [
|
@@ -40,7 +40,7 @@ describe Prawn::SVG::Elements::Path do
|
|
40
40
|
["m", [5,6,7,8]],
|
41
41
|
["l", [7,8]]
|
42
42
|
].each do |args|
|
43
|
-
path.should_receive(:
|
43
|
+
path.should_receive(:parse_path_command).with(*args).and_call_original
|
44
44
|
end
|
45
45
|
|
46
46
|
path.parse
|
@@ -81,9 +81,9 @@ describe Prawn::SVG::Elements::Path do
|
|
81
81
|
|
82
82
|
it "uses bezier curves to approximate an arc path" do
|
83
83
|
expect(subject).to eq [
|
84
|
-
[
|
85
|
-
[
|
86
|
-
[
|
84
|
+
Prawn::SVG::Elements::Path::Move.new([100.0, 200.0]),
|
85
|
+
Prawn::SVG::Elements::Path::Curve.new([150.0, 150.0], [100.0, 172.57081148225683], [122.57081148225683, 150.0]),
|
86
|
+
Prawn::SVG::Elements::Path::Curve.new([200.0, 200.0], [177.42918851774317, 150.0], [200.0, 172.57081148225683])
|
87
87
|
]
|
88
88
|
end
|
89
89
|
end
|
@@ -93,7 +93,7 @@ describe Prawn::SVG::Elements::Path do
|
|
93
93
|
|
94
94
|
it "ignores the path" do
|
95
95
|
expect(subject).to eq [
|
96
|
-
[
|
96
|
+
Prawn::SVG::Elements::Path::Move.new([100.0, 200.0]),
|
97
97
|
]
|
98
98
|
end
|
99
99
|
end
|
@@ -103,8 +103,8 @@ describe Prawn::SVG::Elements::Path do
|
|
103
103
|
|
104
104
|
it "substitutes a line_to" do
|
105
105
|
expect(subject).to eq [
|
106
|
-
[
|
107
|
-
[
|
106
|
+
Prawn::SVG::Elements::Path::Move.new([100.0, 200.0]),
|
107
|
+
Prawn::SVG::Elements::Path::Line.new([200.0, 200.0])
|
108
108
|
]
|
109
109
|
end
|
110
110
|
end
|
@@ -114,8 +114,8 @@ describe Prawn::SVG::Elements::Path do
|
|
114
114
|
|
115
115
|
it "substitutes a line_to" do
|
116
116
|
expect(subject).to eq [
|
117
|
-
[
|
118
|
-
[
|
117
|
+
Prawn::SVG::Elements::Path::Move.new([100.0, 200.0]),
|
118
|
+
Prawn::SVG::Elements::Path::Line.new([200.0, 200.0])
|
119
119
|
]
|
120
120
|
end
|
121
121
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Prawn::SVG::Elements::Polygon do
|
4
|
+
let(:document) { Prawn::SVG::Document.new(svg, [800, 600], {width: 800, height: 600}) }
|
5
|
+
|
6
|
+
subject do
|
7
|
+
Prawn::SVG::Elements::Polygon.new(document, document.root, [], Prawn::SVG::State.new)
|
8
|
+
end
|
9
|
+
|
10
|
+
context "with a valid points attribute" do
|
11
|
+
let(:svg) { '<polygon points="10 10 20,20 30,30" />' }
|
12
|
+
|
13
|
+
it "renders the polygon" do
|
14
|
+
subject.process
|
15
|
+
expect(subject.base_calls).to eq [
|
16
|
+
["fill", [], [
|
17
|
+
["move_to", [[10.0, 590.0]], []],
|
18
|
+
["line_to", [[20.0, 580.0]], []],
|
19
|
+
["line_to", [[30.0, 570.0]], []],
|
20
|
+
["close_path", [], []]]
|
21
|
+
]
|
22
|
+
]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context "with a polygon that has an odd number of arguments" do
|
27
|
+
let(:svg) { '<polygon points="10 10 20,20 30" />' }
|
28
|
+
|
29
|
+
it "ignores the last one" do
|
30
|
+
subject.process
|
31
|
+
expect(subject.base_calls).to eq [
|
32
|
+
["fill", [], [
|
33
|
+
["move_to", [[10.0, 590.0]], []],
|
34
|
+
["line_to", [[20.0, 580.0]], []],
|
35
|
+
["close_path", [], []]]
|
36
|
+
]
|
37
|
+
]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "with a polygon that has no arguments" do
|
42
|
+
let(:svg) { '<polygon points="" />' }
|
43
|
+
|
44
|
+
it "renders nothing" do
|
45
|
+
subject.process
|
46
|
+
expect(subject.base_calls).to eq []
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Prawn::SVG::Elements::Polyline do
|
4
|
+
let(:document) { Prawn::SVG::Document.new(svg, [800, 600], {width: 800, height: 600}) }
|
5
|
+
|
6
|
+
subject do
|
7
|
+
Prawn::SVG::Elements::Polyline.new(document, document.root, [], Prawn::SVG::State.new)
|
8
|
+
end
|
9
|
+
|
10
|
+
context "with a valid points attribute" do
|
11
|
+
let(:svg) { '<polyline points="10 10 20,20 30,30" />' }
|
12
|
+
|
13
|
+
it "renders the polyline" do
|
14
|
+
subject.process
|
15
|
+
expect(subject.base_calls).to eq [
|
16
|
+
["fill", [], [
|
17
|
+
["move_to", [[10.0, 590.0]], []],
|
18
|
+
["line_to", [[20.0, 580.0]], []],
|
19
|
+
["line_to", [[30.0, 570.0]], []]]
|
20
|
+
]
|
21
|
+
]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "with a polyline that has an odd number of arguments" do
|
26
|
+
let(:svg) { '<polyline points="10 10 20,20 30" />' }
|
27
|
+
|
28
|
+
it "ignores the last one" do
|
29
|
+
subject.process
|
30
|
+
expect(subject.base_calls).to eq [
|
31
|
+
["fill", [], [
|
32
|
+
["move_to", [[10.0, 590.0]], []],
|
33
|
+
["line_to", [[20.0, 580.0]], []]]
|
34
|
+
]
|
35
|
+
]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context "with a polyline that has no arguments" do
|
40
|
+
let(:svg) { '<polyline points="" />' }
|
41
|
+
|
42
|
+
it "renders nothing" do
|
43
|
+
subject.process
|
44
|
+
expect(subject.base_calls).to eq []
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -14,7 +14,7 @@ z</style>
|
|
14
14
|
end
|
15
15
|
|
16
16
|
let(:document) { Prawn::SVG::Document.new(svg, [800, 600], {}) }
|
17
|
-
let(:element) { Prawn::SVG::Elements::Style.new(document, document.root, [],
|
17
|
+
let(:element) { Prawn::SVG::Elements::Style.new(document, document.root, [], Prawn::SVG::State.new) }
|
18
18
|
|
19
19
|
it "correctly collects the style information in a <style> tag" do
|
20
20
|
expect(document.css_parser).to receive(:add_block!).with("a\n before>\n x y\n inside <>>\n k j\n after\nz")
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../../spec_helper'
|
2
2
|
|
3
3
|
describe Prawn::SVG::Elements::Text do
|
4
|
-
let(:document) { Prawn::SVG::Document.new(svg, [800, 600], {}) }
|
4
|
+
let(:document) { Prawn::SVG::Document.new(svg, [800, 600], {}, font_registry: Prawn::SVG::FontRegistry.new("Helvetica" => {:normal => nil}, "Courier" => {normal: nil}, 'Times-Roman' => {normal: nil})) }
|
5
5
|
let(:element) { Prawn::SVG::Elements::Text.new(document, document.root, [], Prawn::SVG::State.new) }
|
6
6
|
|
7
7
|
describe "xml:space preserve" do
|
@@ -14,7 +14,7 @@ describe Prawn::SVG::Elements::Text do
|
|
14
14
|
element.process
|
15
15
|
|
16
16
|
expect(element.calls).to eq [
|
17
|
-
["draw_text", ["some text", {:style=>
|
17
|
+
["draw_text", ["some text", {:size=>16, :style=>:normal, :text_anchor=>'start', :at=>[0.0, 150.0]}], []]
|
18
18
|
]
|
19
19
|
end
|
20
20
|
end
|
@@ -26,7 +26,7 @@ describe Prawn::SVG::Elements::Text do
|
|
26
26
|
element.process
|
27
27
|
|
28
28
|
expect(element.calls).to eq [
|
29
|
-
["draw_text", ["some text", {:style=>
|
29
|
+
["draw_text", ["some text", {:size=>16, :style=>:normal, :text_anchor=>'start', :at=>[0.0, 150.0]}], []]
|
30
30
|
]
|
31
31
|
end
|
32
32
|
end
|
@@ -34,10 +34,11 @@ describe Prawn::SVG::Elements::Text do
|
|
34
34
|
|
35
35
|
describe "when text-anchor is specified" do
|
36
36
|
let(:svg) { '<g text-anchor="middle" font-size="12"><text x="50" y="14">Text</text></g>' }
|
37
|
+
let(:element) { Prawn::SVG::Elements::Container.new(document, document.root, [], Prawn::SVG::State.new) }
|
37
38
|
|
38
39
|
it "should inherit text-anchor from parent element" do
|
39
40
|
element.process
|
40
|
-
expect(element.
|
41
|
+
expect(element.calls.flatten).to include(:size => 12.0, :style => :normal, :text_anchor => "middle", :at => [50.0, 136.0])
|
41
42
|
end
|
42
43
|
end
|
43
44
|
|
@@ -49,13 +50,44 @@ describe Prawn::SVG::Elements::Text do
|
|
49
50
|
|
50
51
|
expect(element.base_calls).to eq [
|
51
52
|
["fill", [], [
|
53
|
+
["font", ["Helvetica", {style: :normal}], []],
|
52
54
|
["text_group", [], [
|
53
55
|
["character_spacing", [5.0], [
|
54
|
-
["draw_text", ["spaced", {:style=>
|
56
|
+
["draw_text", ["spaced", {:size=>16, :style=>:normal, :text_anchor=>'start', :at=>[0.0, 150.0]}], []]
|
55
57
|
]]
|
56
58
|
]]
|
57
59
|
]]
|
58
60
|
]
|
59
61
|
end
|
60
62
|
end
|
63
|
+
|
64
|
+
describe "font finding" do
|
65
|
+
context "with a font that exists" do
|
66
|
+
let(:svg) { '<text font-family="monospace">hello</text>' }
|
67
|
+
|
68
|
+
it "finds the font and uses it" do
|
69
|
+
element.process
|
70
|
+
expect(element.base_calls[0][2][0]).to eq ['font', ['Courier', {style: :normal}], []]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "with a font that doesn't exist" do
|
75
|
+
let(:svg) { '<text font-family="does not exist">hello</text>' }
|
76
|
+
|
77
|
+
it "uses the fallback font" do
|
78
|
+
element.process
|
79
|
+
expect(element.base_calls[0][2][0]).to eq ['font', ['Times-Roman', {style: :normal}], []]
|
80
|
+
end
|
81
|
+
|
82
|
+
context "when there is no fallback font" do
|
83
|
+
before { document.font_registry.installed_fonts.delete("Times-Roman") }
|
84
|
+
|
85
|
+
it "doesn't call the font method and logs a warning" do
|
86
|
+
element.process
|
87
|
+
expect(element.base_calls.flatten).to_not include 'font'
|
88
|
+
expect(document.warnings.first).to include "is not a known font"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
61
93
|
end
|