prawn-icon 2.4.0 → 3.1.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/CHANGELOG.md +57 -0
- data/Gemfile +2 -0
- data/README.md +12 -0
- data/Rakefile +0 -1
- data/data/fonts/fab/fa-brands.ttf +0 -0
- data/data/fonts/fab/fab.yml +32 -3
- data/data/fonts/far/fa-regular.ttf +0 -0
- data/data/fonts/far/far.yml +1 -1
- data/data/fonts/fas/fa-solid.ttf +0 -0
- data/data/fonts/fas/fas.yml +67 -2
- data/data/fonts/mdi/LICENSE +20 -0
- data/data/fonts/mdi/materialdesignicons-webfont.ttf +0 -0
- data/data/fonts/mdi/mdi.yml +7099 -0
- data/examples/fontawesome.rb +3 -2
- data/examples/foundation_icons.rb +3 -2
- data/examples/mdi.rb +36 -0
- data/examples/paymentfont.rb +3 -2
- data/lib/prawn/icon/base.rb +16 -4
- data/lib/prawn/icon/compatibility.rb +25 -20
- data/lib/prawn/icon/configuration.rb +40 -0
- data/lib/prawn/icon/errors.rb +2 -2
- data/lib/prawn/icon/font_data.rb +13 -9
- data/lib/prawn/icon/interface.rb +38 -13
- data/lib/prawn/icon/parser.rb +14 -12
- data/lib/prawn/icon/version.rb +3 -3
- data/lib/prawn/icon.rb +4 -2
- data/prawn-icon.gemspec +12 -10
- data/spec/integration/icon_spec.rb +76 -15
- data/spec/unit/base_spec.rb +25 -6
- data/spec/unit/configuration_spec.rb +21 -0
- data/spec/unit/errors/icon_key_empty_spec.rb +1 -3
- data/spec/unit/errors/icon_not_found_spec.rb +1 -3
- data/spec/unit/font_data_spec.rb +9 -9
- data/spec/unit/icon_spec.rb +15 -15
- data/spec/unit/parser_spec.rb +6 -4
- metadata +31 -25
data/examples/fontawesome.rb
CHANGED
@@ -11,8 +11,9 @@ STYLES = {
|
|
11
11
|
|
12
12
|
STYLES.each do |specifier, type|
|
13
13
|
Prawn::Document.generate("fontawesome_#{type.downcase}.pdf") do
|
14
|
-
deja_path =
|
15
|
-
|
14
|
+
deja_path = Prawn::Icon.configuration.font_directory
|
15
|
+
.join('DejaVuSans.ttf')
|
16
|
+
.to_s
|
16
17
|
|
17
18
|
font_families.update(
|
18
19
|
'deja' => { normal: deja_path }
|
@@ -4,8 +4,9 @@ require_relative '../lib/prawn/icon'
|
|
4
4
|
require_relative 'example_helper'
|
5
5
|
|
6
6
|
Prawn::Document.generate('foundation_icons.pdf') do
|
7
|
-
deja_path =
|
8
|
-
|
7
|
+
deja_path = Prawn::Icon.configuration.font_directory
|
8
|
+
.join('DejaVuSans.ttf')
|
9
|
+
.to_s
|
9
10
|
|
10
11
|
font_families.update({
|
11
12
|
'deja' => { normal: deja_path }
|
data/examples/mdi.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# All example code may be executed by calling `rake legend`
|
2
|
+
|
3
|
+
require_relative '../lib/prawn/icon'
|
4
|
+
require_relative 'example_helper'
|
5
|
+
|
6
|
+
Prawn::Document.generate('mdi_icons.pdf') do
|
7
|
+
deja_path = Prawn::Icon.configuration.font_directory
|
8
|
+
.join('DejaVuSans.ttf')
|
9
|
+
.to_s
|
10
|
+
|
11
|
+
font_families.update({
|
12
|
+
'deja' => { normal: deja_path }
|
13
|
+
})
|
14
|
+
|
15
|
+
font('deja')
|
16
|
+
|
17
|
+
icons = icon_keys(self, 'mdi')
|
18
|
+
required_pages = number_of_pages(self, 'mdi')
|
19
|
+
|
20
|
+
define_grid(columns: 6, rows: 12, gutter: 16)
|
21
|
+
|
22
|
+
sub_header = 'Material Design Icons'
|
23
|
+
link = 'https://materialdesignicons.com/'
|
24
|
+
page_header sub_header, link
|
25
|
+
|
26
|
+
first_page_icons icons do |icon_key|
|
27
|
+
# Just call the +icon+ method and pass in an icon key
|
28
|
+
icon icon_key, size: 20, align: :center
|
29
|
+
end
|
30
|
+
|
31
|
+
start_new_page
|
32
|
+
|
33
|
+
page_icons icons, required_pages do |icon_key|
|
34
|
+
icon icon_key, size: 20, align: :center
|
35
|
+
end
|
36
|
+
end
|
data/examples/paymentfont.rb
CHANGED
@@ -4,8 +4,9 @@ require_relative '../lib/prawn/icon'
|
|
4
4
|
require_relative 'example_helper'
|
5
5
|
|
6
6
|
Prawn::Document.generate('paymentfont.pdf') do
|
7
|
-
deja_path =
|
8
|
-
|
7
|
+
deja_path = Prawn::Icon.configuration.font_directory
|
8
|
+
.join('DejaVuSans.ttf')
|
9
|
+
.to_s
|
9
10
|
|
10
11
|
font_families.update({
|
11
12
|
'deja' => { normal: deja_path }
|
data/lib/prawn/icon/base.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# base.rb - Base configuration for Prawn::Icon.
|
4
4
|
#
|
5
5
|
# Copyright September 2016, Jesse Doyle. All rights reserved.
|
@@ -11,9 +11,21 @@ require_relative 'errors'
|
|
11
11
|
|
12
12
|
module Prawn
|
13
13
|
class Icon
|
14
|
+
class << self
|
15
|
+
attr_writer :configuration
|
16
|
+
|
17
|
+
def configuration
|
18
|
+
@configuration ||= Configuration.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def configure
|
22
|
+
yield(configuration)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
14
26
|
module Base
|
15
|
-
|
16
|
-
|
27
|
+
# @deprecated Use {Prawn::Icon.configuration.font_directory} instead
|
28
|
+
FONTDIR = Prawn::Icon.configuration.font_directory.to_s
|
17
29
|
end
|
18
30
|
end
|
19
31
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# compatibility.rb - Prawn::Icon FontAwesome 4/5 compatibility shim.
|
4
4
|
#
|
5
5
|
# Copyright March 2018, Jesse Doyle. All rights reserved.
|
@@ -9,34 +9,40 @@
|
|
9
9
|
module Prawn
|
10
10
|
class Icon
|
11
11
|
class Compatibility
|
12
|
+
# @deprecated Use {Prawn::Icon::Compatibility.shims} instead
|
12
13
|
SHIMS = YAML.load_file(
|
13
|
-
|
14
|
-
Base::FONTDIR,
|
14
|
+
Prawn::Icon.configuration.font_directory.join(
|
15
15
|
'fa4',
|
16
16
|
'shims.yml'
|
17
17
|
)
|
18
18
|
).freeze
|
19
19
|
|
20
|
+
class << self
|
21
|
+
def shims
|
22
|
+
@shims ||= YAML.load_file(
|
23
|
+
Icon.configuration.font_directory.join('fa4', 'shims.yml').to_s
|
24
|
+
)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
20
28
|
attr_accessor :key
|
21
29
|
|
22
30
|
def initialize(opts = {})
|
23
31
|
self.key = opts.fetch(:key)
|
24
32
|
end
|
25
33
|
|
26
|
-
def translate(io =
|
27
|
-
@translate ||=
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
33
|
-
end
|
34
|
+
def translate(io = $stderr)
|
35
|
+
@translate ||= if key.start_with?('fa-')
|
36
|
+
map.tap { |replaced| warning(replaced, key, io) }
|
37
|
+
else
|
38
|
+
key
|
39
|
+
end
|
34
40
|
end
|
35
41
|
|
36
42
|
private
|
37
43
|
|
38
44
|
def map
|
39
|
-
|
45
|
+
self.class.shims.fetch(key) do
|
40
46
|
# FontAwesome shim metadata assumes "fas" as the default
|
41
47
|
# font family if not explicity referenced.
|
42
48
|
"fas-#{key.sub(/fa-/, '')}"
|
@@ -44,14 +50,13 @@ module Prawn
|
|
44
50
|
end
|
45
51
|
|
46
52
|
def warning(new_key, old_key, io)
|
47
|
-
io.puts
|
48
|
-
[Prawn::Icon - DEPRECATION WARNING]
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
DEPRECATION
|
53
|
+
io.puts <<~DEPRECATION
|
54
|
+
[Prawn::Icon - DEPRECATION WARNING]
|
55
|
+
FontAwesome 4 icon was referenced as '#{old_key}'.
|
56
|
+
Use the FontAwesome 5 icon '#{new_key}' instead.
|
57
|
+
This compatibility layer will be removed in Prawn::Icon 4.0.0.
|
58
|
+
DEPRECATION
|
53
59
|
end
|
54
60
|
end
|
55
61
|
end
|
56
62
|
end
|
57
|
-
# rubocop:enable Metrics/ClassLength
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# configuration.rb: Prawn icon configuration.
|
4
|
+
#
|
5
|
+
# Copyright October 2020, Jesse Doyle. All rights reserved.
|
6
|
+
#
|
7
|
+
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
|
+
|
9
|
+
module Prawn
|
10
|
+
class Icon
|
11
|
+
class Configuration
|
12
|
+
def font_directory=(path)
|
13
|
+
@font_directory = Pathname.new(path)
|
14
|
+
end
|
15
|
+
|
16
|
+
def font_directory
|
17
|
+
@font_directory ||= default_font_directory
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def default_font_directory
|
23
|
+
Pathname.new(gem_path).join('data', 'fonts')
|
24
|
+
end
|
25
|
+
|
26
|
+
# :nocov:
|
27
|
+
def gem_path
|
28
|
+
spec = Gem.loaded_specs.fetch('prawn-icon') do
|
29
|
+
Struct.new(:full_gem_path).new(failsafe_gem_path)
|
30
|
+
end
|
31
|
+
spec.full_gem_path
|
32
|
+
end
|
33
|
+
|
34
|
+
def failsafe_gem_path
|
35
|
+
File.expand_path('../../..', __dir__)
|
36
|
+
end
|
37
|
+
# :nocov:
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/prawn/icon/errors.rb
CHANGED
data/lib/prawn/icon/font_data.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# font_data.rb: Icon font metadata container/cache.
|
4
4
|
#
|
5
5
|
# Copyright October 2014, Jesse Doyle. All rights reserved.
|
@@ -63,15 +63,19 @@ module Prawn
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def path
|
66
|
-
|
67
|
-
|
66
|
+
@path = begin
|
67
|
+
font = Icon.configuration.font_directory
|
68
|
+
.join(@set.to_s)
|
69
|
+
.glob('*.ttf')
|
70
|
+
.first
|
71
|
+
|
72
|
+
if font.nil?
|
73
|
+
raise Prawn::Errors::UnknownFont,
|
74
|
+
"Icon font not found for set: #{@set}"
|
75
|
+
end
|
68
76
|
|
69
|
-
|
70
|
-
raise Prawn::Errors::UnknownFont,
|
71
|
-
"Icon font not found for set: #{@set}"
|
77
|
+
font.to_s
|
72
78
|
end
|
73
|
-
|
74
|
-
@path ||= font
|
75
79
|
end
|
76
80
|
|
77
81
|
def specifier
|
data/lib/prawn/icon/interface.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# interface.rb: Prawn extension module and logic.
|
4
4
|
#
|
5
5
|
# Copyright October 2016, Jesse Doyle. All rights reserved.
|
@@ -19,7 +19,7 @@ module Prawn
|
|
19
19
|
# rule, included icon keys should match the keys from
|
20
20
|
# the font provider. The icon key mapping is specified
|
21
21
|
# in the font's +legend_file+, which is a +YAML+ file
|
22
|
-
# located in Prawn::Icon
|
22
|
+
# located in {Prawn::Icon.configuration.font_directory}/font/font.yml.
|
23
23
|
#
|
24
24
|
# Prawn::Icon::
|
25
25
|
# Houses the methods and interfaces necessary for
|
@@ -38,6 +38,7 @@ module Prawn
|
|
38
38
|
# to Prawn's internal formatted text parser.
|
39
39
|
#
|
40
40
|
class Icon
|
41
|
+
# @deprecated Use {Prawn::Icon.configuration.font_directory} instead
|
41
42
|
FONTDIR = Icon::Base::FONTDIR
|
42
43
|
|
43
44
|
module Interface
|
@@ -63,11 +64,10 @@ module Prawn
|
|
63
64
|
#
|
64
65
|
def icon(key, opts = {})
|
65
66
|
key = translate_key(key)
|
66
|
-
make_icon(key, opts).tap
|
67
|
+
make_icon(key, opts).tap { |i| i && i.render }
|
67
68
|
end
|
68
69
|
|
69
|
-
# Initialize a new icon object
|
70
|
-
# not render it to the document.
|
70
|
+
# Initialize a new icon object.
|
71
71
|
#
|
72
72
|
# == Parameters:
|
73
73
|
# key::
|
@@ -90,9 +90,9 @@ module Prawn
|
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
93
|
-
#
|
94
|
-
#
|
95
|
-
#
|
93
|
+
# Render formatted icon content to the document from
|
94
|
+
# a string containing icons. Content will correctly
|
95
|
+
# transition to a new page when necessary.
|
96
96
|
#
|
97
97
|
# == Parameters:
|
98
98
|
# text::
|
@@ -107,10 +107,37 @@ module Prawn
|
|
107
107
|
def inline_icon(text, opts = {})
|
108
108
|
parsed = Icon::Parser.format(self, text)
|
109
109
|
content = Text::Formatted::Parser.format(parsed)
|
110
|
+
formatted_text(content, opts)
|
111
|
+
end
|
112
|
+
|
113
|
+
# Initialize a formatted icon box from an icon-conatining
|
114
|
+
# string. Content is not directly rendered to the document,
|
115
|
+
# instead a +Prawn::Text::Formatted::Box+ instance is returned
|
116
|
+
# that responds to the +render+ method.
|
117
|
+
#
|
118
|
+
# == Parameters:
|
119
|
+
# text::
|
120
|
+
# Input text to be parsed initially for <icon>
|
121
|
+
# tags, then passed to Prawn's formatted text
|
122
|
+
# parser.
|
123
|
+
#
|
124
|
+
# opts::
|
125
|
+
# A hash of options that may be supplied to the
|
126
|
+
# underlying text call.
|
127
|
+
#
|
128
|
+
def formatted_icon_box(text, opts = {})
|
129
|
+
parsed = Icon::Parser.format(self, text)
|
130
|
+
content = Text::Formatted::Parser.format(parsed)
|
131
|
+
position = opts.fetch(:at) do
|
132
|
+
[
|
133
|
+
opts.fetch(:x) { bounds.left },
|
134
|
+
opts.fetch(:y) { cursor }
|
135
|
+
]
|
136
|
+
end
|
110
137
|
box_options = opts.merge(
|
111
138
|
inline_format: true,
|
112
139
|
document: self,
|
113
|
-
at:
|
140
|
+
at: position
|
114
141
|
)
|
115
142
|
icon_box(content, box_options)
|
116
143
|
end
|
@@ -172,9 +199,7 @@ module Prawn
|
|
172
199
|
Text::Formatted::Box.new(content, opts).tap do |box|
|
173
200
|
box.render(dry_run: true)
|
174
201
|
self.y -= box.height
|
175
|
-
unless opts.fetch(:final_gap, true)
|
176
|
-
self.y -= box.line_gap + box.leading
|
177
|
-
end
|
202
|
+
self.y -= box.line_gap + box.leading unless opts.fetch(:final_gap, true)
|
178
203
|
end
|
179
204
|
end
|
180
205
|
end
|
data/lib/prawn/icon/parser.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# parser.rb: Prawn icon tag text parser (pseudo-HTML).
|
4
4
|
#
|
5
5
|
# Copyright October 2014, Jesse Doyle. All rights reserved.
|
@@ -31,15 +31,17 @@ module Prawn
|
|
31
31
|
#
|
32
32
|
class Parser
|
33
33
|
PARSER_REGEX = Regexp.new \
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
'<icon[^>]*>|</icon>',
|
35
|
+
Regexp::IGNORECASE |
|
36
|
+
Regexp::MULTILINE
|
37
37
|
|
38
|
-
CONTENT_REGEX = /<icon[^>]*>(?<content>[^<]*)<\/icon>/mi
|
38
|
+
CONTENT_REGEX = /<icon[^>]*>(?<content>[^<]*)<\/icon>/mi.freeze
|
39
39
|
|
40
|
-
TAG_REGEX = /<icon[^>]*>[^<]*<\/icon>/mi
|
40
|
+
TAG_REGEX = /<icon[^>]*>[^<]*<\/icon>/mi.freeze
|
41
41
|
|
42
|
-
|
42
|
+
# rubocop:disable Lint/MixedRegexpCaptureTypes
|
43
|
+
ATTR_REGEX = /(?<attr>[a-zA-Z]*)=["|'](?<val>(\w*[^["|']]))["|']/mi.freeze
|
44
|
+
# rubocop:enable Lint/MixedRegexpCaptureTypes
|
43
45
|
|
44
46
|
class << self
|
45
47
|
def format(document, string)
|
@@ -103,9 +105,9 @@ module Prawn
|
|
103
105
|
options ||= {}
|
104
106
|
options = config[index] if config.any?
|
105
107
|
info = {
|
106
|
-
set:
|
107
|
-
size:
|
108
|
-
color:
|
108
|
+
set: FontData.specifier_from_key(key),
|
109
|
+
size: options[:size],
|
110
|
+
color: options[:color],
|
109
111
|
content: FontData.unicode_from_key(document, key)
|
110
112
|
}
|
111
113
|
icons << info
|
@@ -115,7 +117,7 @@ module Prawn
|
|
115
117
|
|
116
118
|
private
|
117
119
|
|
118
|
-
def attr_hash(value)
|
120
|
+
def attr_hash(value) # :nodoc:
|
119
121
|
# If attr == size, we must cast value to float,
|
120
122
|
# else symbolize the key and map it to value
|
121
123
|
if value[0] =~ /size/i
|
data/lib/prawn/icon/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# version.rb: Prawn icon versioning.
|
4
4
|
#
|
5
5
|
# Copyright October 2014, Jesse Doyle. All rights reserved.
|
@@ -8,6 +8,6 @@
|
|
8
8
|
|
9
9
|
module Prawn
|
10
10
|
class Icon
|
11
|
-
VERSION = '
|
11
|
+
VERSION = '3.1.0'
|
12
12
|
end
|
13
13
|
end
|
data/lib/prawn/icon.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# icon.rb: Prawn icon functionality.
|
4
4
|
#
|
5
5
|
# Copyright October 2014, Jesse Doyle. All rights reserved.
|
6
6
|
#
|
7
7
|
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
8
|
|
9
|
+
require 'pathname'
|
9
10
|
require_relative 'icon/version'
|
11
|
+
require_relative 'icon/configuration'
|
10
12
|
require_relative 'icon/base'
|
11
13
|
require_relative 'icon/font_data'
|
12
14
|
require_relative 'icon/parser'
|
data/prawn-icon.gemspec
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
basedir = __dir__
|
2
4
|
require "#{basedir}/lib/prawn/icon/version"
|
3
5
|
|
4
6
|
Gem::Specification.new do |spec|
|
@@ -17,23 +19,23 @@ Gem::Specification.new do |spec|
|
|
17
19
|
|
18
20
|
spec.homepage = 'https://github.com/jessedoyle/prawn-icon/'
|
19
21
|
|
20
|
-
spec.test_files = Dir['spec/*_spec.rb']
|
21
22
|
spec.authors = ['Jesse Doyle']
|
22
23
|
spec.email = ['jdoyle@ualberta.ca']
|
23
|
-
spec.licenses = [
|
24
|
+
spec.licenses = %w[RUBY GPL-2 GPL-3]
|
24
25
|
|
25
26
|
spec.add_dependency('prawn', '>= 1.1.0', '< 3.0.0')
|
26
27
|
|
27
28
|
spec.add_development_dependency('pdf-inspector', '>= 1.2.1')
|
28
|
-
spec.add_development_dependency('rspec', '>= 3.5.0')
|
29
|
-
spec.add_development_dependency('rubocop', '~> 0.49.1')
|
30
|
-
spec.add_development_dependency('rake')
|
31
29
|
spec.add_development_dependency('pdf-reader', '>= 1.4')
|
30
|
+
spec.add_development_dependency('rake')
|
31
|
+
spec.add_development_dependency('rspec', '>= 3.5.0')
|
32
|
+
spec.add_development_dependency('rubocop', '~> 1.35.1')
|
32
33
|
spec.add_development_dependency('simplecov')
|
33
34
|
|
34
|
-
spec.description =
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
spec.description = <<~END_DESC
|
36
|
+
Prawn::Icon provides various icon fonts including
|
37
|
+
FontAwesome, PaymentFont and Foundation Icons
|
38
|
+
for use with the Prawn PDF toolkit.
|
38
39
|
END_DESC
|
40
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
39
41
|
end
|
@@ -47,20 +47,28 @@ describe Prawn::Icon::Interface do
|
|
47
47
|
pdf.move_down 10
|
48
48
|
pdf.text 'More'
|
49
49
|
pdf.move_down 20
|
50
|
-
|
50
|
+
pdf.icon icon_text, inline_format: true
|
51
51
|
pdf.move_down 30
|
52
52
|
pdf.text 'End'
|
53
|
+
inspector = PDF::Inspector::Text.analyze(pdf.render)
|
54
|
+
x, y = inspector.positions[2]
|
53
55
|
|
54
|
-
expect(
|
55
|
-
expect(
|
56
|
+
expect(x).to eq(0)
|
57
|
+
expect(y.round).to eq(724)
|
56
58
|
end
|
57
59
|
|
58
60
|
context 'with final_gap: false' do
|
59
61
|
it 'renders the icon without a final gap' do
|
60
|
-
|
62
|
+
pdf.icon(
|
63
|
+
'<icon size="60">far-address-book</icon>',
|
61
64
|
inline_format: true,
|
62
65
|
final_gap: false
|
63
|
-
|
66
|
+
)
|
67
|
+
pdf.text('Hello')
|
68
|
+
inspector = PDF::Inspector::Text.analyze(pdf.render)
|
69
|
+
y = inspector.positions[1].last.round
|
70
|
+
|
71
|
+
expect(y).to eq(723)
|
64
72
|
end
|
65
73
|
end
|
66
74
|
end
|
@@ -77,17 +85,17 @@ describe Prawn::Icon::Interface do
|
|
77
85
|
|
78
86
|
context 'invalid icon key' do
|
79
87
|
it 'should raise IconNotFound' do
|
80
|
-
|
81
|
-
|
82
|
-
|
88
|
+
expect { pdf.icon('far-__INVALID') }.to raise_error(
|
89
|
+
Prawn::Icon::Errors::IconNotFound
|
90
|
+
)
|
83
91
|
end
|
84
92
|
end
|
85
93
|
|
86
94
|
context 'invalid specifier' do
|
87
95
|
it 'should raise UnknownFont' do
|
88
|
-
|
89
|
-
|
90
|
-
|
96
|
+
expect { pdf.icon('__INVALID__') }.to raise_error(
|
97
|
+
Prawn::Errors::UnknownFont
|
98
|
+
)
|
91
99
|
end
|
92
100
|
end
|
93
101
|
end
|
@@ -102,19 +110,63 @@ describe Prawn::Icon::Interface do
|
|
102
110
|
end
|
103
111
|
|
104
112
|
context ':inline_format => true' do
|
105
|
-
it '
|
113
|
+
it 'returns nil' do
|
106
114
|
icon = pdf.make_icon '<icon>far-address-book</icon>', inline_format: true
|
107
115
|
|
108
|
-
expect(icon).to
|
116
|
+
expect(icon).to be_nil
|
109
117
|
end
|
110
118
|
end
|
111
119
|
end
|
112
120
|
|
113
121
|
describe '::inline_icon' do
|
114
|
-
it '
|
122
|
+
it 'returns nil' do
|
115
123
|
icon = pdf.inline_icon '<icon>far-address-book</icon>'
|
116
124
|
|
117
|
-
expect(icon).to
|
125
|
+
expect(icon).to be_nil
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'starts a new page if necessary', github_issue: '49' do
|
129
|
+
text = 209.times.map { 'Hello, World!' }.join(' ')
|
130
|
+
pdf.text(text, size: 18)
|
131
|
+
pdf.icon('Hello, <icon>fas-globe</icon>', inline_format: true, size: 18)
|
132
|
+
inspector = PDF::Inspector::Page.analyze(pdf.render)
|
133
|
+
|
134
|
+
expect(inspector.pages.size).to eq(2)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
describe '::formatted_icon_box' do
|
139
|
+
it 'returns a Prawn::Text::Formatted::Box instance' do
|
140
|
+
icon_text = <<~CONTENT
|
141
|
+
<icon size="20">fas-broom</icon>
|
142
|
+
<strikethrough>cancel that</strikethrough>
|
143
|
+
<icon>fas-check</icon>
|
144
|
+
CONTENT
|
145
|
+
box = pdf.formatted_icon_box(icon_text, inline_format: true)
|
146
|
+
|
147
|
+
expect(box).to be_a(Prawn::Text::Formatted::Box)
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'accepts an absolute position parameter' do
|
151
|
+
icon_text = 'Hello, <icon>fas-globe</icon>!'
|
152
|
+
pdf.formatted_icon_box(icon_text, inline_format: true, x: 200, y: 100).render
|
153
|
+
inspector = PDF::Inspector::Text.analyze(pdf.render)
|
154
|
+
x, y = inspector.positions[0]
|
155
|
+
|
156
|
+
expect(x).to eq(200)
|
157
|
+
expect(y.round).to eq(90)
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'handles final_gap: false correctly' do
|
161
|
+
icon_text = <<~CONTENT
|
162
|
+
Hello, <icon size="60">fas-globe</icon>
|
163
|
+
Next line.
|
164
|
+
CONTENT
|
165
|
+
pdf.formatted_icon_box(icon_text, inline_format: true, final_gap: false).render
|
166
|
+
inspector = PDF::Inspector::Text.analyze(pdf.render)
|
167
|
+
x = inspector.positions[1].first
|
168
|
+
|
169
|
+
expect(x.round).to eq(34)
|
118
170
|
end
|
119
171
|
end
|
120
172
|
|
@@ -209,4 +261,13 @@ describe Prawn::Icon do
|
|
209
261
|
expect(text.strings.first).to eq('')
|
210
262
|
end
|
211
263
|
end
|
264
|
+
|
265
|
+
context 'Material Design Icons' do
|
266
|
+
it 'renders Material Design Icon glyphs' do
|
267
|
+
pdf.icon 'mdi-beer'
|
268
|
+
text = PDF::Inspector::Text.analyze(pdf.render)
|
269
|
+
|
270
|
+
expect(text.strings.first).to eq('')
|
271
|
+
end
|
272
|
+
end
|
212
273
|
end
|
data/spec/unit/base_spec.rb
CHANGED
@@ -4,12 +4,31 @@
|
|
4
4
|
#
|
5
5
|
# This is free software. Please see the LICENSE and COPYING files for details.
|
6
6
|
|
7
|
-
describe Prawn::Icon
|
8
|
-
describe '
|
9
|
-
it 'returns
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
describe Prawn::Icon do
|
8
|
+
describe '#configuration' do
|
9
|
+
it 'returns an instance of Prawn::Icon::Configuration' do
|
10
|
+
expect(described_class.configuration).to be_a(Prawn::Icon::Configuration)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#configure' do
|
15
|
+
around(:each) do |example|
|
16
|
+
old = described_class.configuration.dup
|
17
|
+
described_class.configure do |config|
|
18
|
+
config.font_directory = '/tmp/fonts'
|
19
|
+
end
|
20
|
+
example.run
|
21
|
+
described_class.configuration = old
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'yields control' do
|
25
|
+
expect { |b| described_class.configure(&b) }.to yield_control
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'configures properties' do
|
29
|
+
expect(described_class.configuration.font_directory).to eq(
|
30
|
+
Pathname.new('/tmp/fonts')
|
31
|
+
)
|
13
32
|
end
|
14
33
|
end
|
15
34
|
end
|