prawn-svg 0.34.2 → 0.35.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/.github/workflows/lint.yml +19 -0
- data/.github/workflows/test.yml +14 -27
- data/.gitignore +0 -1
- data/.rubocop.yml +86 -0
- data/.rubocop_todo.yml +51 -0
- data/Gemfile +4 -3
- data/Gemfile.lock +81 -0
- data/README.md +1 -1
- data/Rakefile +1 -1
- data/lib/prawn/svg/attributes/clip_path.rb +3 -3
- data/lib/prawn/svg/attributes/opacity.rb +3 -3
- data/lib/prawn/svg/attributes/stroke.rb +9 -9
- data/lib/prawn/svg/attributes/transform.rb +2 -2
- data/lib/prawn/svg/attributes.rb +1 -1
- data/lib/prawn/svg/calculators/arc_to_bezier_curve.rb +17 -15
- data/lib/prawn/svg/calculators/aspect_ratio.rb +16 -14
- data/lib/prawn/svg/calculators/document_sizing.rb +9 -10
- data/lib/prawn/svg/calculators/pixels.rb +8 -5
- data/lib/prawn/svg/color.rb +209 -212
- data/lib/prawn/svg/css/font_family_parser.rb +2 -2
- data/lib/prawn/svg/css/selector_parser.rb +39 -35
- data/lib/prawn/svg/css/stylesheets.rb +24 -24
- data/lib/prawn/svg/css/values_parser.rb +68 -0
- data/lib/prawn/svg/document.rb +6 -5
- data/lib/prawn/svg/elements/base.rb +29 -34
- data/lib/prawn/svg/elements/circle.rb +4 -4
- data/lib/prawn/svg/elements/clip_path.rb +0 -1
- data/lib/prawn/svg/elements/depth_first_base.rb +6 -6
- data/lib/prawn/svg/elements/ellipse.rb +3 -4
- data/lib/prawn/svg/elements/gradient.rb +49 -51
- data/lib/prawn/svg/elements/image.rb +5 -5
- data/lib/prawn/svg/elements/marker.rb +5 -5
- data/lib/prawn/svg/elements/path.rb +46 -47
- data/lib/prawn/svg/elements/polygon.rb +1 -1
- data/lib/prawn/svg/elements/polyline.rb +2 -2
- data/lib/prawn/svg/elements/rect.rb +3 -3
- data/lib/prawn/svg/elements/text.rb +1 -1
- data/lib/prawn/svg/elements/text_component.rb +22 -22
- data/lib/prawn/svg/elements/use.rb +3 -7
- data/lib/prawn/svg/elements/viewport.rb +1 -3
- data/lib/prawn/svg/elements.rb +30 -29
- data/lib/prawn/svg/extension.rb +2 -1
- data/lib/prawn/svg/font.rb +7 -7
- data/lib/prawn/svg/font_registry.rb +13 -13
- data/lib/prawn/svg/gradients.rb +3 -2
- data/lib/prawn/svg/interface.rb +4 -3
- data/lib/prawn/svg/loaders/data.rb +2 -2
- data/lib/prawn/svg/loaders/file.rb +12 -14
- data/lib/prawn/svg/loaders/web.rb +4 -8
- data/lib/prawn/svg/pathable.rb +41 -37
- data/lib/prawn/svg/properties.rb +34 -33
- data/lib/prawn/svg/renderer.rb +7 -7
- data/lib/prawn/svg/state.rb +1 -1
- data/lib/prawn/svg/transform_parser.rb +5 -5
- data/lib/prawn/svg/ttf.rb +21 -17
- data/lib/prawn/svg/url_loader.rb +1 -1
- data/lib/prawn/svg/version.rb +1 -1
- data/lib/prawn-svg.rb +1 -0
- data/prawn-svg.gemspec +4 -6
- data/spec/integration_spec.rb +77 -70
- data/spec/prawn/svg/attributes/opacity_spec.rb +11 -15
- data/spec/prawn/svg/attributes/transform_spec.rb +6 -6
- data/spec/prawn/svg/calculators/aspect_ratio_spec.rb +50 -50
- data/spec/prawn/svg/calculators/document_sizing_spec.rb +35 -35
- data/spec/prawn/svg/calculators/pixels_spec.rb +31 -30
- data/spec/prawn/svg/color_spec.rb +31 -31
- data/spec/prawn/svg/css/font_family_parser_spec.rb +12 -12
- data/spec/prawn/svg/css/selector_parser_spec.rb +21 -21
- data/spec/prawn/svg/css/stylesheets_spec.rb +51 -45
- data/spec/prawn/svg/css/values_parser_spec.rb +16 -0
- data/spec/prawn/svg/document_spec.rb +15 -14
- data/spec/prawn/svg/elements/base_spec.rb +39 -34
- data/spec/prawn/svg/elements/gradient_spec.rb +39 -39
- data/spec/prawn/svg/elements/line_spec.rb +22 -22
- data/spec/prawn/svg/elements/marker_spec.rb +36 -40
- data/spec/prawn/svg/elements/path_spec.rb +134 -110
- data/spec/prawn/svg/elements/polygon_spec.rb +18 -18
- data/spec/prawn/svg/elements/polyline_spec.rb +16 -16
- data/spec/prawn/svg/elements/text_spec.rb +149 -127
- data/spec/prawn/svg/font_registry_spec.rb +34 -34
- data/spec/prawn/svg/font_spec.rb +4 -4
- data/spec/prawn/svg/interface_spec.rb +47 -39
- data/spec/prawn/svg/loaders/data_spec.rb +21 -21
- data/spec/prawn/svg/loaders/file_spec.rb +43 -40
- data/spec/prawn/svg/loaders/web_spec.rb +15 -15
- data/spec/prawn/svg/pathable_spec.rb +21 -21
- data/spec/prawn/svg/properties_spec.rb +51 -51
- data/spec/prawn/svg/transform_parser_spec.rb +12 -12
- data/spec/prawn/svg/ttf_spec.rb +5 -5
- data/spec/prawn/svg/url_loader_spec.rb +25 -23
- data/spec/spec_helper.rb +4 -4
- metadata +12 -143
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0567f606c8d50a83ca8521e9af1a39cda59c570086d624eb08f415e13e2e0623
|
|
4
|
+
data.tar.gz: 37e4d144020f202b293fb7106c7e9bcbe47b47bf3dd85ee6f811c757b89e1dc9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 89263ec912e718bb6405d0b4fd6b963665c1165bcedd8ec62226f7cfc4f8a80e9be771ceb55cfec45a65320e718724763f82dce20c274a6258da78f23394d91b
|
|
7
|
+
data.tar.gz: b87dfa3862f6679c530e2dfce0fcf9ef7a1e942cc2dff68f54bc6c053dd1b66915d2cae096a5d82e9905f35d3348a4e3a64bf02c0bb8491ef17826c890465e15
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
name: RuboCop
|
|
2
|
+
|
|
3
|
+
on: [push, pull_request]
|
|
4
|
+
|
|
5
|
+
jobs:
|
|
6
|
+
build:
|
|
7
|
+
runs-on: ubuntu-latest
|
|
8
|
+
|
|
9
|
+
steps:
|
|
10
|
+
- uses: actions/checkout@v4
|
|
11
|
+
|
|
12
|
+
- name: Set up Ruby
|
|
13
|
+
uses: ruby/setup-ruby@v1
|
|
14
|
+
with:
|
|
15
|
+
ruby-version: 3.3
|
|
16
|
+
bundler-cache: true
|
|
17
|
+
|
|
18
|
+
- name: Run RuboCop
|
|
19
|
+
run: bundle exec rubocop --parallel
|
data/.github/workflows/test.yml
CHANGED
|
@@ -1,35 +1,22 @@
|
|
|
1
1
|
name: test
|
|
2
2
|
on: [push, pull_request]
|
|
3
3
|
jobs:
|
|
4
|
-
|
|
4
|
+
test:
|
|
5
5
|
runs-on: ubuntu-latest
|
|
6
6
|
strategy:
|
|
7
7
|
fail-fast: false
|
|
8
8
|
matrix:
|
|
9
|
-
ruby: [2.
|
|
9
|
+
ruby: [2.7, '3.0', 3.1, 3.2, 3.3]
|
|
10
10
|
steps:
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
strategy:
|
|
24
|
-
fail-fast: false
|
|
25
|
-
matrix:
|
|
26
|
-
ruby: [2.5]
|
|
27
|
-
steps:
|
|
28
|
-
- uses: actions/checkout@v4
|
|
29
|
-
- name: Set up Ruby
|
|
30
|
-
uses: ruby/setup-ruby@v1
|
|
31
|
-
with:
|
|
32
|
-
bundler-cache: true
|
|
33
|
-
ruby-version: ${{ matrix.ruby }}
|
|
34
|
-
- name: Run tests
|
|
35
|
-
run: bundle exec rake
|
|
11
|
+
- uses: actions/checkout@v4
|
|
12
|
+
- name: Remove Gemfile.lock
|
|
13
|
+
run: rm -f Gemfile.lock
|
|
14
|
+
- name: Set up Ruby
|
|
15
|
+
uses: ruby/setup-ruby@v1
|
|
16
|
+
with:
|
|
17
|
+
bundler-cache: true
|
|
18
|
+
ruby-version: ${{ matrix.ruby }}
|
|
19
|
+
- name: Run tests
|
|
20
|
+
run: bundle exec rake
|
|
21
|
+
env:
|
|
22
|
+
RUBYOPT: "--enable-frozen-string-literal"
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
inherit_from: .rubocop_todo.yml
|
|
2
|
+
|
|
3
|
+
AllCops:
|
|
4
|
+
TargetRubyVersion: 2.7
|
|
5
|
+
NewCops: enable
|
|
6
|
+
|
|
7
|
+
Metrics/AbcSize:
|
|
8
|
+
Enabled: false
|
|
9
|
+
|
|
10
|
+
Metrics/BlockLength:
|
|
11
|
+
Enabled: false
|
|
12
|
+
|
|
13
|
+
Metrics/ClassLength:
|
|
14
|
+
Enabled: false
|
|
15
|
+
|
|
16
|
+
Metrics/CyclomaticComplexity:
|
|
17
|
+
Enabled: false
|
|
18
|
+
|
|
19
|
+
Metrics/MethodLength:
|
|
20
|
+
Enabled: false
|
|
21
|
+
|
|
22
|
+
Metrics/ModuleLength:
|
|
23
|
+
Enabled: false
|
|
24
|
+
|
|
25
|
+
Metrics/PerceivedComplexity:
|
|
26
|
+
Enabled: false
|
|
27
|
+
|
|
28
|
+
Style/Documentation:
|
|
29
|
+
Enabled: false
|
|
30
|
+
|
|
31
|
+
Style/FrozenStringLiteralComment:
|
|
32
|
+
Enabled: false
|
|
33
|
+
|
|
34
|
+
Style/ClassAndModuleChildren:
|
|
35
|
+
Enabled: false
|
|
36
|
+
|
|
37
|
+
Style/GuardClause:
|
|
38
|
+
Enabled: false
|
|
39
|
+
|
|
40
|
+
Style/SymbolArray:
|
|
41
|
+
Enabled: false
|
|
42
|
+
|
|
43
|
+
Style/WordArray:
|
|
44
|
+
Enabled: false
|
|
45
|
+
|
|
46
|
+
Layout/HashAlignment:
|
|
47
|
+
EnforcedHashRocketStyle: table
|
|
48
|
+
EnforcedColonStyle: table
|
|
49
|
+
|
|
50
|
+
Layout/FirstArgumentIndentation:
|
|
51
|
+
EnforcedStyle: consistent
|
|
52
|
+
|
|
53
|
+
Layout/ArgumentAlignment:
|
|
54
|
+
EnforcedStyle: with_fixed_indentation
|
|
55
|
+
|
|
56
|
+
Lint/SuppressedException:
|
|
57
|
+
Enabled: false
|
|
58
|
+
|
|
59
|
+
Style/AccessorGrouping:
|
|
60
|
+
Enabled: false
|
|
61
|
+
|
|
62
|
+
Style/PerlBackrefs:
|
|
63
|
+
Enabled: false
|
|
64
|
+
|
|
65
|
+
Naming/MethodParameterName:
|
|
66
|
+
Enabled: false
|
|
67
|
+
|
|
68
|
+
Metrics/ParameterLists:
|
|
69
|
+
Enabled: false
|
|
70
|
+
|
|
71
|
+
Metrics/BlockNesting:
|
|
72
|
+
Enabled: false
|
|
73
|
+
|
|
74
|
+
Naming/VariableNumber:
|
|
75
|
+
Enabled: false
|
|
76
|
+
|
|
77
|
+
Lint/ConstantDefinitionInBlock:
|
|
78
|
+
Exclude:
|
|
79
|
+
- spec/**/*.rb
|
|
80
|
+
|
|
81
|
+
Style/GlobalVars:
|
|
82
|
+
Exclude:
|
|
83
|
+
- spec/**/*.rb
|
|
84
|
+
|
|
85
|
+
Style/MultilineBlockChain:
|
|
86
|
+
Enabled: false
|
data/.rubocop_todo.yml
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# This configuration was generated by
|
|
2
|
+
# `rubocop --auto-gen-config`
|
|
3
|
+
# on 2024-06-16 03:19:10 UTC using RuboCop version 1.62.1.
|
|
4
|
+
# The point is for the user to remove these configuration records
|
|
5
|
+
# one by one as the offenses are removed from the code base.
|
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
|
8
|
+
|
|
9
|
+
# Offense count: 1
|
|
10
|
+
# Configuration parameters: AllowComments, AllowEmptyLambdas.
|
|
11
|
+
Lint/EmptyBlock:
|
|
12
|
+
Exclude:
|
|
13
|
+
- 'Rakefile'
|
|
14
|
+
|
|
15
|
+
# Offense count: 13
|
|
16
|
+
Lint/NonLocalExitFromIterator:
|
|
17
|
+
Exclude:
|
|
18
|
+
- 'lib/prawn/svg/css/selector_parser.rb'
|
|
19
|
+
- 'lib/prawn/svg/ttf.rb'
|
|
20
|
+
|
|
21
|
+
# Offense count: 1
|
|
22
|
+
Naming/AccessorMethodName:
|
|
23
|
+
Exclude:
|
|
24
|
+
- 'lib/prawn/svg/calculators/document_sizing.rb'
|
|
25
|
+
|
|
26
|
+
# Offense count: 1
|
|
27
|
+
# Configuration parameters: ExpectMatchingDefinition, CheckDefinitionPathHierarchy, CheckDefinitionPathHierarchyRoots, Regex, IgnoreExecutableScripts, AllowedAcronyms.
|
|
28
|
+
# CheckDefinitionPathHierarchyRoots: lib, spec, test, src
|
|
29
|
+
# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
|
|
30
|
+
Naming/FileName:
|
|
31
|
+
Exclude:
|
|
32
|
+
- 'lib/prawn-svg.rb'
|
|
33
|
+
|
|
34
|
+
# Offense count: 9
|
|
35
|
+
# This cop supports safe autocorrection (--autocorrect).
|
|
36
|
+
Style/IfUnlessModifier:
|
|
37
|
+
Exclude:
|
|
38
|
+
- 'lib/prawn/svg/css/selector_parser.rb'
|
|
39
|
+
- 'lib/prawn/svg/elements/base.rb'
|
|
40
|
+
- 'lib/prawn/svg/elements/gradient.rb'
|
|
41
|
+
- 'lib/prawn/svg/elements/root.rb'
|
|
42
|
+
- 'lib/prawn/svg/elements/text_component.rb'
|
|
43
|
+
- 'lib/prawn/svg/elements/use.rb'
|
|
44
|
+
- 'lib/prawn/svg/loaders/file.rb'
|
|
45
|
+
|
|
46
|
+
# Offense count: 28
|
|
47
|
+
# This cop supports safe autocorrection (--autocorrect).
|
|
48
|
+
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns.
|
|
49
|
+
# URISchemes: http, https
|
|
50
|
+
Layout/LineLength:
|
|
51
|
+
Max: 180
|
data/Gemfile
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
source
|
|
1
|
+
source 'http://rubygems.org'
|
|
2
2
|
|
|
3
3
|
# Declare your gem's dependencies in prawn-svg.gemspec.
|
|
4
4
|
# Bundler will treat runtime dependencies like base dependencies, and
|
|
@@ -10,5 +10,6 @@ gemspec
|
|
|
10
10
|
# Git. Remember to move these dependencies to your gemspec before releasing
|
|
11
11
|
# your gem to rubygems.org.
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
gem 'rake', '~> 13.0'
|
|
14
|
+
gem 'rspec', '~> 3.0'
|
|
15
|
+
gem 'rubocop', '~> 1.64'
|
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
prawn-svg (0.34.2)
|
|
5
|
+
css_parser (~> 1.6)
|
|
6
|
+
matrix (~> 0.4.2)
|
|
7
|
+
prawn (>= 0.11.1, < 3)
|
|
8
|
+
rexml (~> 3.2)
|
|
9
|
+
|
|
10
|
+
GEM
|
|
11
|
+
remote: http://rubygems.org/
|
|
12
|
+
specs:
|
|
13
|
+
addressable (2.8.6)
|
|
14
|
+
public_suffix (>= 2.0.2, < 6.0)
|
|
15
|
+
ast (2.4.2)
|
|
16
|
+
bigdecimal (3.1.8)
|
|
17
|
+
css_parser (1.17.1)
|
|
18
|
+
addressable
|
|
19
|
+
diff-lcs (1.5.1)
|
|
20
|
+
json (2.7.2)
|
|
21
|
+
language_server-protocol (3.17.0.3)
|
|
22
|
+
matrix (0.4.2)
|
|
23
|
+
parallel (1.25.1)
|
|
24
|
+
parser (3.3.3.0)
|
|
25
|
+
ast (~> 2.4.1)
|
|
26
|
+
racc
|
|
27
|
+
pdf-core (0.10.0)
|
|
28
|
+
prawn (2.5.0)
|
|
29
|
+
matrix (~> 0.4)
|
|
30
|
+
pdf-core (~> 0.10.0)
|
|
31
|
+
ttfunk (~> 1.8)
|
|
32
|
+
public_suffix (5.1.0)
|
|
33
|
+
racc (1.8.0)
|
|
34
|
+
rainbow (3.1.1)
|
|
35
|
+
rake (13.2.1)
|
|
36
|
+
regexp_parser (2.9.2)
|
|
37
|
+
rexml (3.3.0)
|
|
38
|
+
strscan
|
|
39
|
+
rspec (3.13.0)
|
|
40
|
+
rspec-core (~> 3.13.0)
|
|
41
|
+
rspec-expectations (~> 3.13.0)
|
|
42
|
+
rspec-mocks (~> 3.13.0)
|
|
43
|
+
rspec-core (3.13.0)
|
|
44
|
+
rspec-support (~> 3.13.0)
|
|
45
|
+
rspec-expectations (3.13.1)
|
|
46
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
47
|
+
rspec-support (~> 3.13.0)
|
|
48
|
+
rspec-mocks (3.13.1)
|
|
49
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
50
|
+
rspec-support (~> 3.13.0)
|
|
51
|
+
rspec-support (3.13.1)
|
|
52
|
+
rubocop (1.64.1)
|
|
53
|
+
json (~> 2.3)
|
|
54
|
+
language_server-protocol (>= 3.17.0)
|
|
55
|
+
parallel (~> 1.10)
|
|
56
|
+
parser (>= 3.3.0.2)
|
|
57
|
+
rainbow (>= 2.2.2, < 4.0)
|
|
58
|
+
regexp_parser (>= 1.8, < 3.0)
|
|
59
|
+
rexml (>= 3.2.5, < 4.0)
|
|
60
|
+
rubocop-ast (>= 1.31.1, < 2.0)
|
|
61
|
+
ruby-progressbar (~> 1.7)
|
|
62
|
+
unicode-display_width (>= 2.4.0, < 3.0)
|
|
63
|
+
rubocop-ast (1.31.3)
|
|
64
|
+
parser (>= 3.3.1.0)
|
|
65
|
+
ruby-progressbar (1.13.0)
|
|
66
|
+
strscan (3.1.0)
|
|
67
|
+
ttfunk (1.8.0)
|
|
68
|
+
bigdecimal (~> 3.1)
|
|
69
|
+
unicode-display_width (2.5.0)
|
|
70
|
+
|
|
71
|
+
PLATFORMS
|
|
72
|
+
ruby
|
|
73
|
+
|
|
74
|
+
DEPENDENCIES
|
|
75
|
+
prawn-svg!
|
|
76
|
+
rake (~> 13.0)
|
|
77
|
+
rspec (~> 3.0)
|
|
78
|
+
rubocop (~> 1.64)
|
|
79
|
+
|
|
80
|
+
BUNDLED WITH
|
|
81
|
+
2.5.1
|
data/README.md
CHANGED
|
@@ -10,7 +10,7 @@ This will take an SVG document as input and render it into your PDF. Find out m
|
|
|
10
10
|
http://github.com/prawnpdf/prawn
|
|
11
11
|
|
|
12
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.
|
|
13
|
+
The minimum Ruby version required is 2.7.
|
|
14
14
|
|
|
15
15
|
## Using prawn-svg
|
|
16
16
|
|
data/Rakefile
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
module Prawn::SVG::Attributes::ClipPath
|
|
2
2
|
def parse_clip_path_attribute_and_call
|
|
3
|
-
return unless clip_path = properties.clip_path
|
|
3
|
+
return unless (clip_path = properties.clip_path)
|
|
4
4
|
return if clip_path == 'none'
|
|
5
5
|
|
|
6
6
|
clip_path_element = extract_element_from_url_id_reference(clip_path, 'clipPath')
|
|
7
7
|
|
|
8
8
|
if clip_path_element.nil?
|
|
9
|
-
document.warnings <<
|
|
9
|
+
document.warnings << 'Could not resolve clip-path URI to a clipPath element'
|
|
10
10
|
else
|
|
11
11
|
add_call_and_enter 'save_graphics_state'
|
|
12
12
|
add_calls_from_element clip_path_element
|
|
13
|
-
add_call
|
|
13
|
+
add_call 'clip'
|
|
14
14
|
end
|
|
15
15
|
end
|
|
16
16
|
end
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
module Prawn::SVG::Attributes::Opacity
|
|
2
2
|
def parse_opacity_attributes_and_call
|
|
3
3
|
# We can't do nested opacities quite like the SVG requires, but this is close enough.
|
|
4
|
-
opacity =
|
|
5
|
-
fill_opacity =
|
|
6
|
-
stroke_opacity =
|
|
4
|
+
opacity = properties.opacity.to_f.clamp(0, 1) if properties.opacity
|
|
5
|
+
fill_opacity = properties.fill_opacity.to_f.clamp(0, 1) if properties.fill_opacity
|
|
6
|
+
stroke_opacity = properties.stroke_opacity.to_f.clamp(0, 1) if properties.stroke_opacity
|
|
7
7
|
|
|
8
8
|
if opacity || fill_opacity || stroke_opacity
|
|
9
9
|
state.fill_opacity *= [opacity || 1, fill_opacity || 1].min
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
module Prawn::SVG::Attributes::Stroke
|
|
2
|
-
CAP_STYLE_TRANSLATIONS = {
|
|
3
|
-
JOIN_STYLE_TRANSLATIONS = {
|
|
2
|
+
CAP_STYLE_TRANSLATIONS = { 'butt' => :butt, 'round' => :round, 'square' => :projecting_square }.freeze
|
|
3
|
+
JOIN_STYLE_TRANSLATIONS = { 'miter' => :miter, 'round' => :round, 'bevel' => :bevel }.freeze
|
|
4
4
|
|
|
5
5
|
def parse_stroke_attributes_and_call
|
|
6
|
-
if width_string = properties.stroke_width
|
|
6
|
+
if (width_string = properties.stroke_width)
|
|
7
7
|
width = pixels(width_string)
|
|
8
8
|
state.stroke_width = width
|
|
9
9
|
add_call('line_width', width)
|
|
@@ -12,12 +12,12 @@ module Prawn::SVG::Attributes::Stroke
|
|
|
12
12
|
if (linecap = properties.stroke_linecap) && linecap != 'inherit'
|
|
13
13
|
add_call('cap_style', CAP_STYLE_TRANSLATIONS.fetch(linecap, :butt))
|
|
14
14
|
end
|
|
15
|
-
|
|
15
|
+
|
|
16
16
|
if (linejoin = properties.stroke_linejoin) && linejoin != 'inherit'
|
|
17
17
|
add_call('join_style', JOIN_STYLE_TRANSLATIONS.fetch(linejoin, :miter))
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
if dasharray = properties.stroke_dasharray
|
|
20
|
+
if (dasharray = properties.stroke_dasharray)
|
|
21
21
|
case dasharray
|
|
22
22
|
when 'inherit'
|
|
23
23
|
# don't do anything
|
|
@@ -25,13 +25,13 @@ module Prawn::SVG::Attributes::Stroke
|
|
|
25
25
|
add_call('undash')
|
|
26
26
|
else
|
|
27
27
|
array = dasharray.split(Prawn::SVG::Elements::COMMA_WSP_REGEXP)
|
|
28
|
-
array *= 2 if array.length
|
|
29
|
-
number_array = array.map {|value| pixels(value)}
|
|
28
|
+
array *= 2 if array.length.odd?
|
|
29
|
+
number_array = array.map { |value| pixels(value) }
|
|
30
30
|
|
|
31
|
-
if number_array.any?
|
|
31
|
+
if number_array.any?(&:negative?)
|
|
32
32
|
@document.warnings << "stroke-dasharray cannot have negative numbers; treating as 'none'"
|
|
33
33
|
add_call('undash')
|
|
34
|
-
elsif number_array.inject(0) {|a, b| a + b}
|
|
34
|
+
elsif number_array.inject(0) { |a, b| a + b }.zero?
|
|
35
35
|
add_call('undash')
|
|
36
36
|
else
|
|
37
37
|
add_call('dash', number_array)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
module Prawn::SVG::Attributes::Transform
|
|
2
2
|
def parse_transform_attribute_and_call
|
|
3
|
-
return unless transform = attributes['transform']
|
|
3
|
+
return unless (transform = attributes['transform'])
|
|
4
4
|
|
|
5
5
|
matrix = parse_transform_attribute(transform)
|
|
6
|
-
add_call_and_enter
|
|
6
|
+
add_call_and_enter 'transformation_matrix', *matrix unless matrix == [1, 0, 0, 1, 0, 0]
|
|
7
7
|
end
|
|
8
8
|
end
|
data/lib/prawn/svg/attributes.rb
CHANGED
|
@@ -7,15 +7,15 @@ module Prawn::SVG::Calculators
|
|
|
7
7
|
def calculate_bezier_curve_points_for_arc(cx, cy, a, b, lambda_1, lambda_2, theta)
|
|
8
8
|
e = lambda do |eta|
|
|
9
9
|
[
|
|
10
|
-
cx + a * Math.cos(theta) * Math.cos(eta) - b * Math.sin(theta) * Math.sin(eta),
|
|
11
|
-
cy + a * Math.sin(theta) * Math.cos(eta) + b * Math.cos(theta) * Math.sin(eta)
|
|
10
|
+
cx + (a * Math.cos(theta) * Math.cos(eta)) - (b * Math.sin(theta) * Math.sin(eta)),
|
|
11
|
+
cy + (a * Math.sin(theta) * Math.cos(eta)) + (b * Math.cos(theta) * Math.sin(eta))
|
|
12
12
|
]
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
ep = lambda do |eta|
|
|
16
16
|
[
|
|
17
|
-
-a * Math.cos(theta) * Math.sin(eta) - b * Math.sin(theta) * Math.cos(eta),
|
|
18
|
-
-a * Math.sin(theta) * Math.sin(eta) + b * Math.cos(theta) * Math.cos(eta)
|
|
17
|
+
(-a * Math.cos(theta) * Math.sin(eta)) - (b * Math.sin(theta) * Math.cos(eta)),
|
|
18
|
+
(-a * Math.sin(theta) * Math.sin(eta)) + (b * Math.cos(theta) * Math.cos(eta))
|
|
19
19
|
]
|
|
20
20
|
end
|
|
21
21
|
|
|
@@ -28,28 +28,30 @@ module Prawn::SVG::Calculators
|
|
|
28
28
|
# puts "error = #{calculate_curve_approximation_error(a, b, eta1, eta1 + d_eta)}"
|
|
29
29
|
break
|
|
30
30
|
end
|
|
31
|
+
|
|
31
32
|
iterations *= 2
|
|
32
33
|
d_lambda = (lambda_2 - lambda_1) / iterations
|
|
33
34
|
end
|
|
34
35
|
|
|
35
36
|
(0...iterations).collect do |iteration|
|
|
36
|
-
eta_a, eta_b = calculate_eta_from_lambda(a, b, lambda_1+
|
|
37
|
+
eta_a, eta_b = calculate_eta_from_lambda(a, b, lambda_1 + (iteration * d_lambda),
|
|
38
|
+
lambda_1 + ((iteration + 1) * d_lambda))
|
|
37
39
|
d_eta = eta_b - eta_a
|
|
38
40
|
|
|
39
|
-
alpha = Math.sin(d_eta) * ((Math.sqrt(4 + 3 * Math.tan(d_eta / 2)
|
|
41
|
+
alpha = Math.sin(d_eta) * ((Math.sqrt(4 + (3 * (Math.tan(d_eta / 2)**2))) - 1) / 3)
|
|
40
42
|
|
|
41
43
|
x1, y1 = e[eta_a]
|
|
42
44
|
x2, y2 = e[eta_b]
|
|
43
45
|
|
|
44
46
|
ep_eta1_x, ep_eta1_y = ep[eta_a]
|
|
45
|
-
q1_x = x1 + alpha * ep_eta1_x
|
|
46
|
-
q1_y = y1 + alpha * ep_eta1_y
|
|
47
|
+
q1_x = x1 + (alpha * ep_eta1_x)
|
|
48
|
+
q1_y = y1 + (alpha * ep_eta1_y)
|
|
47
49
|
|
|
48
50
|
ep_eta2_x, ep_eta2_y = ep[eta_b]
|
|
49
|
-
q2_x = x2 - alpha * ep_eta2_x
|
|
50
|
-
q2_y = y2 - alpha * ep_eta2_y
|
|
51
|
+
q2_x = x2 - (alpha * ep_eta2_x)
|
|
52
|
+
q2_y = y2 - (alpha * ep_eta2_y)
|
|
51
53
|
|
|
52
|
-
{:
|
|
54
|
+
{ p2: [x2, y2], q1: [q1_x, q1_y], q2: [q2_x, q2_y] }
|
|
53
55
|
end
|
|
54
56
|
end
|
|
55
57
|
|
|
@@ -68,7 +70,7 @@ module Prawn::SVG::Calculators
|
|
|
68
70
|
[-0.0695069, -0.0437594, 0.0120636, 0.0163087],
|
|
69
71
|
[-0.0328856, -0.00926032, -0.00173573, 0.00527385]
|
|
70
72
|
]
|
|
71
|
-
]
|
|
73
|
+
].freeze
|
|
72
74
|
|
|
73
75
|
ERROR_COEFFICIENTS_B = [
|
|
74
76
|
[
|
|
@@ -83,7 +85,7 @@ module Prawn::SVG::Calculators
|
|
|
83
85
|
[0.0156192, -0.017535, 0.00326508, -0.228157],
|
|
84
86
|
[-0.0236752, 0.0405821, -0.0173086, 0.176187]
|
|
85
87
|
]
|
|
86
|
-
]
|
|
88
|
+
].freeze
|
|
87
89
|
|
|
88
90
|
def calculate_curve_approximation_error(a, b, eta1, eta2)
|
|
89
91
|
b_over_a = b / a
|
|
@@ -92,11 +94,11 @@ module Prawn::SVG::Calculators
|
|
|
92
94
|
c = lambda do |i|
|
|
93
95
|
(0..3).inject(0) do |accumulator, j|
|
|
94
96
|
coef = coefficents[i][j]
|
|
95
|
-
accumulator + ((coef[0] * b_over_a**2 + coef[1] * b_over_a + coef[2]) / (b_over_a * coef[3])) * Math.cos(j * (eta1 + eta2))
|
|
97
|
+
accumulator + ((((coef[0] * (b_over_a**2)) + (coef[1] * b_over_a) + coef[2]) / (b_over_a * coef[3])) * Math.cos(j * (eta1 + eta2)))
|
|
96
98
|
end
|
|
97
99
|
end
|
|
98
100
|
|
|
99
|
-
((0.001 * b_over_a**2 + 4.98 * b_over_a + 0.207) / (b_over_a * 0.0067)) * a * Math.exp(c[0] + c[1] * (eta2 - eta1))
|
|
101
|
+
(((0.001 * (b_over_a**2)) + (4.98 * b_over_a) + 0.207) / (b_over_a * 0.0067)) * a * Math.exp(c[0] + (c[1] * (eta2 - eta1)))
|
|
100
102
|
end
|
|
101
103
|
|
|
102
104
|
def calculate_eta_from_lambda(a, b, lambda_1, lambda_2)
|
|
@@ -4,10 +4,10 @@ module Prawn::SVG::Calculators
|
|
|
4
4
|
attr_reader :width, :height, :x, :y
|
|
5
5
|
|
|
6
6
|
def initialize(value, container_dimensions, object_dimensions)
|
|
7
|
-
values = (value ||
|
|
7
|
+
values = (value || 'xMidYMid meet').split
|
|
8
8
|
@x = @y = 0
|
|
9
9
|
|
|
10
|
-
if values.first ==
|
|
10
|
+
if values.first == 'defer'
|
|
11
11
|
@defer = true
|
|
12
12
|
values.shift
|
|
13
13
|
end
|
|
@@ -20,35 +20,37 @@ module Prawn::SVG::Calculators
|
|
|
20
20
|
container_ratio = w_container / h_container.to_f
|
|
21
21
|
object_ratio = w_object / h_object.to_f
|
|
22
22
|
|
|
23
|
-
if @align ==
|
|
23
|
+
if @align == 'none'
|
|
24
24
|
@width, @height = container_dimensions
|
|
25
25
|
else
|
|
26
|
-
matches = @align.to_s.strip.match(/\Ax(Min|Mid|Max)Y(Min|Mid|Max)\z/i) || [nil,
|
|
26
|
+
matches = @align.to_s.strip.match(/\Ax(Min|Mid|Max)Y(Min|Mid|Max)\z/i) || [nil, 'Mid', 'Mid']
|
|
27
27
|
|
|
28
28
|
if (container_ratio > object_ratio) == slice?
|
|
29
|
-
@width
|
|
29
|
+
@width = w_container
|
|
30
|
+
@height = w_container / object_ratio
|
|
30
31
|
@y = case matches[2].downcase
|
|
31
|
-
when
|
|
32
|
-
when
|
|
33
|
-
when
|
|
32
|
+
when 'min' then 0
|
|
33
|
+
when 'mid' then (h_container - (w_container / object_ratio)) / 2
|
|
34
|
+
when 'max' then h_container - (w_container / object_ratio)
|
|
34
35
|
end
|
|
35
36
|
else
|
|
36
|
-
@width
|
|
37
|
+
@width = h_container * object_ratio
|
|
38
|
+
@height = h_container
|
|
37
39
|
@x = case matches[1].downcase
|
|
38
|
-
when
|
|
39
|
-
when
|
|
40
|
-
when
|
|
40
|
+
when 'min' then 0
|
|
41
|
+
when 'mid' then (w_container - (h_container * object_ratio)) / 2
|
|
42
|
+
when 'max' then w_container - (h_container * object_ratio)
|
|
41
43
|
end
|
|
42
44
|
end
|
|
43
45
|
end
|
|
44
46
|
end
|
|
45
47
|
|
|
46
48
|
def slice?
|
|
47
|
-
@meet_or_slice ==
|
|
49
|
+
@meet_or_slice == 'slice'
|
|
48
50
|
end
|
|
49
51
|
|
|
50
52
|
def meet?
|
|
51
|
-
@meet_or_slice !=
|
|
53
|
+
@meet_or_slice != 'slice'
|
|
52
54
|
end
|
|
53
55
|
|
|
54
56
|
def inspect
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module Prawn::SVG::Calculators
|
|
2
2
|
class DocumentSizing
|
|
3
|
-
DEFAULT_ASPECT_RATIO =
|
|
3
|
+
DEFAULT_ASPECT_RATIO = 'xMidYMid meet'.freeze
|
|
4
4
|
|
|
5
5
|
attr_writer :document_width, :document_height
|
|
6
6
|
attr_writer :view_box, :preserve_aspect_ratio
|
|
@@ -33,21 +33,20 @@ module Prawn::SVG::Calculators
|
|
|
33
33
|
|
|
34
34
|
if @view_box
|
|
35
35
|
values = @view_box.strip.split(Prawn::SVG::Elements::COMMA_WSP_REGEXP)
|
|
36
|
-
@x_offset, @y_offset, @viewport_width, @viewport_height = values.map
|
|
36
|
+
@x_offset, @y_offset, @viewport_width, @viewport_height = values.map(&:to_f)
|
|
37
37
|
|
|
38
|
-
if @viewport_width
|
|
38
|
+
if @viewport_width.positive? && @viewport_height.positive?
|
|
39
39
|
# If neither the width nor height was specified, use the entire width and the viewbox ratio
|
|
40
40
|
# to determine the height.
|
|
41
|
-
if @output_width.nil? && @output_height.nil?
|
|
42
|
-
@output_width = container_width
|
|
43
|
-
end
|
|
41
|
+
@output_width = container_width if @output_width.nil? && @output_height.nil?
|
|
44
42
|
|
|
45
43
|
# If one of the output dimensions is missing, calculate it from the other one
|
|
46
44
|
# using the ratio of the viewport width to height.
|
|
47
45
|
@output_width ||= @output_height * @viewport_width / @viewport_height
|
|
48
46
|
@output_height ||= @output_width * @viewport_height / @viewport_width
|
|
49
47
|
|
|
50
|
-
aspect = AspectRatio.new(@preserve_aspect_ratio, [@output_width, @output_height],
|
|
48
|
+
aspect = AspectRatio.new(@preserve_aspect_ratio, [@output_width, @output_height],
|
|
49
|
+
[@viewport_width, @viewport_height])
|
|
51
50
|
@x_scale = aspect.width / @viewport_width
|
|
52
51
|
@y_scale = aspect.height / @viewport_height
|
|
53
52
|
@x_offset -= aspect.x / @x_scale
|
|
@@ -64,7 +63,7 @@ module Prawn::SVG::Calculators
|
|
|
64
63
|
return if invalid?
|
|
65
64
|
|
|
66
65
|
# SVG 1.1 section 7.10
|
|
67
|
-
@viewport_diagonal = Math.sqrt(@viewport_width**2 + @viewport_height**2) / Math.sqrt(2)
|
|
66
|
+
@viewport_diagonal = Math.sqrt((@viewport_width**2) + (@viewport_height**2)) / Math.sqrt(2)
|
|
68
67
|
|
|
69
68
|
if @requested_width
|
|
70
69
|
scale = @requested_width / @output_width
|
|
@@ -94,11 +93,11 @@ module Prawn::SVG::Calculators
|
|
|
94
93
|
end
|
|
95
94
|
|
|
96
95
|
def requested_width=(value)
|
|
97
|
-
@requested_width =
|
|
96
|
+
@requested_width = value&.to_f
|
|
98
97
|
end
|
|
99
98
|
|
|
100
99
|
def requested_height=(value)
|
|
101
|
-
@requested_height =
|
|
100
|
+
@requested_height = value&.to_f
|
|
102
101
|
end
|
|
103
102
|
end
|
|
104
103
|
end
|