prawn-svg 0.21.0 → 0.22.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d93ba261ddc059e43122549f72a3e3daa676171f
|
4
|
+
data.tar.gz: d0497cb84295f9202f84c62b5db79f9d29608019
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: acf2f6d51a5fda648bed5efd25ba85de91887867badccde3ce4d713cebddcc851280d524ba3006d7014651cd73ccf8c5a54185038a41dfa37612b522cb99ea17
|
7
|
+
data.tar.gz: 2dc23eac65fc5be3299015309d8e2f94d5598ba016f7776090f886fe9bd4551ae90bd129252428b65b617bf8472ca4adcf9cdc5760f3e5f3f635793415d09622
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,12 +1,16 @@
|
|
1
1
|
# prawn-svg
|
2
2
|
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/prawn-svg.svg)](https://badge.fury.io/rb/prawn-svg)
|
4
|
+
[![Build Status](https://travis-ci.org/mogest/prawn-svg.svg?branch=master)](https://travis-ci.org/mogest/prawn-svg)
|
5
|
+
|
3
6
|
An SVG renderer for the Prawn PDF library.
|
4
7
|
|
5
8
|
This will take an SVG file as input and render it into your PDF. Find out more about the Prawn PDF library at:
|
6
9
|
|
7
10
|
http://wiki.github.com/sandal/prawn/
|
8
11
|
|
9
|
-
prawn-svg is compatible with all versions of Prawn from 0.
|
12
|
+
prawn-svg is compatible with all versions of Prawn from 0.11.1 onwards, including the 1.x and 2.x series.
|
13
|
+
The minimum Ruby version required is 2.0.0.
|
10
14
|
|
11
15
|
## Using prawn-svg
|
12
16
|
|
@@ -49,10 +53,13 @@ prawn-svg supports most but not all of the full SVG 1.1 specification. It curre
|
|
49
53
|
|
50
54
|
- <tt><style></tt> plus <tt>id</tt>, <tt>class</tt> and <tt>style</tt> attributes (see CSS section below)
|
51
55
|
|
52
|
-
- <tt><image></tt> with <tt>http:</tt>, <tt>https:</tt> and <tt>data:image
|
56
|
+
- <tt><image></tt> with <tt>http:</tt>, <tt>https:</tt> and <tt>data:image/\*;base64</tt> schemes
|
53
57
|
|
54
58
|
- <tt><clipPath></tt>
|
55
59
|
|
60
|
+
- <tt><linearGradient></tt> but only with Prawn 2.0.4+. gradientTransform, spreadMethod and stop-opacity are
|
61
|
+
unimplemented.
|
62
|
+
|
56
63
|
- attributes/styles: <tt>fill</tt>, <tt>stroke</tt>, <tt>stroke-width</tt>, <tt>stroke-linecap</tt>, <tt>stroke-dasharray</tt>, <tt>opacity</tt>, <tt>fill-opacity</tt>, <tt>stroke-opacity</tt>, <tt>transform</tt>, <tt>clip-path</tt>, <tt>display</tt>
|
57
64
|
|
58
65
|
- the <tt>viewBox</tt> attribute on the <tt><svg></tt> tag
|
@@ -73,7 +80,7 @@ prawn-svg uses the css_parser gem to parse CSS <tt><style></tt> blocks. I
|
|
73
80
|
|
74
81
|
## Not supported
|
75
82
|
|
76
|
-
prawn-svg does not support external <tt>url()</tt> references, measurements in <tt>en</tt> or <tt>em</tt>, sub-viewports, gradients
|
83
|
+
prawn-svg does not support external <tt>url()</tt> references, measurements in <tt>en</tt> or <tt>em</tt>, sub-viewports, radial gradients, patterns or markers.
|
77
84
|
|
78
85
|
## Configuration
|
79
86
|
|
@@ -83,7 +90,7 @@ By default, prawn-svg has a fonts path of <tt>["/Library/Fonts", "/System/Librar
|
|
83
90
|
Mac OS X and Debian Linux users. You can add to the font path:
|
84
91
|
|
85
92
|
```ruby
|
86
|
-
Prawn::
|
93
|
+
Prawn::SVG::Interface.font_path << "/my/font/directory"
|
87
94
|
```
|
88
95
|
|
89
96
|
|
data/lib/prawn-svg.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'rexml/document'
|
2
|
+
|
1
3
|
require 'prawn'
|
2
4
|
require 'prawn/svg/version'
|
3
5
|
|
@@ -6,14 +8,15 @@ require 'prawn/svg/calculators/document_sizing'
|
|
6
8
|
require 'prawn/svg/calculators/pixels'
|
7
9
|
require 'prawn/svg/url_loader'
|
8
10
|
require 'prawn/svg/color'
|
11
|
+
require 'prawn/svg/attributes'
|
12
|
+
require 'prawn/svg/elements'
|
9
13
|
require 'prawn/svg/extension'
|
10
14
|
require 'prawn/svg/interface'
|
11
15
|
require 'prawn/svg/font'
|
12
16
|
require 'prawn/svg/document'
|
13
|
-
require 'prawn/svg/element'
|
14
|
-
require 'prawn/svg/parser'
|
15
|
-
require 'prawn/svg/parser/path'
|
16
|
-
require 'prawn/svg/parser/text'
|
17
|
-
require 'prawn/svg/parser/image'
|
18
17
|
|
19
|
-
|
18
|
+
module Prawn
|
19
|
+
Svg = SVG # backwards compatibility
|
20
|
+
end
|
21
|
+
|
22
|
+
Prawn::Document.extensions << Prawn::SVG::Extension
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Prawn::SVG::Attributes::ClipPath
|
2
|
+
def parse_clip_path_attribute_and_call
|
3
|
+
return unless clip_path = attributes['clip-path']
|
4
|
+
|
5
|
+
if (matches = clip_path.strip.match(/\Aurl\(#(.*)\)\z/)).nil?
|
6
|
+
document.warnings << "Only clip-path attributes with the form 'url(#xxx)' are supported"
|
7
|
+
elsif (clip_path_element = @document.elements_by_id[matches[1]]).nil?
|
8
|
+
document.warnings << "clip-path ID '#{matches[1]}' not defined"
|
9
|
+
elsif clip_path_element.source.name != "clipPath"
|
10
|
+
document.warnings << "clip-path ID '#{matches[1]}' does not point to a clipPath tag"
|
11
|
+
else
|
12
|
+
add_call_and_enter 'save_graphics_state'
|
13
|
+
add_calls_from_element clip_path_element
|
14
|
+
add_call "clip"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Prawn::SVG::Attributes::Font
|
2
|
+
def parse_font_attributes_and_call
|
3
|
+
if size = attributes['font-size']
|
4
|
+
@state[:font_size] = size.to_f
|
5
|
+
end
|
6
|
+
if weight = attributes['font-weight']
|
7
|
+
font_updated = true
|
8
|
+
@state[:font_weight] = Prawn::SVG::Font.weight_for_css_font_weight(weight)
|
9
|
+
end
|
10
|
+
if style = attributes['font-style']
|
11
|
+
font_updated = true
|
12
|
+
@state[:font_style] = style == 'italic' ? :italic : nil
|
13
|
+
end
|
14
|
+
if (family = attributes['font-family']) && family.strip != ""
|
15
|
+
font_updated = true
|
16
|
+
@state[:font_family] = family
|
17
|
+
end
|
18
|
+
if (anchor = attributes['text-anchor'])
|
19
|
+
@state[:text_anchor] = anchor
|
20
|
+
end
|
21
|
+
|
22
|
+
if @state[:font_family] && font_updated
|
23
|
+
usable_font_families = [@state[:font_family], document.fallback_font_name]
|
24
|
+
|
25
|
+
font_used = usable_font_families.compact.detect do |name|
|
26
|
+
if font = Prawn::SVG::Font.load(name, @state[:font_weight], @state[:font_style])
|
27
|
+
@state[:font_subfamily] = font.subfamily
|
28
|
+
add_call_and_enter 'font', font.name, :style => @state[:font_subfamily]
|
29
|
+
true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
if font_used.nil?
|
34
|
+
warnings << "Font family '#{@state[:font_family]}' style '#{@state[:font_style] || 'normal'}' is not a known font, and the fallback font could not be found."
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Prawn::SVG::Attributes::Opacity
|
2
|
+
def parse_opacity_attributes_and_call
|
3
|
+
# We can't do nested opacities quite like the SVG requires, but this is close enough.
|
4
|
+
fill_opacity = stroke_opacity = clamp(attributes['opacity'].to_f, 0, 1) if attributes['opacity']
|
5
|
+
fill_opacity = clamp(attributes['fill-opacity'].to_f, 0, 1) if attributes['fill-opacity']
|
6
|
+
stroke_opacity = clamp(attributes['stroke-opacity'].to_f, 0, 1) if attributes['stroke-opacity']
|
7
|
+
|
8
|
+
if fill_opacity || stroke_opacity
|
9
|
+
state[:fill_opacity] = (state[:fill_opacity] || 1) * (fill_opacity || 1)
|
10
|
+
state[:stroke_opacity] = (state[:stroke_opacity] || 1) * (stroke_opacity || 1)
|
11
|
+
|
12
|
+
add_call_and_enter 'transparent', state[:fill_opacity], state[:stroke_opacity]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Prawn::SVG::Attributes::Stroke
|
2
|
+
CAP_STYLE_TRANSLATIONS = {"butt" => :butt, "round" => :round, "square" => :projecting_square}
|
3
|
+
|
4
|
+
def parse_stroke_attributes_and_call
|
5
|
+
if width = attributes['stroke-width']
|
6
|
+
add_call('line_width', distance(width))
|
7
|
+
end
|
8
|
+
|
9
|
+
if (linecap = attribute_value_as_keyword('stroke-linecap')) && linecap != 'inherit'
|
10
|
+
add_call('cap_style', CAP_STYLE_TRANSLATIONS.fetch(linecap, :butt))
|
11
|
+
end
|
12
|
+
|
13
|
+
if dasharray = attribute_value_as_keyword('stroke-dasharray')
|
14
|
+
case dasharray
|
15
|
+
when 'inherit'
|
16
|
+
# don't do anything
|
17
|
+
when 'none'
|
18
|
+
add_call('undash')
|
19
|
+
else
|
20
|
+
array = dasharray.split(Prawn::SVG::Elements::COMMA_WSP_REGEXP)
|
21
|
+
array *= 2 if array.length % 2 == 1
|
22
|
+
number_array = array.map {|value| distance(value)}
|
23
|
+
|
24
|
+
if number_array.any? {|number| number < 0}
|
25
|
+
@document.warnings << "stroke-dasharray cannot have negative numbers; treating as 'none'"
|
26
|
+
add_call('undash')
|
27
|
+
elsif number_array.inject(0) {|a, b| a + b} == 0
|
28
|
+
add_call('undash')
|
29
|
+
else
|
30
|
+
add_call('dash', number_array)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Prawn::SVG::Attributes::Transform
|
2
|
+
def parse_transform_attribute_and_call
|
3
|
+
return unless transform = attributes['transform']
|
4
|
+
|
5
|
+
parse_css_method_calls(transform).each do |name, arguments|
|
6
|
+
case name
|
7
|
+
when 'translate'
|
8
|
+
x, y = arguments
|
9
|
+
add_call_and_enter name, distance(x.to_f, :x), -distance(y.to_f, :y)
|
10
|
+
|
11
|
+
when 'rotate'
|
12
|
+
r, x, y = arguments.collect {|a| a.to_f}
|
13
|
+
case arguments.length
|
14
|
+
when 1
|
15
|
+
add_call_and_enter name, -r, :origin => [0, y('0')]
|
16
|
+
when 3
|
17
|
+
add_call_and_enter name, -r, :origin => [x(x), y(y)]
|
18
|
+
else
|
19
|
+
warnings << "transform 'rotate' must have either one or three arguments"
|
20
|
+
end
|
21
|
+
|
22
|
+
when 'scale'
|
23
|
+
x_scale = arguments[0].to_f
|
24
|
+
y_scale = (arguments[1] || x_scale).to_f
|
25
|
+
add_call_and_enter "transformation_matrix", x_scale, 0, 0, y_scale, 0, 0
|
26
|
+
|
27
|
+
when 'matrix'
|
28
|
+
if arguments.length != 6
|
29
|
+
warnings << "transform 'matrix' must have six arguments"
|
30
|
+
else
|
31
|
+
a, b, c, d, e, f = arguments.collect {|argument| argument.to_f}
|
32
|
+
add_call_and_enter "transformation_matrix", a, -b, -c, d, distance(e, :x), -distance(f, :y)
|
33
|
+
end
|
34
|
+
|
35
|
+
else
|
36
|
+
warnings << "Unknown transformation '#{name}'; ignoring"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def parse_css_method_calls(string)
|
44
|
+
string.scan(/\s*(\w+)\(([^)]+)\)\s*/).collect do |call|
|
45
|
+
name, argument_string = call
|
46
|
+
arguments = argument_string.strip.split(/\s*[,\s]\s*/)
|
47
|
+
[name, arguments]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module Prawn::
|
1
|
+
module Prawn::SVG::Calculators
|
2
2
|
class DocumentSizing
|
3
3
|
DEFAULT_WIDTH = 300
|
4
4
|
DEFAULT_HEIGHT = 150
|
@@ -34,7 +34,7 @@ module Prawn::Svg::Calculators
|
|
34
34
|
@output_height = Pixels.to_pixels(@document_height || @requested_height, container_height)
|
35
35
|
|
36
36
|
if @view_box
|
37
|
-
values = @view_box.strip.split(Prawn::
|
37
|
+
values = @view_box.strip.split(Prawn::SVG::Elements::COMMA_WSP_REGEXP)
|
38
38
|
@x_offset, @y_offset, @viewport_width, @viewport_height = values.map {|value| value.to_f}
|
39
39
|
@x_offset = -@x_offset
|
40
40
|
|
data/lib/prawn/svg/color.rb
CHANGED
@@ -1,5 +1,17 @@
|
|
1
|
-
class Prawn::
|
2
|
-
|
1
|
+
class Prawn::SVG::Color
|
2
|
+
class Hex
|
3
|
+
attr_reader :value
|
4
|
+
|
5
|
+
def initialize(value)
|
6
|
+
@value = value
|
7
|
+
end
|
8
|
+
|
9
|
+
def ==(other)
|
10
|
+
value == other.value
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
DEFAULT_COLOR = Hex.new("000000")
|
3
15
|
|
4
16
|
HTML_COLORS = {
|
5
17
|
'aliceblue' => 'f0f8ff',
|
@@ -153,34 +165,52 @@ class Prawn::Svg::Color
|
|
153
165
|
|
154
166
|
RGB_VALUE_REGEXP = "\s*(-?[0-9.]+%?)\s*"
|
155
167
|
RGB_REGEXP = /\Argb\(#{RGB_VALUE_REGEXP},#{RGB_VALUE_REGEXP},#{RGB_VALUE_REGEXP}\)\z/i
|
156
|
-
URL_REGEXP = /\Aurl\([^)]
|
168
|
+
URL_REGEXP = /\Aurl\(([^)]*)\)\z/i
|
157
169
|
|
158
|
-
def self.
|
170
|
+
def self.parse(color_string, gradients = nil)
|
159
171
|
url_specified = false
|
160
172
|
|
161
|
-
|
173
|
+
components = color_string.to_s.strip.scan(/([^(\s]+(\([^)]*\))?)/)
|
174
|
+
|
175
|
+
result = components.map do |color, *_|
|
162
176
|
if m = color.match(/\A#([0-9a-f])([0-9a-f])([0-9a-f])\z/i)
|
163
|
-
|
177
|
+
Hex.new("#{m[1] * 2}#{m[2] * 2}#{m[3] * 2}")
|
178
|
+
|
164
179
|
elsif color.match(/\A#[0-9a-f]{6}\z/i)
|
165
|
-
|
180
|
+
Hex.new(color[1..6])
|
181
|
+
|
166
182
|
elsif hex = HTML_COLORS[color.downcase]
|
167
|
-
|
183
|
+
Hex.new(hex)
|
184
|
+
|
168
185
|
elsif m = color.match(RGB_REGEXP)
|
169
|
-
|
186
|
+
hex = (1..3).collect do |n|
|
170
187
|
value = m[n].to_f
|
171
188
|
value *= 2.55 if m[n][-1..-1] == '%'
|
172
189
|
"%02x" % clamp(value.round, 0, 255)
|
173
190
|
end.join
|
174
|
-
|
191
|
+
|
192
|
+
Hex.new(hex)
|
193
|
+
|
194
|
+
elsif matches = color.match(URL_REGEXP)
|
175
195
|
url_specified = true
|
176
|
-
|
196
|
+
url = matches[1]
|
197
|
+
if url[0] == "#" && gradients && gradient = gradients[url[1..-1]]
|
198
|
+
gradient
|
199
|
+
end
|
177
200
|
end
|
178
201
|
end
|
179
202
|
|
180
|
-
#
|
181
|
-
|
203
|
+
# Generally, we default to black if the colour was unparseable.
|
204
|
+
# http://www.w3.org/TR/SVG/painting.html section 11.2 says if a URL was
|
205
|
+
# supplied without a fallback, that's an error.
|
206
|
+
result << DEFAULT_COLOR unless url_specified
|
207
|
+
|
208
|
+
result.compact
|
209
|
+
end
|
182
210
|
|
183
|
-
|
211
|
+
def self.color_to_hex(color)
|
212
|
+
result = parse(color).detect {|result| result.is_a?(Hex)}
|
213
|
+
result.value if result
|
184
214
|
end
|
185
215
|
|
186
216
|
protected
|
data/lib/prawn/svg/document.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
class Prawn::
|
1
|
+
class Prawn::SVG::Document
|
2
2
|
begin
|
3
3
|
require 'css_parser'
|
4
4
|
CSS_PARSER_LOADED = true
|
@@ -15,7 +15,7 @@ class Prawn::Svg::Document
|
|
15
15
|
attr_reader :root,
|
16
16
|
:sizing,
|
17
17
|
:cache_images, :fallback_font_name,
|
18
|
-
:css_parser, :elements_by_id
|
18
|
+
:css_parser, :elements_by_id, :gradients
|
19
19
|
|
20
20
|
def initialize(data, bounds, options)
|
21
21
|
@css_parser = CssParser::Parser.new if CSS_PARSER_LOADED
|
@@ -24,10 +24,11 @@ class Prawn::Svg::Document
|
|
24
24
|
@warnings = []
|
25
25
|
@options = options
|
26
26
|
@elements_by_id = {}
|
27
|
+
@gradients = {}
|
27
28
|
@cache_images = options[:cache_images]
|
28
29
|
@fallback_font_name = options.fetch(:fallback_font_name, DEFAULT_FALLBACK_FONT_NAME)
|
29
30
|
|
30
|
-
@sizing = Prawn::
|
31
|
+
@sizing = Prawn::SVG::Calculators::DocumentSizing.new(bounds, @root.attributes)
|
31
32
|
sizing.requested_width = options[:width]
|
32
33
|
sizing.requested_height = options[:height]
|
33
34
|
sizing.calculate
|
@@ -50,10 +51,10 @@ class Prawn::Svg::Document
|
|
50
51
|
end
|
51
52
|
|
52
53
|
def points(value, axis = nil)
|
53
|
-
Prawn::
|
54
|
+
Prawn::SVG::Calculators::Pixels.to_pixels(value, @axis_to_size.fetch(axis, sizing.viewport_diagonal))
|
54
55
|
end
|
55
56
|
|
56
57
|
def url_loader
|
57
|
-
@url_loader ||= Prawn::
|
58
|
+
@url_loader ||= Prawn::SVG::UrlLoader.new(:enable_cache => cache_images)
|
58
59
|
end
|
59
60
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Prawn::SVG::Elements
|
2
|
+
COMMA_WSP_REGEXP = /(?:\s+,?\s*|,\s*)/
|
3
|
+
end
|
4
|
+
|
5
|
+
%w(base root container style text line polyline polygon circle ellipse rect path use image gradient ignored).each do |filename|
|
6
|
+
require "prawn/svg/elements/#{filename}"
|
7
|
+
end
|
8
|
+
|
9
|
+
module Prawn::SVG::Elements
|
10
|
+
TAG_CLASS_MAPPING = {
|
11
|
+
svg: Prawn::SVG::Elements::Container,
|
12
|
+
g: Prawn::SVG::Elements::Container,
|
13
|
+
symbol: Prawn::SVG::Elements::Container,
|
14
|
+
defs: Prawn::SVG::Elements::Container,
|
15
|
+
clipPath: Prawn::SVG::Elements::Container,
|
16
|
+
style: Prawn::SVG::Elements::Style,
|
17
|
+
text: Prawn::SVG::Elements::Text,
|
18
|
+
line: Prawn::SVG::Elements::Line,
|
19
|
+
polyline: Prawn::SVG::Elements::Polyline,
|
20
|
+
polygon: Prawn::SVG::Elements::Polygon,
|
21
|
+
circle: Prawn::SVG::Elements::Circle,
|
22
|
+
ellipse: Prawn::SVG::Elements::Ellipse,
|
23
|
+
rect: Prawn::SVG::Elements::Rect,
|
24
|
+
path: Prawn::SVG::Elements::Path,
|
25
|
+
use: Prawn::SVG::Elements::Use,
|
26
|
+
image: Prawn::SVG::Elements::Image,
|
27
|
+
linearGradient: Prawn::SVG::Elements::Gradient,
|
28
|
+
title: Prawn::SVG::Elements::Ignored,
|
29
|
+
desc: Prawn::SVG::Elements::Ignored,
|
30
|
+
metadata: Prawn::SVG::Elements::Ignored,
|
31
|
+
:"font-face" => Prawn::SVG::Elements::Ignored,
|
32
|
+
}
|
33
|
+
end
|