prawn-svg 0.31.0 → 0.33.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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +35 -0
  3. data/README.md +8 -6
  4. data/lib/prawn/svg/attributes/stroke.rb +5 -0
  5. data/lib/prawn/svg/color.rb +46 -22
  6. data/lib/prawn/svg/css/selector_parser.rb +11 -11
  7. data/lib/prawn/svg/css/stylesheets.rb +4 -4
  8. data/lib/prawn/svg/document.rb +15 -2
  9. data/lib/prawn/svg/elements/base.rb +15 -16
  10. data/lib/prawn/svg/elements/call_duplicator.rb +1 -1
  11. data/lib/prawn/svg/elements/gradient.rb +2 -2
  12. data/lib/prawn/svg/elements/image.rb +6 -7
  13. data/lib/prawn/svg/elements/path.rb +0 -2
  14. data/lib/prawn/svg/elements/root.rb +1 -1
  15. data/lib/prawn/svg/elements/text_component.rb +10 -5
  16. data/lib/prawn/svg/gradients.rb +48 -0
  17. data/lib/prawn/svg/interface.rb +23 -8
  18. data/lib/prawn/svg/properties.rb +2 -0
  19. data/lib/prawn/svg/version.rb +1 -1
  20. data/lib/prawn-svg.rb +1 -0
  21. data/prawn-svg.gemspec +17 -15
  22. data/spec/integration_spec.rb +24 -24
  23. data/spec/prawn/svg/color_spec.rb +29 -16
  24. data/spec/prawn/svg/css/stylesheets_spec.rb +1 -19
  25. data/spec/prawn/svg/document_spec.rb +17 -0
  26. data/spec/prawn/svg/elements/base_spec.rb +15 -15
  27. data/spec/prawn/svg/elements/line_spec.rb +12 -12
  28. data/spec/prawn/svg/elements/marker_spec.rb +27 -27
  29. data/spec/prawn/svg/elements/polygon_spec.rb +9 -9
  30. data/spec/prawn/svg/elements/polyline_spec.rb +7 -7
  31. data/spec/prawn/svg/elements/root_spec.rb +28 -0
  32. data/spec/prawn/svg/elements/text_spec.rb +80 -53
  33. data/spec/prawn/svg/interface_spec.rb +10 -2
  34. data/spec/prawn/svg/pathable_spec.rb +4 -4
  35. data/spec/sample_svg/cmyk.svg +5 -0
  36. data/spec/sample_svg/gradients-cmyk.svg +40 -0
  37. data/spec/sample_svg/ordering.svg +12 -0
  38. data/spec/spec_helper.rb +2 -2
  39. metadata +53 -16
  40. data/.travis.yml +0 -8
@@ -15,7 +15,7 @@ describe Prawn::SVG::Elements::Text do
15
15
  it "converts newlines and tabs to spaces, and preserves spaces" do
16
16
  element.process
17
17
 
18
- expect(flatten_calls(element.calls)).to include ["draw_text", ["some text", {:size=>16, :style=>:normal, :text_anchor=>'start', :at=>[:relative, :relative], :offset=>[0,0]}]]
18
+ expect(flatten_calls(element.calls)).to include ["draw_text", ["some text"], {:size=>16, :style=>:normal, :text_anchor=>'start', :at=>[:relative, :relative], :offset=>[0,0]}]
19
19
  end
20
20
  end
21
21
 
@@ -25,7 +25,7 @@ describe Prawn::SVG::Elements::Text do
25
25
  it "strips space" do
26
26
  element.process
27
27
 
28
- expect(flatten_calls(element.calls)).to include ["draw_text", ["some text", {:size=>16, :style=>:normal, :text_anchor=>'start', :at=>[:relative, :relative], :offset=>[0,0]}]]
28
+ expect(flatten_calls(element.calls)).to include ["draw_text", ["some text"], {:size=>16, :style=>:normal, :text_anchor=>'start', :at=>[:relative, :relative], :offset=>[0,0]}]
29
29
  end
30
30
  end
31
31
  end
@@ -78,10 +78,10 @@ Even more
78
78
  element.process
79
79
 
80
80
  expect(element.base_calls).to eq [
81
- ["text_group", [], [
82
- ["font", ["Helvetica", {style: :normal}], []],
83
- ["character_spacing", [5.0], [
84
- ["draw_text", ["spaced", default_style], []]
81
+ ["text_group", [], {}, [
82
+ ["font", ["Helvetica"], {style: :normal}, []],
83
+ ["character_spacing", [5.0], {}, [
84
+ ["draw_text", ["spaced"], default_style, []]
85
85
  ]]
86
86
  ]]
87
87
  ]
@@ -95,9 +95,9 @@ Even more
95
95
  element.process
96
96
 
97
97
  expect(element.base_calls).to eq [
98
- ["text_group", [], [
99
- ["font", ["Helvetica", {:style=>:normal}], []],
100
- ["draw_text", ["underlined", default_style.merge(decoration: 'underline')], []]
98
+ ["text_group", [], {},[
99
+ ["font", ["Helvetica"], {:style=>:normal}, []],
100
+ ["draw_text", ["underlined"], default_style.merge(decoration: 'underline'), []]
101
101
  ]]
102
102
  ]
103
103
  end
@@ -111,11 +111,11 @@ Even more
111
111
  element.process
112
112
 
113
113
  expect(element.base_calls).to eq [
114
- ["text_group", [], [
115
- ["stroke_color", ["ff0000"], []],
116
- ["font", ["Helvetica", {style: :normal}], []],
117
- ["text_rendering_mode", [:stroke], [
118
- ["draw_text", ["stroked", default_style], []]
114
+ ["text_group", [], {}, [
115
+ ["stroke_color", ["ff0000"], {}, []],
116
+ ["font", ["Helvetica"], {style: :normal}, []],
117
+ ["text_rendering_mode", [:stroke], {}, [
118
+ ["draw_text", ["stroked"], default_style, []]
119
119
  ]]
120
120
  ]]
121
121
  ]
@@ -129,24 +129,24 @@ Even more
129
129
  element.process
130
130
 
131
131
  expect(element.base_calls).to eq [
132
- ["text_group", [], [
133
- ["stroke_color", ["ff0000"], []],
134
- ["font", ["Helvetica", {style: :normal}], []],
135
- ["text_rendering_mode", [:stroke], [
136
- ["draw_text", ["stroked ", default_style], []],
137
- ["save", [], []],
138
- ["fill_color", ["000000"], []],
139
- ["font", ["Helvetica", {style: :normal}], []],
140
- ["text_rendering_mode", [:fill_stroke], [
141
- ["draw_text", ["both", default_style], []]
132
+ ["text_group", [], {}, [
133
+ ["stroke_color", ["ff0000"], {}, []],
134
+ ["font", ["Helvetica"], {style: :normal}, []],
135
+ ["text_rendering_mode", [:stroke], {}, [
136
+ ["draw_text", ["stroked "], default_style, []],
137
+ ["save", [], {}, []],
138
+ ["fill_color", ["000000"], {}, []],
139
+ ["font", ["Helvetica"], {style: :normal}, []],
140
+ ["text_rendering_mode", [:fill_stroke], {}, [
141
+ ["draw_text", ["both"], default_style, []]
142
142
  ]],
143
- ["restore", [], []],
144
- ["save", [], []],
145
- ["font", ["Helvetica", {style: :normal}], []],
146
- ["text_rendering_mode", [:invisible], [
147
- ["draw_text", ["neither", default_style], []]
143
+ ["restore", [], {}, []],
144
+ ["save", [], {}, []],
145
+ ["font", ["Helvetica"], {style: :normal}, []],
146
+ ["text_rendering_mode", [:invisible], {}, [
147
+ ["draw_text", ["neither"], default_style, []]
148
148
  ]],
149
- ["restore", [], []],
149
+ ["restore", [], {}, []],
150
150
  ]]
151
151
  ]]
152
152
  ]
@@ -160,7 +160,7 @@ Even more
160
160
 
161
161
  it "finds the font and uses it" do
162
162
  element.process
163
- expect(flatten_calls(element.base_calls)).to include ['font', ['Courier', {style: :normal}]]
163
+ expect(flatten_calls(element.base_calls)).to include ['font', ['Courier'], {style: :normal}]
164
164
  end
165
165
  end
166
166
 
@@ -169,7 +169,7 @@ Even more
169
169
 
170
170
  it "uses the fallback font" do
171
171
  element.process
172
- expect(flatten_calls(element.base_calls)).to include ['font', ['Times-Roman', {style: :normal}]]
172
+ expect(flatten_calls(element.base_calls)).to include ['font', ['Times-Roman'], {style: :normal}]
173
173
  end
174
174
 
175
175
  context "when there is no fallback font" do
@@ -191,9 +191,9 @@ Even more
191
191
  it "references the text" do
192
192
  element.process
193
193
  expect(flatten_calls(element.base_calls)[9..11]).to eq [
194
- ["fill_color", ["ff0000"]],
195
- ["font", ["Helvetica", {:style=>:normal}]],
196
- ["draw_text", ["my reference text", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[10.0, :relative], :offset=>[0,0]}]],
194
+ ["fill_color", ["ff0000"], {}],
195
+ ["font", ["Helvetica"], {:style=>:normal}],
196
+ ["draw_text", ["my reference text"], {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[10.0, :relative], :offset=>[0,0]}],
197
197
  ]
198
198
  end
199
199
  end
@@ -205,11 +205,11 @@ Even more
205
205
  element.process
206
206
 
207
207
  expect(flatten_calls(element.base_calls)).to eq [
208
- ["text_group", []],
209
- ["font", ["Helvetica", {:style=>:normal}]],
210
- ["draw_text", ["H", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[10.0, :relative], :offset=>[30.0, 2.0]}]],
211
- ["draw_text", ["i", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[20.0, :relative], :offset=>[50.0, 0]}]],
212
- ["draw_text", [" there, this is a good test", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[80.0, 0]}]]
208
+ ["text_group", [], {}],
209
+ ["font", ["Helvetica"], {:style=>:normal}],
210
+ ["draw_text", ["H"], {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[10.0, :relative], :offset=>[30.0, 2.0]}],
211
+ ["draw_text", ["i"], {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[20.0, :relative], :offset=>[50.0, 0]}],
212
+ ["draw_text", [" there, this is a good test"], {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[80.0, 0]}]
213
213
  ]
214
214
  end
215
215
  end
@@ -221,19 +221,46 @@ Even more
221
221
  element.process
222
222
 
223
223
  expect(flatten_calls(element.base_calls)).to eq [
224
- ["text_group", []],
225
- ["font", ["Helvetica", {:style=>:normal}]],
226
- ["draw_text", ["H", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-10.0}]],
227
- ["draw_text", ["i", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-20.0}]],
228
- ["draw_text", [" ", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-30.0}]],
229
- ["save", []],
230
- ["font", ["Helvetica", {:style=>:normal}]],
231
- ["draw_text", ["this", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0]}]],
232
- ["restore", []],
233
- ["draw_text", [" ", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-80.0}]],
234
- ["draw_text", ["o", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-90.0}]],
235
- ["draw_text", ["k", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-100.0}]],
236
- ["draw_text", ["!", {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-100.0}]]
224
+ ["text_group", [], {}],
225
+ ["font", ["Helvetica"], {:style=>:normal}],
226
+ ["draw_text", ["H"], {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-10.0}],
227
+ ["draw_text", ["i"], {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-20.0}],
228
+ ["draw_text", [" "], {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-30.0}],
229
+ ["save", [], {}],
230
+ ["font", ["Helvetica"], {:style=>:normal}],
231
+ ["draw_text", ["this"], {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0]}],
232
+ ["restore", [], {}],
233
+ ["draw_text", [" "], {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-80.0}],
234
+ ["draw_text", ["o"], {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-90.0}],
235
+ ["draw_text", ["k"], {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-100.0}],
236
+ ["draw_text", ["!"], {:size=>16, :style=>:normal, :text_anchor=>"start", :at=>[:relative, :relative], :offset=>[0, 0], :rotate=>-100.0}]
237
+ ]
238
+ end
239
+ end
240
+
241
+ describe "when there's a comment inside the text element" do
242
+ let(:svg) { '<text>Hi <!-- comment --> there</text>' }
243
+
244
+ it "ignores the comment" do
245
+ element.process
246
+
247
+ expect(flatten_calls(element.calls)).to eq [
248
+ ["text_group", [], {}],
249
+ ["font", ["Helvetica"], {:style=>:normal}],
250
+ ["draw_text",
251
+ ["Hi "],
252
+ {:size=>16,
253
+ :style=>:normal,
254
+ :text_anchor=>"start",
255
+ :at=>[:relative, :relative],
256
+ :offset=>[0, 0]}],
257
+ ["draw_text",
258
+ ["there"],
259
+ {:size=>16,
260
+ :style=>:normal,
261
+ :text_anchor=>"start",
262
+ :at=>[:relative, :relative],
263
+ :offset=>[0, 0]}]
237
264
  ]
238
265
  end
239
266
  end
@@ -39,11 +39,19 @@ describe Prawn::SVG::Interface do
39
39
  end
40
40
 
41
41
  context "when fill_and_stroke is issued" do
42
+ def expect_rectangle
43
+ if RUBY_VERSION.start_with?("2.7.")
44
+ expect(prawn).to receive(:rectangle)
45
+ else
46
+ expect(prawn).to receive(:rectangle).with([0, 100], 10, 10)
47
+ end
48
+ end
49
+
42
50
  context "and fill rule is not set" do
43
51
  let(:interface) { Prawn::SVG::Interface.new('<svg width="250" height="100"><rect width="10" height="10" stroke="red"></rect></svg>', prawn, {}) }
44
52
 
45
53
  it "adds content 'B'" do
46
- expect(prawn).to receive(:rectangle).with([0, 100], 10, 10)
54
+ expect_rectangle
47
55
  expect(prawn).to receive(:add_content).with("W n")
48
56
  expect(prawn).to receive(:add_content).with("B")
49
57
  interface.draw
@@ -54,7 +62,7 @@ describe Prawn::SVG::Interface do
54
62
  let(:interface) { Prawn::SVG::Interface.new('<svg width="250" height="100"><rect width="10" height="10" stroke="red" fill-rule="evenodd"></rect></svg>', prawn, {}) }
55
63
 
56
64
  it "adds content 'B*'" do
57
- expect(prawn).to receive(:rectangle).with([0, 100], 10, 10)
65
+ expect_rectangle
58
66
  expect(prawn).to receive(:add_content).with("W n")
59
67
  expect(prawn).to receive(:add_content).with("B*")
60
68
  interface.draw
@@ -40,10 +40,10 @@ RSpec.describe Prawn::SVG::Pathable do
40
40
  subject.apply_commands
41
41
 
42
42
  expect(subject.base_calls).to eq [
43
- ["move_to", [[10.0, 590.0]], []],
44
- ["line_to", [[20.0, 580.0]], []],
45
- ["curve_to", [[30.0, 570.0], {bounds: [[25.0, 580.0], [25.0, 575.0]]}], []],
46
- ["close_path", [], []]
43
+ ["move_to", [[10.0, 590.0]], {}, []],
44
+ ["line_to", [[20.0, 580.0]], {}, []],
45
+ ["curve_to", [[30.0, 570.0]], {bounds: [[25.0, 580.0], [25.0, 575.0]]}, []],
46
+ ["close_path", [], {}, []]
47
47
  ]
48
48
  end
49
49
  end
@@ -0,0 +1,5 @@
1
+ <svg width="154" height="28" viewBox="0 0 154 28" xmlns="http://www.w3.org/2000/svg">
2
+ <g fill="device-cmyk(0.5, 50%, 0.0, 0)" fill-rule="evenodd">
3
+ <path d="m19.88 23.715-4.083 3.337a4.243 4.243 0 0 1-1.626-.965c-.463-.44-.768-.943-.915-1.508l-3.185 1.812c-.125.068-.336.138-.635.212a3.29 3.29 0 0 1-.754.11c-2.451 0-4.476-.841-6.073-2.524C1.011 22.506.212 20.168.212 17.175c0-2.846.83-5.192 2.491-7.039 1.66-1.847 3.777-2.77 6.353-2.77 1.027 0 1.988.203 2.88.61.892.407 1.479.768 1.762 1.084l2.948-1.067 1.034.305V19.92c0 1.016.178 1.824.533 2.422.354.599.91 1.057 1.667 1.373zm-7.166-2.541v-7.945a4.404 4.404 0 0 0-1.33-1.087c-.548-.303-1.217-.454-2.008-.454-1.141 0-2.086.416-2.837 1.248-.751.831-1.126 2.208-1.126 4.131 0 1.527.35 2.752 1.05 3.674.7.922 1.683 1.383 2.948 1.383.723 0 1.4-.113 2.033-.339.632-.227 1.055-.431 1.27-.611zM39.463 26.51h-3.947l-1.118-1.66-2.728 1.491c-.226.125-.553.217-.982.28a7.964 7.964 0 0 1-1.118.093c-2.666 0-4.69-.897-6.073-2.693s-2.081-4.049-2.092-6.759c-.011-2.937.822-5.274 2.499-7.014 1.677-1.739 3.894-2.609 6.649-2.609.79 0 1.485.062 2.083.187a5.903 5.903 0 0 1 1.728.661V.491h5.099V26.51zm-5.099-5.607v-8.03c-.283-.35-.751-.652-1.406-.906a5.855 5.855 0 0 0-2.134-.381c-1.423 0-2.482.415-3.177 1.245-.694.83-1.042 2.149-1.042 3.956 0 1.841.37 3.216 1.109 4.125.74.91 1.742 1.364 3.007 1.364.813 0 1.527-.135 2.143-.406.616-.271 1.116-.595 1.5-.967zM67.009 26.51h-5.184V15.075c0-.666-.237-1.256-.711-1.77-.475-.514-1.203-.771-2.186-.771-.938 0-1.722.195-2.354.584-.633.39-1.135.754-1.508 1.093V26.51h-5.184V8.299l5.184-.373v1.779l2.155-1.237a7.47 7.47 0 0 1 1.976-.805 8.464 8.464 0 0 1 2.01-.246c1.798 0 3.215.557 4.25 1.669 1.035 1.112 1.553 2.578 1.553 4.396V26.51h-.001zM89.303 17.057c0 2.993-.857 5.376-2.572 7.149-1.716 1.773-4.068 2.66-7.059 2.66-3.216 0-5.625-.892-7.227-2.677-1.603-1.784-2.404-4.162-2.404-7.132 0-2.699.863-5.008 2.59-6.929 1.726-1.92 4.073-2.88 7.041-2.88 2.979 0 5.328.887 7.05 2.66 1.72 1.774 2.581 4.156 2.581 7.149zm-5.252 0c0-1.479-.387-2.795-1.16-3.947-.773-1.152-1.844-1.728-3.21-1.728-1.57 0-2.694.525-3.372 1.575-.677 1.05-1.016 2.417-1.016 4.1 0 1.57.406 2.908 1.22 4.015.813 1.107 1.903 1.66 3.27 1.66 1.524 0 2.617-.449 3.278-1.347.66-.897.99-2.34.99-4.328zM101.145 23.325l-3.762 3.541c-1.559-.643-2.727-1.581-3.506-2.814-.779-1.233-1.17-2.708-1.17-4.42v-7.944H90.98V8.3h1.727V2.286l5.185-.373v6.404h2.71v3.354h-2.71v6.486c0 1.295.294 2.37.881 3.226.587.856 1.377 1.503 2.372 1.942zM121.981 23.715l-4.083 3.337a4.243 4.243 0 0 1-1.626-.965c-.464-.44-.769-.943-.915-1.508l-3.185 1.812c-.124.068-.337.138-.636.212a3.29 3.29 0 0 1-.754.11c-2.451 0-4.475-.841-6.072-2.524-1.599-1.683-2.398-4.021-2.398-7.014 0-2.846.83-5.192 2.491-7.039 1.66-1.847 3.777-2.77 6.353-2.77 1.027 0 1.988.203 2.88.61.892.407 1.479.768 1.762 1.084l2.948-1.067 1.033.305V19.92c0 1.016.178 1.824.533 2.422.355.598.913 1.057 1.669 1.373zm-7.166-2.541v-7.945a4.412 4.412 0 0 0-1.329-1.087c-.549-.303-1.218-.454-2.008-.454-1.141 0-2.087.416-2.838 1.248-.752.831-1.127 2.208-1.127 4.131 0 1.527.35 2.752 1.051 3.674.7.922 1.683 1.383 2.947 1.383.723 0 1.4-.113 2.033-.339.634-.227 1.057-.431 1.271-.611zM153.068 26.51h-5.15V15.075c0-.666-.229-1.256-.687-1.77-.457-.514-1.177-.771-2.159-.771-.803 0-1.52.155-2.152.466a4.972 4.972 0 0 0-1.592 1.211V26.51h-5.15V15.075c0-.666-.229-1.256-.686-1.77-.458-.514-1.178-.771-2.16-.771-.926 0-1.705.189-2.338.567-.633.378-1.096.749-1.389 1.11V26.51h-5.15V8.299l5.15-.373v1.779l2.016-1.237c.666-.406 1.32-.683 1.965-.83a8.86 8.86 0 0 1 1.965-.22c1.197 0 2.219.246 3.066.737a4.986 4.986 0 0 1 1.948 2.024l2.796-1.711a6.749 6.749 0 0 1 1.846-.788 8.17 8.17 0 0 1 2.084-.263c1.795 0 3.207.557 4.234 1.669 1.028 1.112 1.543 2.578 1.543 4.396V26.51zm0 0"/>
4
+ </g>
5
+ </svg>
@@ -0,0 +1,40 @@
1
+ <svg width="240" height="240" version="1.1" xmlns="http://www.w3.org/2000/svg">
2
+ <defs>
3
+ <style type="text/css"><![CDATA[
4
+ #rect1 { fill: url(#Gradient1); }
5
+ .stop1 { stop-color: device-cmyk(0, 1, 1, 0); }
6
+ .stop2 { stop-color: device-cmyk(0, 0, 0, 1); stop-opacity: 0; }
7
+ .stop3 { stop-color: device-cmyk(1, 0, 1, 0); }
8
+ ]]></style>
9
+ <linearGradient id="Gradient1">
10
+ <stop class="stop1" offset="0%"/>
11
+ <stop class="stop2" offset="50%"/>
12
+ <stop class="stop3" offset="100%"/>
13
+ </linearGradient>
14
+ <linearGradient id="Gradient2" x1="0" x2="0" y1="0" y2="1">
15
+ <stop offset="25%" stop-color="device-cmyk(0, 1, 1, 0)"/>
16
+ <stop offset="50%" stop-color="device-cmyk(0, 0, 0, 1)" stop-opacity="0"/>
17
+ <stop offset="75%" stop-color="device-cmyk(1, 0, 1, 0)"/>
18
+ </linearGradient>
19
+ <linearGradient id="Gradient3" x1="0" x2="1" y1="0" y2="1">
20
+ <stop offset="0%" stop-color="device-cmyk(0, 1, 1, 0)"/>
21
+ <stop offset="30%" stop-color="device-cmyk(1, 0, 1, 0)"/>
22
+ <stop offset="60%" stop-color="device-cmyk(1, 0, 1, 0)"/>
23
+ <stop offset="100%" stop-color="device-cmyk(1, 0, 1, 0)"/>
24
+ </linearGradient>
25
+ <linearGradient id="userspace" gradientUnits="userSpaceOnUse" x1="160" y1="90" x2="220" y2="90">
26
+ <stop offset="0" stop-color="device-cmyk(0, 1, 1, 0)"/>
27
+ <stop offset="1" stop-color="device-cmyk(1, 0, 1, 0)"/>
28
+ </linearGradient>
29
+ </defs>
30
+
31
+ <rect id="rect1" x="10" y="10" rx="15" ry="15" width="50" height="100" stroke="black"/>
32
+ <rect x="10" y="120" rx="15" ry="15" width="50" height="100" fill="url(#Gradient2)" stroke="black"/>
33
+ <circle cx="110" cy="40" r="30" stroke="black" fill="url(#Gradient3)"/>
34
+ <ellipse cx="110" cy="100" rx="30" ry="20" stroke="black" fill="url(#Gradient1)"/>
35
+ <line x1="65" y1="120" x2="200" y2="200" stroke="url(#Gradient3)" stroke-width="5"/>
36
+ <path d="M80,140l0,50l30,20l0-40z" stroke="url(#Gradient3)" fill="url(#Gradient1)" stroke-width="3"/>
37
+ <polygon points="150,30 170,80 190,55 200,10" fill="url(#Gradient1)"/>
38
+ <rect x="150" y="90" width="80" height="30" fill="url(#userspace)" stroke="black"/>
39
+ <polyline points="150,130 170,170 190,155 200,110" stroke="url(#Gradient1)" stroke-width="3" fill="none"/>
40
+ </svg>
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="177.649" height="244.929" version="1.1" viewBox="0 0 177.649 244.929" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <g transform="translate(-21.1667 -31.75)">
4
+ <rect x="21.1667" y="31.75" width="177.649" height="244.929" fill="url(#linearGradient18)" stroke-width=".264583"/>
5
+ </g>
6
+ <defs>
7
+ <linearGradient id="linearGradient18" x1="109.032" x2="109.74" y1="34.6919" y2="273.287" gradientUnits="userSpaceOnUse">
8
+ <stop stop-color="orange" offset="0"/>
9
+ <stop stop-color="blue" offset="1"/>
10
+ </linearGradient>
11
+ </defs>
12
+ </svg>
data/spec/spec_helper.rb CHANGED
@@ -10,8 +10,8 @@ module Support
10
10
  [].tap do |flattened_calls|
11
11
  add = -> (local_calls) do
12
12
  local_calls.each do |call|
13
- flattened_calls << call[0..1]
14
- add.call call[2]
13
+ flattened_calls << call[0..2]
14
+ add.call call[3]
15
15
  end
16
16
  end
17
17
 
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prawn-svg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.31.0
4
+ version: 0.33.0
5
5
  platform: ruby
6
6
  authors:
7
- - Roger Nesbitt
7
+ - Mog Nesbitt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-24 00:00:00.000000000 Z
11
+ date: 2023-12-16 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: css_parser
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: matrix
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.4.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.4.2
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: prawn
15
43
  requirement: !ruby/object:Gem::Requirement
@@ -31,58 +59,58 @@ dependencies:
31
59
  - !ruby/object:Gem::Version
32
60
  version: '3'
33
61
  - !ruby/object:Gem::Dependency
34
- name: css_parser
62
+ name: rexml
35
63
  requirement: !ruby/object:Gem::Requirement
36
64
  requirements:
37
65
  - - "~>"
38
66
  - !ruby/object:Gem::Version
39
- version: '1.6'
67
+ version: '3.2'
40
68
  type: :runtime
41
69
  prerelease: false
42
70
  version_requirements: !ruby/object:Gem::Requirement
43
71
  requirements:
44
72
  - - "~>"
45
73
  - !ruby/object:Gem::Version
46
- version: '1.6'
74
+ version: '3.2'
47
75
  - !ruby/object:Gem::Dependency
48
- name: rspec
76
+ name: rake
49
77
  requirement: !ruby/object:Gem::Requirement
50
78
  requirements:
51
79
  - - "~>"
52
80
  - !ruby/object:Gem::Version
53
- version: '3.0'
81
+ version: '13.0'
54
82
  type: :development
55
83
  prerelease: false
56
84
  version_requirements: !ruby/object:Gem::Requirement
57
85
  requirements:
58
86
  - - "~>"
59
87
  - !ruby/object:Gem::Version
60
- version: '3.0'
88
+ version: '13.0'
61
89
  - !ruby/object:Gem::Dependency
62
- name: rake
90
+ name: rspec
63
91
  requirement: !ruby/object:Gem::Requirement
64
92
  requirements:
65
93
  - - "~>"
66
94
  - !ruby/object:Gem::Version
67
- version: '13.0'
95
+ version: '3.0'
68
96
  type: :development
69
97
  prerelease: false
70
98
  version_requirements: !ruby/object:Gem::Requirement
71
99
  requirements:
72
100
  - - "~>"
73
101
  - !ruby/object:Gem::Version
74
- version: '13.0'
102
+ version: '3.0'
75
103
  description: This gem allows you to render SVG directly into a PDF using the 'prawn'
76
104
  gem. Since PDF is vector-based, you'll get nice scaled graphics if you use SVG
77
105
  instead of an image.
78
- email: roger@seriousorange.com
106
+ email: mog@seriousorange.com
79
107
  executables: []
80
108
  extensions: []
81
109
  extra_rdoc_files: []
82
110
  files:
111
+ - ".github/workflows/test.yml"
83
112
  - ".gitignore"
84
113
  - ".rspec"
85
- - ".travis.yml"
86
114
  - Gemfile
87
115
  - LICENSE
88
116
  - README.md
@@ -129,6 +157,7 @@ files:
129
157
  - lib/prawn/svg/extensions/additional_gradient_transforms.rb
130
158
  - lib/prawn/svg/font.rb
131
159
  - lib/prawn/svg/font_registry.rb
160
+ - lib/prawn/svg/gradients.rb
132
161
  - lib/prawn/svg/interface.rb
133
162
  - lib/prawn/svg/loaders/data.rb
134
163
  - lib/prawn/svg/loaders/file.rb
@@ -159,6 +188,7 @@ files:
159
188
  - spec/prawn/svg/elements/path_spec.rb
160
189
  - spec/prawn/svg/elements/polygon_spec.rb
161
190
  - spec/prawn/svg/elements/polyline_spec.rb
191
+ - spec/prawn/svg/elements/root_spec.rb
162
192
  - spec/prawn/svg/elements/text_spec.rb
163
193
  - spec/prawn/svg/font_registry_spec.rb
164
194
  - spec/prawn/svg/font_spec.rb
@@ -180,6 +210,7 @@ files:
180
210
  - spec/sample_svg/circle01.svg
181
211
  - spec/sample_svg/clip_path.svg
182
212
  - spec/sample_svg/close_path.svg
213
+ - spec/sample_svg/cmyk.svg
183
214
  - spec/sample_svg/cubic01.svg
184
215
  - spec/sample_svg/cubic01a.svg
185
216
  - spec/sample_svg/cubic02.svg
@@ -189,6 +220,7 @@ files:
189
220
  - spec/sample_svg/gistfile1.svg
190
221
  - spec/sample_svg/google_charts.svg
191
222
  - spec/sample_svg/gradient_transform.svg
223
+ - spec/sample_svg/gradients-cmyk.svg
192
224
  - spec/sample_svg/gradients.svg
193
225
  - spec/sample_svg/hidden_paths.svg
194
226
  - spec/sample_svg/highcharts.svg
@@ -207,6 +239,7 @@ files:
207
239
  - spec/sample_svg/offset_viewport.svg
208
240
  - spec/sample_svg/omnigraffle.svg
209
241
  - spec/sample_svg/opacity01.svg
242
+ - spec/sample_svg/ordering.svg
210
243
  - spec/sample_svg/path.svg
211
244
  - spec/sample_svg/pie_piece.svg
212
245
  - spec/sample_svg/polygon01.svg
@@ -256,14 +289,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
256
289
  requirements:
257
290
  - - ">="
258
291
  - !ruby/object:Gem::Version
259
- version: 2.1.0
292
+ version: 2.5.0
260
293
  required_rubygems_version: !ruby/object:Gem::Requirement
261
294
  requirements:
262
295
  - - ">="
263
296
  - !ruby/object:Gem::Version
264
297
  version: '0'
265
298
  requirements: []
266
- rubygems_version: 3.0.3
299
+ rubygems_version: 3.4.10
267
300
  signing_key:
268
301
  specification_version: 4
269
302
  summary: SVG renderer for Prawn PDF library
@@ -286,6 +319,7 @@ test_files:
286
319
  - spec/prawn/svg/elements/path_spec.rb
287
320
  - spec/prawn/svg/elements/polygon_spec.rb
288
321
  - spec/prawn/svg/elements/polyline_spec.rb
322
+ - spec/prawn/svg/elements/root_spec.rb
289
323
  - spec/prawn/svg/elements/text_spec.rb
290
324
  - spec/prawn/svg/font_registry_spec.rb
291
325
  - spec/prawn/svg/font_spec.rb
@@ -307,6 +341,7 @@ test_files:
307
341
  - spec/sample_svg/circle01.svg
308
342
  - spec/sample_svg/clip_path.svg
309
343
  - spec/sample_svg/close_path.svg
344
+ - spec/sample_svg/cmyk.svg
310
345
  - spec/sample_svg/cubic01.svg
311
346
  - spec/sample_svg/cubic01a.svg
312
347
  - spec/sample_svg/cubic02.svg
@@ -316,6 +351,7 @@ test_files:
316
351
  - spec/sample_svg/gistfile1.svg
317
352
  - spec/sample_svg/google_charts.svg
318
353
  - spec/sample_svg/gradient_transform.svg
354
+ - spec/sample_svg/gradients-cmyk.svg
319
355
  - spec/sample_svg/gradients.svg
320
356
  - spec/sample_svg/hidden_paths.svg
321
357
  - spec/sample_svg/highcharts.svg
@@ -334,6 +370,7 @@ test_files:
334
370
  - spec/sample_svg/offset_viewport.svg
335
371
  - spec/sample_svg/omnigraffle.svg
336
372
  - spec/sample_svg/opacity01.svg
373
+ - spec/sample_svg/ordering.svg
337
374
  - spec/sample_svg/path.svg
338
375
  - spec/sample_svg/pie_piece.svg
339
376
  - spec/sample_svg/polygon01.svg
data/.travis.yml DELETED
@@ -1,8 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.2.10
4
- - 2.3.8
5
- - 2.4.10
6
- - 2.5.8
7
- - 2.6.6
8
- - 2.7.1