prawn 2.2.2 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/GPLv2 +20 -21
- data/Gemfile +2 -0
- data/Rakefile +10 -3
- data/lib/prawn.rb +9 -3
- data/lib/prawn/document.rb +40 -18
- data/lib/prawn/document/bounding_box.rb +9 -4
- data/lib/prawn/document/column_box.rb +2 -0
- data/lib/prawn/document/internals.rb +6 -4
- data/lib/prawn/document/span.rb +2 -0
- data/lib/prawn/encoding.rb +4 -1
- data/lib/prawn/errors.rb +2 -0
- data/lib/prawn/font.rb +34 -17
- data/lib/prawn/font_metric_cache.rb +8 -3
- data/lib/prawn/{font → fonts}/afm.rb +14 -7
- data/lib/prawn/{font → fonts}/dfont.rb +3 -1
- data/lib/prawn/fonts/otf.rb +11 -0
- data/lib/prawn/{font → fonts}/ttc.rb +3 -1
- data/lib/prawn/{font → fonts}/ttf.rb +23 -12
- data/lib/prawn/graphics.rb +24 -26
- data/lib/prawn/graphics/blend_mode.rb +2 -0
- data/lib/prawn/graphics/cap_style.rb +2 -0
- data/lib/prawn/graphics/color.rb +8 -3
- data/lib/prawn/graphics/dash.rb +3 -1
- data/lib/prawn/graphics/join_style.rb +2 -0
- data/lib/prawn/graphics/patterns.rb +7 -2
- data/lib/prawn/graphics/transformation.rb +5 -1
- data/lib/prawn/graphics/transparency.rb +2 -0
- data/lib/prawn/grid.rb +39 -38
- data/lib/prawn/image_handler.rb +2 -0
- data/lib/prawn/images.rb +21 -19
- data/lib/prawn/images/image.rb +2 -0
- data/lib/prawn/images/jpg.rb +2 -0
- data/lib/prawn/images/png.rb +9 -9
- data/lib/prawn/measurement_extensions.rb +2 -0
- data/lib/prawn/measurements.rb +5 -0
- data/lib/prawn/outline.rb +2 -0
- data/lib/prawn/repeater.rb +2 -0
- data/lib/prawn/security.rb +26 -24
- data/lib/prawn/security/arcfour.rb +2 -0
- data/lib/prawn/soft_mask.rb +3 -1
- data/lib/prawn/stamp.rb +4 -1
- data/lib/prawn/text.rb +14 -12
- data/lib/prawn/text/box.rb +3 -1
- data/lib/prawn/text/formatted.rb +2 -0
- data/lib/prawn/text/formatted/arranger.rb +12 -12
- data/lib/prawn/text/formatted/box.rb +23 -13
- data/lib/prawn/text/formatted/fragment.rb +2 -0
- data/lib/prawn/text/formatted/line_wrap.rb +10 -8
- data/lib/prawn/text/formatted/parser.rb +8 -10
- data/lib/prawn/text/formatted/wrap.rb +4 -2
- data/lib/prawn/transformation_stack.rb +5 -2
- data/lib/prawn/utilities.rb +2 -2
- data/lib/prawn/version.rb +3 -1
- data/lib/prawn/view.rb +15 -7
- data/manual/basic_concepts/adding_pages.rb +2 -0
- data/manual/basic_concepts/basic_concepts.rb +4 -2
- data/manual/basic_concepts/creation.rb +2 -0
- data/manual/basic_concepts/cursor.rb +2 -0
- data/manual/basic_concepts/measurement.rb +3 -1
- data/manual/basic_concepts/origin.rb +2 -0
- data/manual/basic_concepts/other_cursor_helpers.rb +2 -0
- data/manual/basic_concepts/view.rb +2 -0
- data/manual/bounding_box/bounding_box.rb +4 -2
- data/manual/bounding_box/bounds.rb +6 -4
- data/manual/bounding_box/canvas.rb +2 -0
- data/manual/bounding_box/creation.rb +2 -0
- data/manual/bounding_box/indentation.rb +2 -0
- data/manual/bounding_box/nesting.rb +2 -0
- data/manual/bounding_box/russian_boxes.rb +6 -4
- data/manual/bounding_box/stretchy.rb +2 -0
- data/manual/contents.rb +2 -0
- data/manual/cover.rb +10 -7
- data/manual/document_and_page_options/background.rb +2 -0
- data/manual/document_and_page_options/document_and_page_options.rb +4 -2
- data/manual/document_and_page_options/metadata.rb +2 -0
- data/manual/document_and_page_options/page_margins.rb +2 -0
- data/manual/document_and_page_options/page_size.rb +2 -0
- data/manual/document_and_page_options/print_scaling.rb +2 -0
- data/manual/example_helper.rb +5 -2
- data/manual/graphics/blend_mode.rb +6 -4
- data/manual/graphics/circle_and_ellipse.rb +2 -0
- data/manual/graphics/color.rb +2 -0
- data/manual/graphics/common_lines.rb +2 -0
- data/manual/graphics/fill_and_stroke.rb +2 -0
- data/manual/graphics/fill_rules.rb +2 -0
- data/manual/graphics/gradients.rb +2 -0
- data/manual/graphics/graphics.rb +4 -2
- data/manual/graphics/helper.rb +2 -0
- data/manual/graphics/line_width.rb +3 -0
- data/manual/graphics/lines_and_curves.rb +2 -0
- data/manual/graphics/polygon.rb +2 -0
- data/manual/graphics/rectangle.rb +2 -0
- data/manual/graphics/rotate.rb +2 -0
- data/manual/graphics/scale.rb +2 -0
- data/manual/graphics/soft_masks.rb +2 -0
- data/manual/graphics/stroke_cap.rb +3 -1
- data/manual/graphics/stroke_dash.rb +2 -0
- data/manual/graphics/stroke_join.rb +3 -1
- data/manual/graphics/translate.rb +2 -0
- data/manual/graphics/transparency.rb +2 -0
- data/manual/how_to_read_this_manual.rb +2 -0
- data/manual/images/absolute_position.rb +2 -0
- data/manual/images/fit.rb +2 -0
- data/manual/images/horizontal.rb +3 -1
- data/manual/images/images.rb +4 -2
- data/manual/images/plain_image.rb +2 -0
- data/manual/images/scale.rb +2 -0
- data/manual/images/vertical.rb +3 -1
- data/manual/images/width_and_height.rb +2 -0
- data/manual/layout/boxes.rb +2 -0
- data/manual/layout/content.rb +2 -0
- data/manual/layout/layout.rb +4 -2
- data/manual/layout/simple_grid.rb +2 -0
- data/manual/outline/add_subsection_to.rb +2 -0
- data/manual/outline/insert_section_after.rb +2 -0
- data/manual/outline/outline.rb +4 -2
- data/manual/outline/sections_and_pages.rb +2 -0
- data/manual/repeatable_content/alternate_page_numbering.rb +2 -0
- data/manual/repeatable_content/page_numbering.rb +2 -0
- data/manual/repeatable_content/repeatable_content.rb +4 -2
- data/manual/repeatable_content/repeater.rb +2 -0
- data/manual/repeatable_content/stamp.rb +2 -0
- data/manual/security/encryption.rb +2 -0
- data/manual/security/permissions.rb +2 -0
- data/manual/security/security.rb +4 -2
- data/manual/table.rb +2 -0
- data/manual/text/alignment.rb +2 -0
- data/manual/text/color.rb +2 -0
- data/manual/text/column_box.rb +4 -2
- data/manual/text/fallback_fonts.rb +4 -2
- data/manual/text/font.rb +2 -0
- data/manual/text/font_size.rb +2 -0
- data/manual/text/font_style.rb +4 -2
- data/manual/text/formatted_callbacks.rb +2 -0
- data/manual/text/formatted_text.rb +3 -1
- data/manual/text/free_flowing_text.rb +2 -0
- data/manual/text/inline.rb +2 -0
- data/manual/text/kerning_and_character_spacing.rb +2 -0
- data/manual/text/leading.rb +2 -0
- data/manual/text/line_wrapping.rb +4 -1
- data/manual/text/paragraph_indentation.rb +2 -0
- data/manual/text/positioned_text.rb +2 -0
- data/manual/text/registering_families.rb +4 -2
- data/manual/text/rendering_and_color.rb +2 -0
- data/manual/text/right_to_left_text.rb +2 -0
- data/manual/text/rotation.rb +3 -1
- data/manual/text/single_usage.rb +2 -0
- data/manual/text/text.rb +4 -3
- data/manual/text/text_box_excess.rb +2 -0
- data/manual/text/text_box_extensions.rb +2 -0
- data/manual/text/text_box_overflow.rb +3 -1
- data/manual/text/utf8.rb +3 -1
- data/manual/text/win_ansi_charset.rb +6 -3
- data/prawn.gemspec +14 -11
- data/spec/extensions/encoding_helpers.rb +4 -2
- data/spec/prawn/document/bounding_box_spec.rb +8 -8
- data/spec/prawn/document/column_box_spec.rb +2 -0
- data/spec/prawn/document/security_spec.rb +12 -9
- data/spec/prawn/document_annotations_spec.rb +2 -0
- data/spec/prawn/document_destinations_spec.rb +2 -0
- data/spec/prawn/document_grid_spec.rb +3 -0
- data/spec/prawn/document_reference_spec.rb +2 -0
- data/spec/prawn/document_span_spec.rb +2 -0
- data/spec/prawn/document_spec.rb +59 -14
- data/spec/prawn/font_metric_cache_spec.rb +2 -0
- data/spec/prawn/font_spec.rb +45 -16
- data/spec/prawn/graphics/blend_mode_spec.rb +4 -2
- data/spec/prawn/graphics/transparency_spec.rb +2 -0
- data/spec/prawn/graphics_spec.rb +40 -20
- data/spec/prawn/graphics_stroke_styles_spec.rb +2 -0
- data/spec/prawn/image_handler_spec.rb +2 -0
- data/spec/prawn/images/jpg_spec.rb +2 -0
- data/spec/prawn/images/png_spec.rb +2 -0
- data/spec/prawn/images_spec.rb +56 -2
- data/spec/prawn/measurements_extensions_spec.rb +2 -0
- data/spec/prawn/outline_spec.rb +6 -2
- data/spec/prawn/repeater_spec.rb +6 -4
- data/spec/prawn/soft_mask_spec.rb +2 -0
- data/spec/prawn/stamp_spec.rb +11 -7
- data/spec/prawn/text/box_spec.rb +26 -27
- data/spec/prawn/text/formatted/arranger_spec.rb +30 -28
- data/spec/prawn/text/formatted/box_spec.rb +78 -57
- data/spec/prawn/text/formatted/fragment_spec.rb +10 -8
- data/spec/prawn/text/formatted/line_wrap_spec.rb +8 -5
- data/spec/prawn/text/formatted/parser_spec.rb +32 -2
- data/spec/prawn/text_draw_text_spec.rb +5 -3
- data/spec/prawn/text_rendering_mode_spec.rb +7 -1
- data/spec/prawn/text_spacing_spec.rb +6 -4
- data/spec/prawn/text_spec.rb +9 -7
- data/spec/prawn/text_with_inline_formatting_spec.rb +3 -1
- data/spec/prawn/transformation_stack_spec.rb +2 -0
- data/spec/prawn/view_spec.rb +18 -0
- data/spec/{manual_spec.rb → prawn_manual_spec.rb} +6 -4
- data/spec/spec_helper.rb +9 -10
- metadata +86 -73
- metadata.gz.sig +4 -2
data/spec/prawn/images_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
require 'set'
|
3
5
|
require 'pathname'
|
@@ -41,12 +43,63 @@ describe Prawn::Images do
|
|
41
43
|
expect(info.height).to eq(453)
|
42
44
|
end
|
43
45
|
|
46
|
+
it 'does not close passed-in IO objects' do
|
47
|
+
file = File.open(filename, 'rb')
|
48
|
+
_info = pdf.image(file)
|
49
|
+
|
50
|
+
expect(file).to_not be_closed
|
51
|
+
end
|
52
|
+
|
44
53
|
it 'accepts Pathname objects' do
|
45
54
|
info = pdf.image(Pathname.new(filename))
|
46
55
|
expect(info.height).to eq(453)
|
47
56
|
end
|
48
57
|
|
49
|
-
|
58
|
+
describe 'closes opened files again after getting Pathnames', issue: 975 do
|
59
|
+
describe 'spec with File message spy' do
|
60
|
+
let(:not_filename) { 'non-existent filename' }
|
61
|
+
let(:pathname_double) { instance_double('Pathname', file?: true) }
|
62
|
+
|
63
|
+
before do
|
64
|
+
file_content = File.new(filename, 'rb').read
|
65
|
+
allow(Pathname).to receive(:new).with(not_filename) { pathname_double }
|
66
|
+
allow(pathname_double).to receive(:binread) { file_content }
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'uses only binread, which closes opened files' do
|
70
|
+
# this implicitly tests that a file handle is closed again
|
71
|
+
# because only stubbed binread can be called on not_filename
|
72
|
+
_info = pdf.image(not_filename)
|
73
|
+
expect(pathname_double).to have_received(:binread)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
system_has_lsof = system('lsof -v > /dev/null 2>&1')
|
78
|
+
system_has_grep = system('grep --version > /dev/null 2>&1')
|
79
|
+
if system_has_lsof && system_has_grep
|
80
|
+
it 'closes opened files, spec with lsof' do
|
81
|
+
gc_was_disabled = GC.disable # GC of File would close the file
|
82
|
+
open_before = `lsof -c ruby | grep "#{filename}"`
|
83
|
+
_info = pdf.image(Pathname.new(filename))
|
84
|
+
open_after = `lsof -c ruby | grep "#{filename}"`
|
85
|
+
GC.enable unless gc_was_disabled
|
86
|
+
expect(open_after).to eq(open_before)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
if RUBY_PLATFORM != 'java'
|
91
|
+
it 'closes opened files, spec with ObjectSpace' do
|
92
|
+
gc_was_disabled = GC.disable # GC of File would close the file
|
93
|
+
open_before = ObjectSpace.each_object(File).count { |f| !f.closed? }
|
94
|
+
_info = pdf.image(Pathname.new(filename))
|
95
|
+
open_after = ObjectSpace.each_object(File).count { |f| !f.closed? }
|
96
|
+
GC.enable unless gc_was_disabled
|
97
|
+
expect(open_after).to eq(open_before)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe 'setting the length of the bytestream' do
|
50
103
|
it 'correctlies work with images from Pathname objects' do
|
51
104
|
pdf.image(Pathname.new(filename))
|
52
105
|
expect(pdf).to have_parseable_xobjects
|
@@ -111,7 +164,7 @@ describe Prawn::Images do
|
|
111
164
|
end[:Kids]
|
112
165
|
expect(pages.size).to eq(1)
|
113
166
|
expect(Set.new(hash[pages[0]][:Resources][:XObject].keys)).to eq(
|
114
|
-
Set.new([
|
167
|
+
Set.new(%i[I1 I2])
|
115
168
|
)
|
116
169
|
end
|
117
170
|
|
@@ -137,6 +190,7 @@ describe Prawn::Images do
|
|
137
190
|
expect(info.scaled_width).to eq(604)
|
138
191
|
expect(info.scaled_height).to eq(453)
|
139
192
|
end
|
193
|
+
|
140
194
|
it 'moves text position' do
|
141
195
|
y = pdf.y
|
142
196
|
pdf.image filename, fit: [100, 400]
|
data/spec/prawn/outline_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Prawn::Outline do
|
@@ -42,6 +44,7 @@ describe Prawn::Outline do
|
|
42
44
|
it 'stores all outline titles as UTF-16' do
|
43
45
|
hash.each_value do |obj|
|
44
46
|
next unless obj.is_a?(Hash) && obj[:Title]
|
47
|
+
|
45
48
|
title = obj[:Title].dup
|
46
49
|
title.force_encoding(Encoding::UTF_16LE)
|
47
50
|
expect(title.valid_encoding?).to eq(true)
|
@@ -157,7 +160,7 @@ describe Prawn::Outline do
|
|
157
160
|
end
|
158
161
|
|
159
162
|
describe '#outline.add_subsection_to' do
|
160
|
-
context 'positioned last' do
|
163
|
+
context 'when positioned last' do
|
161
164
|
before do
|
162
165
|
pdf.start_new_page
|
163
166
|
pdf.text 'Page 3. An added subsection '
|
@@ -203,7 +206,7 @@ describe Prawn::Outline do
|
|
203
206
|
end
|
204
207
|
end
|
205
208
|
|
206
|
-
context 'positioned first' do
|
209
|
+
context 'when positioned first' do
|
207
210
|
before do
|
208
211
|
pdf.start_new_page
|
209
212
|
pdf.text 'Page 3. An added subsection '
|
@@ -395,6 +398,7 @@ describe Prawn::Outline do
|
|
395
398
|
def find_by_title(title)
|
396
399
|
hash.values.find do |obj|
|
397
400
|
next unless obj.is_a?(Hash) && obj[:Title]
|
401
|
+
|
398
402
|
title_codepoints = obj[:Title].unpack('n*')
|
399
403
|
title_codepoints.shift
|
400
404
|
utf8_title = title_codepoints.pack('U*')
|
data/spec/prawn/repeater_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Prawn::Repeater do
|
@@ -128,11 +130,11 @@ describe Prawn::Repeater do
|
|
128
130
|
doc
|
129
131
|
end
|
130
132
|
|
131
|
-
def repeater(*args, &
|
132
|
-
Prawn::Repeater.new(*args, &
|
133
|
+
def repeater(*args, &block)
|
134
|
+
Prawn::Repeater.new(*args, &block)
|
133
135
|
end
|
134
136
|
|
135
|
-
|
137
|
+
describe 'graphic state' do
|
136
138
|
let(:pdf) { create_pdf }
|
137
139
|
|
138
140
|
it 'does not alter the graphic state stack color space' do
|
@@ -144,7 +146,7 @@ describe Prawn::Repeater do
|
|
144
146
|
.to eq(starting_color_space)
|
145
147
|
end
|
146
148
|
|
147
|
-
context 'dynamic repeaters' do
|
149
|
+
context 'with dynamic repeaters' do
|
148
150
|
it 'preserves the graphic state at creation time' do
|
149
151
|
pdf.repeat :all, dynamic: true do
|
150
152
|
pdf.text "fill_color: #{pdf.graphic_state.fill_color}"
|
data/spec/prawn/stamp_spec.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Prawn::Stamp do
|
4
6
|
describe 'create_stamp before any page is added' do
|
5
7
|
let(:pdf) { Prawn::Document.new(skip_page_creation: true) }
|
8
|
+
|
6
9
|
it 'works with the font class' do
|
7
10
|
# If anything goes wrong, Prawn::Errors::NotOnPage will be raised
|
8
11
|
pdf.create_stamp('my_stamp') do
|
@@ -35,16 +38,16 @@ describe Prawn::Stamp do
|
|
35
38
|
describe 'Document with a stamp' do
|
36
39
|
let(:pdf) { create_pdf }
|
37
40
|
|
38
|
-
it '
|
39
|
-
|
41
|
+
it 'raises NameTaken error when attempt to create stamp with '\
|
42
|
+
'same name as an existing stamp' do
|
40
43
|
pdf.create_stamp('MyStamp')
|
41
44
|
expect do
|
42
45
|
pdf.create_stamp('MyStamp')
|
43
46
|
end.to raise_error(Prawn::Errors::NameTaken)
|
44
47
|
end
|
45
48
|
|
46
|
-
it '
|
47
|
-
|
49
|
+
it 'raises InvalidName error when attempt to create stamp with '\
|
50
|
+
'a blank name' do
|
48
51
|
expect do
|
49
52
|
pdf.create_stamp('')
|
50
53
|
end.to raise_error(Prawn::Errors::InvalidName)
|
@@ -92,7 +95,8 @@ describe Prawn::Stamp do
|
|
92
95
|
objects = output.split('endobj')
|
93
96
|
|
94
97
|
objects.each do |obj|
|
95
|
-
next unless
|
98
|
+
next unless %r{/Type /Page$}.match?(obj)
|
99
|
+
|
96
100
|
# The page object must contain the annotation reference
|
97
101
|
# to render a clickable link
|
98
102
|
expect(obj).to match(%r{^/Annots \[\d \d .\]$})
|
@@ -112,9 +116,9 @@ describe Prawn::Stamp do
|
|
112
116
|
output = pdf.render
|
113
117
|
objects = output.split('endobj')
|
114
118
|
objects.each do |object|
|
115
|
-
if
|
119
|
+
if %r{/Type /Page$}.match?(object)
|
116
120
|
expect(object).to_not match(%r{/ExtGState})
|
117
|
-
elsif
|
121
|
+
elsif %r{/Type /XObject$}.match?(object)
|
118
122
|
expect(object).to match(%r{/ExtGState})
|
119
123
|
end
|
120
124
|
end
|
data/spec/prawn/text/box_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Prawn::Text::Box do
|
@@ -56,8 +58,8 @@ describe Prawn::Text::Box do
|
|
56
58
|
expect(text.strings[1]).to eq("I'm fine, thank you.")
|
57
59
|
end
|
58
60
|
|
59
|
-
it '
|
60
|
-
|
61
|
+
it 'only requires enough space for the descender and the ascender '\
|
62
|
+
'when determining whether a line can fit' do
|
61
63
|
text = 'Oh hai text rect'
|
62
64
|
options = {
|
63
65
|
document: pdf,
|
@@ -110,8 +112,7 @@ describe Prawn::Text::Box do
|
|
110
112
|
end
|
111
113
|
|
112
114
|
describe '#line_gap' do
|
113
|
-
it '
|
114
|
-
'font and font size' do
|
115
|
+
it '==S the line gap of the font when using a single font and font size' do
|
115
116
|
string = "Hello world, how are you?\nI'm fine, thank you."
|
116
117
|
text_box = described_class.new(string, document: pdf)
|
117
118
|
text_box.render
|
@@ -140,8 +141,8 @@ describe Prawn::Text::Box do
|
|
140
141
|
end
|
141
142
|
|
142
143
|
describe '#height without leading' do
|
143
|
-
it '
|
144
|
-
|
144
|
+
it 'is the sum of the height of each line, not including the space below '\
|
145
|
+
'the last line' do
|
145
146
|
text = "Oh hai text rect.\nOh hai text rect."
|
146
147
|
options = { document: pdf }
|
147
148
|
text_box = described_class.new(text, options)
|
@@ -152,8 +153,8 @@ describe Prawn::Text::Box do
|
|
152
153
|
end
|
153
154
|
|
154
155
|
describe '#height with leading' do
|
155
|
-
it '
|
156
|
-
|
156
|
+
it 'is the sum of the height of each line plus leading, but not including '\
|
157
|
+
'the space below the last line' do
|
157
158
|
text = "Oh hai text rect.\nOh hai text rect."
|
158
159
|
leading = 12
|
159
160
|
options = { document: pdf, leading: leading }
|
@@ -327,7 +328,7 @@ describe Prawn::Text::Box do
|
|
327
328
|
}
|
328
329
|
end
|
329
330
|
|
330
|
-
context ':rotate_around option of :center' do
|
331
|
+
context 'with :rotate_around option of :center' do
|
331
332
|
it 'draws content to the page rotated about the center of the text' do
|
332
333
|
options[:rotate_around] = :center
|
333
334
|
text_box = described_class.new(text, options)
|
@@ -356,7 +357,7 @@ describe Prawn::Text::Box do
|
|
356
357
|
end
|
357
358
|
end
|
358
359
|
|
359
|
-
context ':rotate_around option of :upper_left' do
|
360
|
+
context 'with :rotate_around option of :upper_left' do
|
360
361
|
it 'draws content to the page rotated about the upper left corner of '\
|
361
362
|
'the text' do
|
362
363
|
options[:rotate_around] = :upper_left
|
@@ -384,7 +385,7 @@ describe Prawn::Text::Box do
|
|
384
385
|
end
|
385
386
|
end
|
386
387
|
|
387
|
-
context 'default :rotate_around' do
|
388
|
+
context 'with default :rotate_around' do
|
388
389
|
it 'draws content to the page rotated about the upper left corner of '\
|
389
390
|
'the text' do
|
390
391
|
text_box = described_class.new(text, options)
|
@@ -411,7 +412,7 @@ describe Prawn::Text::Box do
|
|
411
412
|
end
|
412
413
|
end
|
413
414
|
|
414
|
-
context ':rotate_around option of :upper_right' do
|
415
|
+
context 'with :rotate_around option of :upper_right' do
|
415
416
|
it 'draws content to the page rotated about the upper right corner of '\
|
416
417
|
'the text' do
|
417
418
|
options[:rotate_around] = :upper_right
|
@@ -441,7 +442,7 @@ describe Prawn::Text::Box do
|
|
441
442
|
end
|
442
443
|
end
|
443
444
|
|
444
|
-
context ':rotate_around option of :lower_right' do
|
445
|
+
context 'with :rotate_around option of :lower_right' do
|
445
446
|
it 'draws content to the page rotated about the lower right corner of '\
|
446
447
|
'the text' do
|
447
448
|
options[:rotate_around] = :lower_right
|
@@ -471,7 +472,7 @@ describe Prawn::Text::Box do
|
|
471
472
|
end
|
472
473
|
end
|
473
474
|
|
474
|
-
context ':rotate_around option of :lower_left' do
|
475
|
+
context 'with :rotate_around option of :lower_left' do
|
475
476
|
it 'draws content to the page rotated about the lower left corner of '\
|
476
477
|
'the text' do
|
477
478
|
options[:rotate_around] = :lower_left
|
@@ -521,8 +522,8 @@ describe Prawn::Text::Box do
|
|
521
522
|
end
|
522
523
|
end
|
523
524
|
|
524
|
-
it '
|
525
|
-
|
525
|
+
it 'uses the parent-box bottom if in a stretchy bbox and overflow is '\
|
526
|
+
':expand, even with an explicit height' do
|
526
527
|
pdf.bounding_box([0, pdf.cursor], width: pdf.bounds.width) do
|
527
528
|
target_height = pdf.y - pdf.bounds.bottom
|
528
529
|
text = "Oh hai\n" * 60
|
@@ -663,7 +664,7 @@ describe Prawn::Text::Box do
|
|
663
664
|
end
|
664
665
|
end
|
665
666
|
|
666
|
-
context 'printing UTF-8 string with higher bit characters' do
|
667
|
+
context 'when printing UTF-8 string with higher bit characters' do
|
667
668
|
let(:text) { '©' }
|
668
669
|
|
669
670
|
let(:text_box) do
|
@@ -714,7 +715,7 @@ describe Prawn::Text::Box do
|
|
714
715
|
}
|
715
716
|
end
|
716
717
|
|
717
|
-
context 'truncated overflow' do
|
718
|
+
context 'when truncated overflow' do
|
718
719
|
let(:text_box) do
|
719
720
|
described_class.new(text, options.merge(overflow: :truncate))
|
720
721
|
end
|
@@ -756,7 +757,7 @@ describe Prawn::Text::Box do
|
|
756
757
|
end
|
757
758
|
end
|
758
759
|
|
759
|
-
context 'truncated with text and size taken from the manual' do
|
760
|
+
context 'when truncated with text and size taken from the manual' do
|
760
761
|
it 'returns the right text' do
|
761
762
|
text = 'This is the beginning of the text. It will be cut somewhere ' \
|
762
763
|
'and the rest of the text will procede to be rendered this time by '\
|
@@ -775,7 +776,7 @@ describe Prawn::Text::Box do
|
|
775
776
|
end
|
776
777
|
end
|
777
778
|
|
778
|
-
context 'expand overflow' do
|
779
|
+
context 'when expand overflow' do
|
779
780
|
let(:text_box) do
|
780
781
|
described_class.new(text, options.merge(overflow: :expand))
|
781
782
|
end
|
@@ -799,7 +800,7 @@ describe Prawn::Text::Box do
|
|
799
800
|
end
|
800
801
|
end
|
801
802
|
|
802
|
-
context 'shrink_to_fit overflow' do
|
803
|
+
context 'when shrink_to_fit overflow' do
|
803
804
|
let(:text_box) do
|
804
805
|
described_class.new(
|
805
806
|
text,
|
@@ -818,9 +819,7 @@ describe Prawn::Text::Box do
|
|
818
819
|
it 'render returns an empty string because no text remains unprinted' do
|
819
820
|
expect(text_box.render).to eq('')
|
820
821
|
end
|
821
|
-
end
|
822
822
|
|
823
|
-
context 'shrink_to_fit overflow' do
|
824
823
|
it 'does not drop below the minimum font size' do
|
825
824
|
options[:overflow] = :shrink_to_fit
|
826
825
|
options[:min_font_size] = 10.1
|
@@ -1018,7 +1017,7 @@ describe Prawn::Text::Box do
|
|
1018
1017
|
expect(text_box.text).to eq(expect)
|
1019
1018
|
end
|
1020
1019
|
|
1021
|
-
it 'wraps lines comprised of a single word of the bounds when '\
|
1020
|
+
it 'wraps lines comprised of a single non-alpha word of the bounds when '\
|
1022
1021
|
'wrapping text' do
|
1023
1022
|
text = '©' * 30
|
1024
1023
|
|
@@ -1031,8 +1030,8 @@ describe Prawn::Text::Box do
|
|
1031
1030
|
|
1032
1031
|
text_box.render
|
1033
1032
|
|
1034
|
-
expected = '©' * 25 + "\n" + '©' * 5
|
1035
|
-
pdf.font.normalize_encoding
|
1033
|
+
expected = +'©' * 25 + "\n" + '©' * 5
|
1034
|
+
expected = pdf.font.normalize_encoding(expected)
|
1036
1035
|
expected = expected.force_encoding(Encoding::UTF_8)
|
1037
1036
|
expect(text_box.text).to eq(expected)
|
1038
1037
|
end
|
@@ -1104,7 +1103,7 @@ describe Prawn::Text::Box do
|
|
1104
1103
|
end
|
1105
1104
|
|
1106
1105
|
def reduce_precision(float)
|
1107
|
-
(
|
1106
|
+
float.round(5)
|
1108
1107
|
end
|
1109
1108
|
|
1110
1109
|
def first_line(str)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Prawn::Text::Formatted::Arranger do
|
@@ -9,7 +11,7 @@ describe Prawn::Text::Formatted::Arranger do
|
|
9
11
|
array = [
|
10
12
|
{ text: 'hello ' },
|
11
13
|
{ text: 'world how ', styles: [:bold] },
|
12
|
-
{ text: 'are', styles: [
|
14
|
+
{ text: 'are', styles: %i[bold italic] },
|
13
15
|
{ text: ' you?' }
|
14
16
|
]
|
15
17
|
|
@@ -18,7 +20,7 @@ describe Prawn::Text::Formatted::Arranger do
|
|
18
20
|
expect(arranger.unconsumed[0]).to eq(text: 'hello ')
|
19
21
|
expect(arranger.unconsumed[1]).to eq(text: 'world how ', styles: [:bold])
|
20
22
|
expect(arranger.unconsumed[2])
|
21
|
-
.to eq(text: 'are', styles: [
|
23
|
+
.to eq(text: 'are', styles: %i[bold italic])
|
22
24
|
expect(arranger.unconsumed[3]).to eq(text: ' you?')
|
23
25
|
end
|
24
26
|
|
@@ -65,7 +67,7 @@ describe Prawn::Text::Formatted::Arranger do
|
|
65
67
|
[
|
66
68
|
{ text: 'hello ' },
|
67
69
|
{ text: 'world how ', styles: [:bold] },
|
68
|
-
{ text: 'are', styles: [
|
70
|
+
{ text: 'are', styles: %i[bold italic] },
|
69
71
|
{ text: ' you?' }
|
70
72
|
]
|
71
73
|
end
|
@@ -85,7 +87,7 @@ describe Prawn::Text::Formatted::Arranger do
|
|
85
87
|
|
86
88
|
expect(arranger.consumed[0]).to eq(text: 'hello ')
|
87
89
|
expect(arranger.consumed[1]).to eq(text: 'world how ', styles: [:bold])
|
88
|
-
expect(arranger.consumed[2]).to eq(text: 'are', styles: [
|
90
|
+
expect(arranger.consumed[2]).to eq(text: 'are', styles: %i[bold italic])
|
89
91
|
expect(arranger.consumed[3]).to eq(text: ' you?')
|
90
92
|
end
|
91
93
|
|
@@ -97,7 +99,7 @@ describe Prawn::Text::Formatted::Arranger do
|
|
97
99
|
expect(arranger.current_format_state).to eq(styles: [:bold])
|
98
100
|
|
99
101
|
arranger.next_string
|
100
|
-
expect(arranger.current_format_state).to eq(styles: [
|
102
|
+
expect(arranger.current_format_state).to eq(styles: %i[bold italic])
|
101
103
|
|
102
104
|
arranger.next_string
|
103
105
|
expect(arranger.current_format_state).to eq({})
|
@@ -155,7 +157,7 @@ describe Prawn::Text::Formatted::Arranger do
|
|
155
157
|
[
|
156
158
|
{ text: 'hello ' },
|
157
159
|
{ text: 'world how ', styles: [:bold] },
|
158
|
-
{ text: 'are', styles: [
|
160
|
+
{ text: 'are', styles: %i[bold italic] },
|
159
161
|
{ text: ' you?' }
|
160
162
|
]
|
161
163
|
end
|
@@ -164,7 +166,7 @@ describe Prawn::Text::Formatted::Arranger do
|
|
164
166
|
arranger.format_array = array
|
165
167
|
end
|
166
168
|
|
167
|
-
|
169
|
+
describe 'after all strings have been consumed' do
|
168
170
|
before do
|
169
171
|
while arranger.next_string
|
170
172
|
end
|
@@ -174,7 +176,7 @@ describe Prawn::Text::Formatted::Arranger do
|
|
174
176
|
expect { arranger.retrieve_fragment }.to raise_error(RuntimeError)
|
175
177
|
end
|
176
178
|
|
177
|
-
|
179
|
+
describe 'and finalized' do
|
178
180
|
before do
|
179
181
|
arranger.finalize_line
|
180
182
|
end
|
@@ -196,13 +198,13 @@ describe Prawn::Text::Formatted::Arranger do
|
|
196
198
|
end
|
197
199
|
|
198
200
|
describe '#update_last_string' do
|
199
|
-
it '
|
200
|
-
|
201
|
+
it 'updates the last retrieved string with what actually fit on the line '\
|
202
|
+
'and the list of unconsumed with what did not' do
|
201
203
|
array = [
|
202
204
|
{ text: 'hello ' },
|
203
205
|
{ text: 'world how ', styles: [:bold] },
|
204
|
-
{ text: 'are', styles: [
|
205
|
-
{ text: ' you now?', styles: [
|
206
|
+
{ text: 'are', styles: %i[bold italic] },
|
207
|
+
{ text: ' you now?', styles: %i[bold italic] }
|
206
208
|
]
|
207
209
|
arranger.format_array = array
|
208
210
|
while arranger.next_string
|
@@ -210,10 +212,10 @@ describe Prawn::Text::Formatted::Arranger do
|
|
210
212
|
arranger.update_last_string(' you', ' now?', nil)
|
211
213
|
expect(arranger.consumed[3]).to eq(
|
212
214
|
text: ' you',
|
213
|
-
styles: [
|
215
|
+
styles: %i[bold italic]
|
214
216
|
)
|
215
217
|
expect(arranger.unconsumed).to eq([
|
216
|
-
{ text: ' now?', styles: [
|
218
|
+
{ text: ' now?', styles: %i[bold italic] }
|
217
219
|
])
|
218
220
|
end
|
219
221
|
|
@@ -221,12 +223,12 @@ describe Prawn::Text::Formatted::Arranger do
|
|
221
223
|
array = [
|
222
224
|
{ text: 'hello ' },
|
223
225
|
{ text: 'world how ', styles: [:bold] },
|
224
|
-
{ text: 'are', styles: [
|
226
|
+
{ text: 'are', styles: %i[bold italic] },
|
225
227
|
{ text: ' you now?' }
|
226
228
|
]
|
227
229
|
arranger.format_array = array
|
228
230
|
3.times { arranger.next_string }
|
229
|
-
expect(arranger.current_format_state).to eq(styles: [
|
231
|
+
expect(arranger.current_format_state).to eq(styles: %i[bold italic])
|
230
232
|
arranger.update_last_string('', 'are', '-')
|
231
233
|
expect(arranger.current_format_state).to eq(styles: [:bold])
|
232
234
|
end
|
@@ -236,7 +238,7 @@ describe Prawn::Text::Formatted::Arranger do
|
|
236
238
|
array = [
|
237
239
|
{ text: 'hello ' },
|
238
240
|
{ text: 'world how ', styles: [:bold] },
|
239
|
-
{ text: 'are', styles: [
|
241
|
+
{ text: 'are', styles: %i[bold italic] },
|
240
242
|
{ text: ' you now?' }
|
241
243
|
]
|
242
244
|
arranger.format_array = array
|
@@ -253,7 +255,7 @@ describe Prawn::Text::Formatted::Arranger do
|
|
253
255
|
array = [
|
254
256
|
{ text: 'hello ' },
|
255
257
|
{ text: 'world how ', styles: [:bold] },
|
256
|
-
{ text: 'are', styles: [
|
258
|
+
{ text: 'are', styles: %i[bold italic] },
|
257
259
|
{ text: ' you?' }
|
258
260
|
]
|
259
261
|
arranger.format_array = array
|
@@ -274,12 +276,12 @@ describe Prawn::Text::Formatted::Arranger do
|
|
274
276
|
end
|
275
277
|
|
276
278
|
describe '#finalize_line' do
|
277
|
-
it '
|
278
|
-
|
279
|
+
it 'makes it so that all trailing white space fragments exclude '\
|
280
|
+
'trailing white space' do
|
279
281
|
array = [
|
280
282
|
{ text: 'hello ' },
|
281
283
|
{ text: 'world how ', styles: [:bold] },
|
282
|
-
{ text: ' ', styles: [
|
284
|
+
{ text: ' ', styles: %i[bold italic] }
|
283
285
|
]
|
284
286
|
arranger.format_array = array
|
285
287
|
while arranger.next_string
|
@@ -374,7 +376,7 @@ describe Prawn::Text::Formatted::Arranger do
|
|
374
376
|
array = [
|
375
377
|
{ text: 'hello ' },
|
376
378
|
{ text: 'world how ', styles: [:bold] },
|
377
|
-
{ text: 'are', styles: [
|
379
|
+
{ text: 'are', styles: %i[bold italic] },
|
378
380
|
{ text: ' you now?' }
|
379
381
|
]
|
380
382
|
arranger.format_array = array
|
@@ -385,7 +387,7 @@ describe Prawn::Text::Formatted::Arranger do
|
|
385
387
|
array = [
|
386
388
|
{ text: 'hello ' },
|
387
389
|
{ text: 'world how ', styles: [:bold] },
|
388
|
-
{ text: 'are', styles: [
|
390
|
+
{ text: 'are', styles: %i[bold italic] },
|
389
391
|
{ text: ' you now?' }
|
390
392
|
]
|
391
393
|
arranger.format_array = array
|
@@ -400,7 +402,7 @@ describe Prawn::Text::Formatted::Arranger do
|
|
400
402
|
array = [
|
401
403
|
{ text: 'hello ' },
|
402
404
|
{ text: 'world how ', styles: [:bold] },
|
403
|
-
{ text: 'are', styles: [
|
405
|
+
{ text: 'are', styles: %i[bold italic] },
|
404
406
|
{ text: ' you now?' }
|
405
407
|
]
|
406
408
|
arranger.format_array = array
|
@@ -414,7 +416,7 @@ describe Prawn::Text::Formatted::Arranger do
|
|
414
416
|
array = [
|
415
417
|
{ text: 'hello ' },
|
416
418
|
{ text: 'world how ', styles: [:bold] },
|
417
|
-
{ text: 'are', styles: [
|
419
|
+
{ text: 'are', styles: %i[bold italic] },
|
418
420
|
{ text: ' you now?' }
|
419
421
|
]
|
420
422
|
arranger.format_array = array
|
@@ -429,7 +431,7 @@ describe Prawn::Text::Formatted::Arranger do
|
|
429
431
|
array = [
|
430
432
|
{ text: 'hello ' },
|
431
433
|
{ text: 'world how ', styles: [:bold] },
|
432
|
-
{ text: 'are', styles: [
|
434
|
+
{ text: 'are', styles: %i[bold italic], size: 28 },
|
433
435
|
{ text: ' you now?' }
|
434
436
|
]
|
435
437
|
arranger.format_array = array
|
@@ -445,7 +447,7 @@ describe Prawn::Text::Formatted::Arranger do
|
|
445
447
|
array = [
|
446
448
|
{ text: 'hello ' },
|
447
449
|
{ text: 'world how ', styles: [:bold] },
|
448
|
-
{ text: 'are', styles: [
|
450
|
+
{ text: 'are', styles: %i[bold italic] },
|
449
451
|
{ text: ' you now?' }
|
450
452
|
]
|
451
453
|
arranger.format_array = array
|
@@ -456,7 +458,7 @@ describe Prawn::Text::Formatted::Arranger do
|
|
456
458
|
arranger.retrieve_fragment
|
457
459
|
arranger.repack_unretrieved
|
458
460
|
expect(arranger.unconsumed).to eq([
|
459
|
-
{ text: 'are', styles: [
|
461
|
+
{ text: 'are', styles: %i[bold italic] },
|
460
462
|
{ text: ' you now?' }
|
461
463
|
])
|
462
464
|
end
|