prawn-svg 0.29.0 → 0.29.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 +2 -0
- data/README.md +4 -0
- data/lib/prawn/svg/css/stylesheets.rb +33 -13
- data/lib/prawn/svg/loaders/file.rb +1 -1
- data/lib/prawn/svg/version.rb +1 -1
- data/prawn-svg.gemspec +0 -1
- data/spec/prawn/svg/css/stylesheets_spec.rb +35 -6
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2dbf86f272347e8867b1e7262a49163c316d0160fc35802ceb1f7b0f8ed90e25
|
4
|
+
data.tar.gz: 4244134c0616eaf4aa9ca8ef19bbde2137e589d4f3929dd30b55c4c3d5136c36
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d1874a6766112c3084355c21b517b7a1d413f0e9e88c806cb236d69edc9fb7e1c3e253f13746c18e5e9b57d1221341d5c309494429dbae4a377ef91b99c8a52
|
7
|
+
data.tar.gz: bbd80743596ad9c2c25871c5c6542d2ddfb0c3026ac5d0efb61a894b501aabc6657e048f3d52b0b0e42e634e68b0d30f7e5096ce9bfdc81d4a7ffc7ac08d65e9
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -107,6 +107,10 @@ In CSS selectors you can use element names, IDs, classes, attributes (existence,
|
|
107
107
|
and all combinators (` `, `>`, `+`, `~`).
|
108
108
|
The pseudo-classes `:first-child`, `:last-child` and `:nth-child(n)` (where n is a number) also work.
|
109
109
|
|
110
|
+
Warning: Ruby versions less than 2.6.0 have a bug in the REXML XPath implementation which means under some
|
111
|
+
conditions the `+` combinator will not pick up all matching elements. See `stylesheets_spec.rb` for an
|
112
|
+
explanation if you're stuck on an old version of Ruby.
|
113
|
+
|
110
114
|
Pseudo-elements and the other pseudo-classes are not supported. Specificity ordering is
|
111
115
|
implemented, but `!important` is not.
|
112
116
|
|
@@ -65,20 +65,48 @@ module Prawn::SVG::CSS
|
|
65
65
|
def css_selector_to_xpath(selector)
|
66
66
|
selector.map do |element|
|
67
67
|
pseudo_classes = Set.new(element[:pseudo_class])
|
68
|
+
require_function_name = false
|
68
69
|
|
69
70
|
result = case element[:combinator]
|
70
71
|
when :child
|
71
|
-
|
72
|
+
"/"
|
72
73
|
when :adjacent
|
73
74
|
pseudo_classes << 'first-child'
|
74
|
-
|
75
|
+
"/following-sibling::"
|
75
76
|
when :siblings
|
76
|
-
|
77
|
+
"/following-sibling::"
|
77
78
|
else
|
78
|
-
|
79
|
+
"//"
|
79
80
|
end
|
80
81
|
|
81
|
-
|
82
|
+
positions = []
|
83
|
+
pseudo_classes.each do |pc|
|
84
|
+
case pc
|
85
|
+
when "first-child" then positions << '1'
|
86
|
+
when "last-child" then positions << 'last()'
|
87
|
+
when /^nth-child\((\d+)\)$/ then positions << $1
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
if !positions.empty?
|
92
|
+
result << "*" unless require_function_name
|
93
|
+
require_function_name = true
|
94
|
+
|
95
|
+
logic = if positions.length == 1
|
96
|
+
positions.first
|
97
|
+
else
|
98
|
+
positions.map { |position| "position()=#{position}" }.join(" and ")
|
99
|
+
end
|
100
|
+
|
101
|
+
result << "[#{logic}]"
|
102
|
+
end
|
103
|
+
|
104
|
+
if require_function_name
|
105
|
+
result << "[name()=#{xpath_quote element[:name]}]" if element[:name]
|
106
|
+
else
|
107
|
+
result << (element[:name] || '*')
|
108
|
+
end
|
109
|
+
|
82
110
|
result << ((element[:class] || []).map { |name| "[contains(concat(' ',@class,' '), ' #{name} ')]" }.join)
|
83
111
|
result << ((element[:id] || []).map { |name| "[@id='#{name}']" }.join)
|
84
112
|
|
@@ -101,14 +129,6 @@ module Prawn::SVG::CSS
|
|
101
129
|
end
|
102
130
|
end
|
103
131
|
|
104
|
-
pseudo_classes.each do |pc|
|
105
|
-
case pc
|
106
|
-
when "first-child" then result << "[1]"
|
107
|
-
when "last-child" then result << "[last()]"
|
108
|
-
when /^nth-child\((\d+)\)$/ then result << "[#{$1}]"
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
132
|
result
|
113
133
|
end.join
|
114
134
|
end
|
@@ -85,7 +85,7 @@ module Prawn::SVG::Loaders
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def assert_valid_file_uri!(uri)
|
88
|
-
|
88
|
+
unless uri.host.nil? || uri.host.empty?
|
89
89
|
raise Prawn::SVG::UrlLoader::Error, "prawn-svg does not suport file: URLs with a host. Your URL probably doesn't start with three slashes, and it should."
|
90
90
|
end
|
91
91
|
end
|
data/lib/prawn/svg/version.rb
CHANGED
data/prawn-svg.gemspec
CHANGED
@@ -6,7 +6,6 @@ Gem::Specification.new do |gem|
|
|
6
6
|
gem.version = Prawn::SVG::VERSION
|
7
7
|
gem.summary = "SVG renderer for Prawn PDF library"
|
8
8
|
gem.description = "This gem allows you to render SVG directly into a PDF using the 'prawn' gem. Since PDF is vector-based, you'll get nice scaled graphics if you use SVG instead of an image."
|
9
|
-
gem.has_rdoc = false
|
10
9
|
gem.author = "Roger Nesbitt"
|
11
10
|
gem.email = "roger@seriousorange.com"
|
12
11
|
gem.homepage = "http://github.com/mogest/prawn-svg"
|
@@ -11,6 +11,7 @@ RSpec.describe Prawn::SVG::CSS::Stylesheets do
|
|
11
11
|
rect { fill: #ff0000; }
|
12
12
|
rect ~ rect { fill: #330000; }
|
13
13
|
rect + rect { fill: #440000; }
|
14
|
+
rect:first-child:last-child { fill: #441234; }
|
14
15
|
|
15
16
|
circle:first-child { fill: #550000; }
|
16
17
|
circle:nth-child(2) { fill: #660000; }
|
@@ -37,9 +38,13 @@ RSpec.describe Prawn::SVG::CSS::Stylesheets do
|
|
37
38
|
<rect width="6" height="6" />
|
38
39
|
</g>
|
39
40
|
|
40
|
-
<circle width="
|
41
|
-
|
42
|
-
<
|
41
|
+
<circle width="100" />
|
42
|
+
|
43
|
+
<g id="circles">
|
44
|
+
<circle width="7" />
|
45
|
+
<circle width="8" />
|
46
|
+
<circle width="9" />
|
47
|
+
</g>
|
43
48
|
</g>
|
44
49
|
|
45
50
|
<square width="10" chocolate="hi there" />
|
@@ -56,13 +61,35 @@ RSpec.describe Prawn::SVG::CSS::Stylesheets do
|
|
56
61
|
result = Prawn::SVG::CSS::Stylesheets.new(CssParser::Parser.new, REXML::Document.new(svg)).load
|
57
62
|
width_and_styles = result.map { |k, v| [k.attributes["width"].to_i, v] }.sort_by(&:first)
|
58
63
|
|
59
|
-
|
64
|
+
expected = [
|
60
65
|
[1, [["fill", "#ff0000", false]]],
|
61
66
|
[2, [["fill", "#ff0000", false], ["fill", "#330000", false], ["fill", "#440000", false], ["fill", "#220000", false]]],
|
62
67
|
[3, [["fill", "#ff0000", false], ["fill", "#00ff00", false]]],
|
63
68
|
[4, [["fill", "#ff0000", false], ["fill", "#330000", false], ["fill", "#440000", false], ["fill", "#00ff00", false]]],
|
64
|
-
|
65
|
-
|
69
|
+
]
|
70
|
+
|
71
|
+
#
|
72
|
+
# Under ruby < 2.6, a bug in REXML causes the /following-sibling selector to
|
73
|
+
# only pick the first matching sibling. This means the + CSS combinator behaves
|
74
|
+
# incorrectly in the following example:
|
75
|
+
#
|
76
|
+
# <a>
|
77
|
+
# <b a="1" />
|
78
|
+
# <b a="2" />
|
79
|
+
# <b a="3" />
|
80
|
+
# </a>
|
81
|
+
#
|
82
|
+
# The css selector `a b + b` will only pick the second <b>, whereas it should
|
83
|
+
# pick both the second and third <b> elements.
|
84
|
+
#
|
85
|
+
if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.6.0')
|
86
|
+
expected << [5, [["fill", "#ff0000", false], ["fill", "#330000", false], ["fill", "#330000", false], ["fill", "#00ff00", false]]]
|
87
|
+
else
|
88
|
+
expected << [5, [["fill", "#ff0000", false], ["fill", "#330000", false], ["fill", "#330000", false], ["fill", "#440000", false], ["fill", "#00ff00", false]]]
|
89
|
+
end
|
90
|
+
|
91
|
+
expected.concat [
|
92
|
+
[6, [["fill", "#ff0000", false], ["fill", "#441234", false], ["fill", "#0000ff", false]]],
|
66
93
|
[7, [["fill", "#550000", false]]],
|
67
94
|
[8, [["fill", "#660000", false]]],
|
68
95
|
[9, [["fill", "#770000", false]]],
|
@@ -74,6 +101,8 @@ RSpec.describe Prawn::SVG::CSS::Stylesheets do
|
|
74
101
|
[15, [["fill", "#dd0000", false]]],
|
75
102
|
[16, [["fill", "#ee0000", false]]],
|
76
103
|
]
|
104
|
+
|
105
|
+
expect(width_and_styles).to eq(expected)
|
77
106
|
end
|
78
107
|
end
|
79
108
|
|
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.29.
|
4
|
+
version: 0.29.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roger Nesbitt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-02-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: prawn
|
@@ -250,8 +250,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
250
250
|
- !ruby/object:Gem::Version
|
251
251
|
version: '0'
|
252
252
|
requirements: []
|
253
|
-
|
254
|
-
rubygems_version: 2.7.6
|
253
|
+
rubygems_version: 3.0.1
|
255
254
|
signing_key:
|
256
255
|
specification_version: 4
|
257
256
|
summary: SVG renderer for Prawn PDF library
|