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
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Prawn::Document do
|
@@ -26,6 +28,7 @@ describe Prawn::Document do
|
|
26
28
|
let(:num_columns) { 5 }
|
27
29
|
let(:num_rows) { 8 }
|
28
30
|
let(:gutter) { 10.0 }
|
31
|
+
|
29
32
|
before do
|
30
33
|
pdf.define_grid(
|
31
34
|
columns: num_columns,
|
data/spec/prawn/document_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
require 'tempfile'
|
3
5
|
|
@@ -32,7 +34,7 @@ describe Prawn::Document do
|
|
32
34
|
|
33
35
|
describe 'when generating a document with a custom text formatter' do
|
34
36
|
it 'uses the provided text formatter' do
|
35
|
-
|
37
|
+
text_formatter = Class.new do
|
36
38
|
def self.format(string)
|
37
39
|
[
|
38
40
|
{
|
@@ -49,7 +51,7 @@ describe Prawn::Document do
|
|
49
51
|
]
|
50
52
|
end
|
51
53
|
end
|
52
|
-
pdf = described_class.new text_formatter:
|
54
|
+
pdf = described_class.new text_formatter: text_formatter
|
53
55
|
pdf.text 'Dr. Who?', inline_format: true
|
54
56
|
text = PDF::Inspector::Text.analyze(pdf.render)
|
55
57
|
expect(text.strings.first).to eq("Just 'The Doctor'.")
|
@@ -161,6 +163,48 @@ describe Prawn::Document do
|
|
161
163
|
end
|
162
164
|
end
|
163
165
|
|
166
|
+
describe '#delete_page(index)' do
|
167
|
+
before do
|
168
|
+
pdf.text 'Page one'
|
169
|
+
pdf.start_new_page
|
170
|
+
pdf.text 'Page two'
|
171
|
+
pdf.start_new_page
|
172
|
+
pdf.text 'Page three'
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'destroy a specific page of the document' do
|
176
|
+
pdf.delete_page(1)
|
177
|
+
expect(pdf.page_number).to eq(2)
|
178
|
+
text_analysis = PDF::Inspector::Text.analyze(pdf.render)
|
179
|
+
expect(text_analysis.strings).to eq(['Page one', 'Page three'])
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'destroy the last page of the document' do
|
183
|
+
pdf.delete_page(-1)
|
184
|
+
expect(pdf.page_number).to eq(2)
|
185
|
+
text_analysis = PDF::Inspector::Text.analyze(pdf.render)
|
186
|
+
expect(text_analysis.strings).to eq(['Page one', 'Page two'])
|
187
|
+
end
|
188
|
+
|
189
|
+
context 'with an invalid index' do
|
190
|
+
let(:expected_content) { ['Page one', 'Page two', 'Page three'] }
|
191
|
+
|
192
|
+
it 'does not destroy an invalid positve index' do
|
193
|
+
pdf.delete_page(42)
|
194
|
+
expect(pdf.page_number).to eq(3)
|
195
|
+
text_analysis = PDF::Inspector::Text.analyze(pdf.render)
|
196
|
+
expect(text_analysis.strings).to eq(expected_content)
|
197
|
+
end
|
198
|
+
|
199
|
+
it 'does not destroy an invalid negative index' do
|
200
|
+
pdf.delete_page(-42)
|
201
|
+
expect(pdf.page_number).to eq(3)
|
202
|
+
text_analysis = PDF::Inspector::Text.analyze(pdf.render)
|
203
|
+
expect(text_analysis.strings).to eq(expected_content)
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
164
208
|
describe '#page_number' do
|
165
209
|
it 'is 1 for a new document' do
|
166
210
|
pdf = described_class.new
|
@@ -356,7 +400,7 @@ describe Prawn::Document do
|
|
356
400
|
end
|
357
401
|
|
358
402
|
(PDF::Core::PageGeometry::SIZES.keys - ['LETTER']).each do |k|
|
359
|
-
it "
|
403
|
+
it "provides #{k} geometry" do
|
360
404
|
pdf = described_class.new(page_size: k)
|
361
405
|
pages = PDF::Inspector::Page.analyze(pdf.render).pages
|
362
406
|
expect(pages.first[:size]).to eq(PDF::Core::PageGeometry::SIZES[k])
|
@@ -572,7 +616,7 @@ describe Prawn::Document do
|
|
572
616
|
expect(pdf).to_not have_received(:text_box)
|
573
617
|
end
|
574
618
|
|
575
|
-
context 'start_count_at option' do
|
619
|
+
context 'with start_count_at option' do
|
576
620
|
[1, 2].each do |startat|
|
577
621
|
context "equal to #{startat}" do
|
578
622
|
it 'increments the pages' do
|
@@ -605,7 +649,7 @@ describe Prawn::Document do
|
|
605
649
|
end
|
606
650
|
end
|
607
651
|
|
608
|
-
context 'total_pages option' do
|
652
|
+
context 'with total_pages option' do
|
609
653
|
it 'allows the total pages count to be overridden' do
|
610
654
|
2.times { pdf.start_new_page }
|
611
655
|
allow(pdf).to receive(:text_box)
|
@@ -616,8 +660,8 @@ describe Prawn::Document do
|
|
616
660
|
end
|
617
661
|
end
|
618
662
|
|
619
|
-
context 'special page filter' do
|
620
|
-
|
663
|
+
context 'with special page filter' do
|
664
|
+
describe 'such as :odd' do
|
621
665
|
it 'increments the pages' do
|
622
666
|
3.times { pdf.start_new_page }
|
623
667
|
allow(pdf).to receive(:text_box)
|
@@ -629,7 +673,7 @@ describe Prawn::Document do
|
|
629
673
|
end
|
630
674
|
end
|
631
675
|
|
632
|
-
|
676
|
+
describe 'missing' do
|
633
677
|
it 'does not print any page numbers' do
|
634
678
|
3.times { pdf.start_new_page }
|
635
679
|
allow(pdf).to receive(:text_box)
|
@@ -640,8 +684,8 @@ describe Prawn::Document do
|
|
640
684
|
end
|
641
685
|
end
|
642
686
|
|
643
|
-
context '
|
644
|
-
|
687
|
+
context 'with both a special page filter and a start_count_at parameter' do
|
688
|
+
describe 'such as :odd and 7' do
|
645
689
|
it 'increments the pages' do
|
646
690
|
3.times { pdf.start_new_page }
|
647
691
|
allow(pdf).to receive(:text_box)
|
@@ -660,7 +704,8 @@ describe Prawn::Document do
|
|
660
704
|
expect(pdf).to have_received(:text_box).with('7 3', height: 50)
|
661
705
|
end
|
662
706
|
end
|
663
|
-
|
707
|
+
|
708
|
+
context 'with some crazy proc and 2' do
|
664
709
|
it 'increments the pages' do
|
665
710
|
6.times { pdf.start_new_page }
|
666
711
|
options = {
|
@@ -691,7 +736,7 @@ describe Prawn::Document do
|
|
691
736
|
end
|
692
737
|
end
|
693
738
|
|
694
|
-
|
739
|
+
describe 'height option' do
|
695
740
|
before do
|
696
741
|
pdf.start_new_page
|
697
742
|
end
|
@@ -724,7 +769,7 @@ describe Prawn::Document do
|
|
724
769
|
end
|
725
770
|
|
726
771
|
it 'returns nil given no filter' do
|
727
|
-
expect(pdf.
|
772
|
+
expect(pdf).to_not be_page_match(:nil, 1)
|
728
773
|
end
|
729
774
|
|
730
775
|
it 'must provide an :all filter' do
|
@@ -735,7 +780,7 @@ describe Prawn::Document do
|
|
735
780
|
it 'must provide an :odd filter' do
|
736
781
|
odd, even = (1..pdf.page_count).partition(&:odd?)
|
737
782
|
expect(odd.all? { |i| pdf.page_match?(:odd, i) }).to eq true
|
738
|
-
expect(even.
|
783
|
+
expect(even).to_not(be_any { |i| pdf.page_match?(:odd, i) })
|
739
784
|
end
|
740
785
|
|
741
786
|
it 'must be able to filter by an array of page numbers' do
|
data/spec/prawn/font_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
require 'pathname'
|
3
5
|
|
@@ -39,7 +41,7 @@ describe Prawn::Font do
|
|
39
41
|
it 'takes character spacing into account' do
|
40
42
|
original_width = pdf.width_of('hello world')
|
41
43
|
pdf.character_spacing(7) do
|
42
|
-
expect(pdf.width_of('hello world')).to eq(original_width +
|
44
|
+
expect(pdf.width_of('hello world')).to eq(original_width + 10 * 7)
|
43
45
|
end
|
44
46
|
end
|
45
47
|
|
@@ -69,6 +71,14 @@ describe Prawn::Font do
|
|
69
71
|
end
|
70
72
|
end
|
71
73
|
|
74
|
+
it 'reports missing font with style' do
|
75
|
+
expect do
|
76
|
+
pdf.font('Nada', style: :bold) do
|
77
|
+
pdf.width_of('hello')
|
78
|
+
end
|
79
|
+
end.to raise_error(Prawn::Errors::UnknownFont, /Nada \(bold\)/)
|
80
|
+
end
|
81
|
+
|
72
82
|
it 'calculates styled widths correctly using TTFs' do
|
73
83
|
pdf.font_families.update(
|
74
84
|
'DejaVu Sans' => {
|
@@ -134,9 +144,9 @@ describe Prawn::Font do
|
|
134
144
|
|
135
145
|
text = PDF::Inspector::Text.analyze(pdf.render)
|
136
146
|
expect(text.font_settings.map { |e| e[:name] }).to eq(
|
137
|
-
[
|
138
|
-
|
139
|
-
|
147
|
+
%i[
|
148
|
+
Courier-Bold Courier-BoldOblique Courier-Oblique
|
149
|
+
Courier Helvetica
|
140
150
|
]
|
141
151
|
)
|
142
152
|
end
|
@@ -263,7 +273,7 @@ describe Prawn::Font do
|
|
263
273
|
pdf.font 'Times-Roman'
|
264
274
|
pdf.text('hello')
|
265
275
|
|
266
|
-
[
|
276
|
+
%w[Courier Helvetica Times-Roman].each do |f|
|
267
277
|
page_should_include_font(f)
|
268
278
|
end
|
269
279
|
|
@@ -342,12 +352,6 @@ describe Prawn::Font do
|
|
342
352
|
normalized = times.normalize_encoding(original)
|
343
353
|
expect(original.equal?(normalized)).to eq false
|
344
354
|
end
|
345
|
-
|
346
|
-
it 'modifies the original string when normalize_encoding!() is used' do
|
347
|
-
original = 'Foo'
|
348
|
-
normalized = times.normalize_encoding!(original)
|
349
|
-
expect(original.equal?(normalized)).to eq true
|
350
|
-
end
|
351
355
|
end
|
352
356
|
|
353
357
|
it 'omits /Encoding for symbolic fonts' do
|
@@ -450,11 +454,36 @@ describe Prawn::Font do
|
|
450
454
|
normalized = font.normalize_encoding(original)
|
451
455
|
expect(original.equal?(normalized)).to eq false
|
452
456
|
end
|
457
|
+
end
|
458
|
+
end
|
459
|
+
|
460
|
+
describe 'OTF fonts' do
|
461
|
+
let(:font) { pdf.find_font "#{Prawn::DATADIR}/fonts/Bodoni-Book.otf" }
|
453
462
|
|
454
|
-
|
463
|
+
it 'calculates string width taking into account accented characters' do
|
464
|
+
expect(font.compute_width_of('é', size: 12)).to eq(
|
465
|
+
font.compute_width_of('e', size: 12)
|
466
|
+
)
|
467
|
+
end
|
468
|
+
|
469
|
+
it 'uses the ascender, descender, and cap height from the OTF verbatim' do
|
470
|
+
# These metrics are relative to the font's own bbox. They should not be
|
471
|
+
# scaled with font size.
|
472
|
+
ref = pdf.ref!({})
|
473
|
+
font.send :embed, ref, 0
|
474
|
+
|
475
|
+
# Pull out the embedded font descriptor
|
476
|
+
descriptor = ref.data[:FontDescriptor].data
|
477
|
+
expect(descriptor[:Ascent]).to eq(1023)
|
478
|
+
expect(descriptor[:Descent]).to eq(-200)
|
479
|
+
expect(descriptor[:CapHeight]).to eq(3072)
|
480
|
+
end
|
481
|
+
|
482
|
+
describe 'when normalizing encoding' do
|
483
|
+
it 'does not modify the original string with normalize_encoding()' do
|
455
484
|
original = 'Foo'
|
456
|
-
normalized = font.normalize_encoding
|
457
|
-
expect(original.
|
485
|
+
normalized = font.normalize_encoding(original)
|
486
|
+
expect(original).to_not be_equal(normalized)
|
458
487
|
end
|
459
488
|
end
|
460
489
|
end
|
@@ -463,14 +492,14 @@ describe Prawn::Font do
|
|
463
492
|
let(:file) { "#{Prawn::DATADIR}/fonts/Panic+Sans.dfont" }
|
464
493
|
|
465
494
|
it 'lists all named fonts' do
|
466
|
-
list = Prawn::
|
495
|
+
list = Prawn::Fonts::DFont.named_fonts(file)
|
467
496
|
expect(list).to match_array(%w[
|
468
497
|
PanicSans PanicSans-Bold PanicSans-BoldItalic PanicSans-Italic
|
469
498
|
])
|
470
499
|
end
|
471
500
|
|
472
501
|
it 'counts the number of fonts in the file' do
|
473
|
-
expect(Prawn::
|
502
|
+
expect(Prawn::Fonts::DFont.font_count(file)).to eq(4)
|
474
503
|
end
|
475
504
|
|
476
505
|
it 'defaults selected font to the first one if not specified' do
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Prawn::Graphics::BlendMode do
|
@@ -42,9 +44,9 @@ describe Prawn::Graphics::BlendMode do
|
|
42
44
|
|
43
45
|
it 'setting the blend mode with multiple parameters sets an array of '\
|
44
46
|
'blend modes' do
|
45
|
-
make_blend_mode([
|
47
|
+
make_blend_mode(%i[Multiply Screen Overlay])
|
46
48
|
extgstate = PDF::Inspector::ExtGState.analyze(pdf.render).extgstates.first
|
47
|
-
expect(extgstate[:blend_mode]).to eq([
|
49
|
+
expect(extgstate[:blend_mode]).to eq(%i[Multiply Screen Overlay])
|
48
50
|
end
|
49
51
|
|
50
52
|
describe 'with more than one page' do
|
data/spec/prawn/graphics_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Prawn::Graphics do
|
@@ -12,8 +14,7 @@ describe Prawn::Graphics do
|
|
12
14
|
expect(line_drawing.points).to eq([[100, 600], [100, 500]])
|
13
15
|
end
|
14
16
|
|
15
|
-
it '
|
16
|
-
'and (75,100) to (50,125)' do
|
17
|
+
it 'draws two lines at (100,600) to (100,500) and (75,100) to (50,125)' do
|
17
18
|
pdf.line(100, 600, 100, 500)
|
18
19
|
pdf.line(75, 100, 50, 125)
|
19
20
|
|
@@ -67,6 +68,7 @@ describe Prawn::Graphics do
|
|
67
68
|
line_drawing = PDF::Inspector::Graphics::Line.analyze(pdf.render)
|
68
69
|
expect(line_drawing.points).to eq([[350, 300], [350, 400]])
|
69
70
|
end
|
71
|
+
|
70
72
|
it 'requires a y coordinate' do
|
71
73
|
expect { pdf.vertical_line(400, 500) }
|
72
74
|
.to raise_error(ArgumentError)
|
@@ -116,6 +118,7 @@ describe Prawn::Graphics do
|
|
116
118
|
|
117
119
|
describe 'When drawing a rounded rectangle' do
|
118
120
|
before { pdf.rounded_rectangle([50, 550], 50, 100, 10) }
|
121
|
+
|
119
122
|
let(:original_point) do
|
120
123
|
curve = PDF::Inspector::Graphics::Curve.analyze(pdf.render)
|
121
124
|
curve_points = curve.coords.each_slice(2).to_a
|
@@ -245,6 +248,10 @@ describe Prawn::Graphics do
|
|
245
248
|
expect { pdf.fill_color 'zcff00' }.to raise_error(ArgumentError)
|
246
249
|
end
|
247
250
|
|
251
|
+
it 'raises an error for a color string with invalid characters' do
|
252
|
+
expect { pdf.fill_color 'f0f0f?' }.to raise_error(ArgumentError)
|
253
|
+
end
|
254
|
+
|
248
255
|
it 'resets the colors on each new page if they have been defined' do
|
249
256
|
pdf.fill_color 'ccff00'
|
250
257
|
|
@@ -295,6 +302,23 @@ describe Prawn::Graphics do
|
|
295
302
|
end).to eq true
|
296
303
|
end
|
297
304
|
|
305
|
+
it 'creates a unique ID for each pattern resource' do
|
306
|
+
pdf.fill_gradient(
|
307
|
+
[256, 512],
|
308
|
+
[356, 512],
|
309
|
+
'ffffff', 'fe00ff'
|
310
|
+
)
|
311
|
+
pdf.fill_gradient(
|
312
|
+
[256, 256],
|
313
|
+
[356, 256],
|
314
|
+
'ffffff', '0000ff'
|
315
|
+
)
|
316
|
+
|
317
|
+
str = pdf.render
|
318
|
+
pattern_ids = str.scan(/SP\h{40}\s+scn/)
|
319
|
+
expect(pattern_ids.uniq.length).to eq 2
|
320
|
+
end
|
321
|
+
|
298
322
|
it 'fill_gradient should set fill color to the pattern' do
|
299
323
|
pdf.fill_gradient(
|
300
324
|
[0, pdf.bounds.height],
|
@@ -411,7 +435,7 @@ describe Prawn::Graphics do
|
|
411
435
|
end
|
412
436
|
|
413
437
|
describe 'gradient transformations' do
|
414
|
-
subject do
|
438
|
+
subject(:transformations) do
|
415
439
|
pdf.scale 2 do
|
416
440
|
pdf.translate 40, 40 do
|
417
441
|
pdf.fill_gradient [0, 10], [15, 15], 'FF0000', '0000FF', opts
|
@@ -429,7 +453,7 @@ describe Prawn::Graphics do
|
|
429
453
|
|
430
454
|
it 'uses the transformation stack to translate user co-ordinates to '\
|
431
455
|
'document co-ordinates required by /Pattern' do
|
432
|
-
|
456
|
+
expect(transformations).to eq([[2, 0, 0, 2, 80, 100]])
|
433
457
|
end
|
434
458
|
end
|
435
459
|
|
@@ -437,7 +461,7 @@ describe Prawn::Graphics do
|
|
437
461
|
let(:opts) { { apply_transformations: false } }
|
438
462
|
|
439
463
|
it "doesn't transform the gradient" do
|
440
|
-
|
464
|
+
expect(transformations).to eq([[1, 0, 0, 1, 0, 10]])
|
441
465
|
end
|
442
466
|
end
|
443
467
|
|
@@ -446,7 +470,7 @@ describe Prawn::Graphics do
|
|
446
470
|
|
447
471
|
it "doesn't transform the gradient and displays a warning" do
|
448
472
|
allow(pdf).to receive(:warn).twice
|
449
|
-
|
473
|
+
expect(transformations).to eq([[1, 0, 0, 1, 0, 10]])
|
450
474
|
expect(pdf).to have_received(:warn).twice
|
451
475
|
end
|
452
476
|
end
|
@@ -607,7 +631,7 @@ describe Prawn::Graphics do
|
|
607
631
|
'the initializer' do
|
608
632
|
new_state = PDF::Core::GraphicState.new(pdf.graphic_state)
|
609
633
|
|
610
|
-
[
|
634
|
+
%i[color_space dash fill_color stroke_color].each do |attr|
|
611
635
|
expect(new_state.send(attr)).to eq(pdf.graphic_state.send(attr))
|
612
636
|
expect(new_state.send(attr)).to_not equal(pdf.graphic_state.send(attr))
|
613
637
|
end
|
@@ -616,7 +640,7 @@ describe Prawn::Graphics do
|
|
616
640
|
it 'copies mutable attributes when duping' do
|
617
641
|
new_state = pdf.graphic_state.dup
|
618
642
|
|
619
|
-
[
|
643
|
+
%i[color_space dash fill_color stroke_color].each do |attr|
|
620
644
|
expect(new_state.send(attr)).to eq(pdf.graphic_state.send(attr))
|
621
645
|
expect(new_state.send(attr)).to_not equal(pdf.graphic_state.send(attr))
|
622
646
|
end
|
@@ -629,15 +653,15 @@ describe Prawn::Graphics do
|
|
629
653
|
|
630
654
|
it 'sends the right content on transformation_matrix' do
|
631
655
|
allow(pdf.renderer).to receive(:add_content)
|
632
|
-
.with('1.
|
656
|
+
.with('1.0 0.0 0.12346 -1.0 5.5 20.0 cm')
|
633
657
|
pdf.transformation_matrix 1, 0, 0.123456789, -1.0, 5.5, 20
|
634
658
|
expect(pdf.renderer).to have_received(:add_content)
|
635
|
-
.with('1.
|
659
|
+
.with('1.0 0.0 0.12346 -1.0 5.5 20.0 cm')
|
636
660
|
end
|
637
661
|
|
638
662
|
it 'uses fixed digits with very small number' do
|
639
663
|
values = Array.new(6, 0.000000000001)
|
640
|
-
string = Array.new(6, '0.
|
664
|
+
string = Array.new(6, '0.0').join ' '
|
641
665
|
allow(pdf.renderer).to receive(:add_content).with("#{string} cm")
|
642
666
|
pdf.transformation_matrix(*values)
|
643
667
|
expect(pdf.renderer).to have_received(:add_content).with("#{string} cm")
|
@@ -651,7 +675,7 @@ describe Prawn::Graphics do
|
|
651
675
|
|
652
676
|
it 'saves the graphics state inside the given block' do
|
653
677
|
values = Array.new(6, 0.000000000001)
|
654
|
-
string = Array.new(6, '0.
|
678
|
+
string = Array.new(6, '0.0').join ' '
|
655
679
|
|
656
680
|
allow(pdf).to receive(:save_graphics_state).with(no_args)
|
657
681
|
allow(pdf.renderer).to receive(:add_content).with(any_args).twice
|
@@ -742,10 +766,6 @@ describe Prawn::Graphics do
|
|
742
766
|
pdf.rotate(angle, origin: [x, y])
|
743
767
|
end.to raise_error(Prawn::Errors::BlockRequired)
|
744
768
|
end
|
745
|
-
|
746
|
-
def reduce_precision(float)
|
747
|
-
(format '%.5f', float).to_f
|
748
|
-
end
|
749
769
|
end
|
750
770
|
|
751
771
|
describe '#translate' do
|
@@ -808,10 +828,10 @@ describe Prawn::Graphics do
|
|
808
828
|
pdf.scale(factor, origin: [x, y])
|
809
829
|
end.to raise_error(Prawn::Errors::BlockRequired)
|
810
830
|
end
|
811
|
-
|
812
|
-
def reduce_precision(float)
|
813
|
-
(format '%.5f', float).to_f
|
814
|
-
end
|
815
831
|
end
|
816
832
|
end
|
833
|
+
|
834
|
+
def reduce_precision(float)
|
835
|
+
float.round(5)
|
836
|
+
end
|
817
837
|
end
|