prawn 2.2.2 → 2.3.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 +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::Text::Formatted::Box do
|
@@ -260,7 +262,7 @@ describe Prawn::Text::Formatted::Box do
|
|
260
262
|
expect(fonts_used[1]).to match(/Kai/)
|
261
263
|
end
|
262
264
|
|
263
|
-
it '
|
265
|
+
it 'omits the fallback fonts overhead when passing an empty array ' \
|
264
266
|
'as the :fallback_fonts' do
|
265
267
|
pdf.font('Kai')
|
266
268
|
|
@@ -299,33 +301,63 @@ describe Prawn::Text::Formatted::Box do
|
|
299
301
|
end
|
300
302
|
|
301
303
|
describe 'Text::Formatted::Box#extensions' do
|
304
|
+
let(:formatted_wrap_override) do
|
305
|
+
Module.new do
|
306
|
+
# rubocop: disable RSpec/InstanceVariable
|
307
|
+
def wrap(_array)
|
308
|
+
initialize_wrap([{ text: 'all your base are belong to us' }])
|
309
|
+
@line_wrap.wrap_line(
|
310
|
+
document: @document,
|
311
|
+
kerning: @kerning,
|
312
|
+
width: 10_000,
|
313
|
+
arranger: @arranger
|
314
|
+
)
|
315
|
+
fragment = @arranger.retrieve_fragment
|
316
|
+
format_and_draw_fragment(fragment, 0, @line_wrap.width, 0)
|
317
|
+
|
318
|
+
[]
|
319
|
+
end
|
320
|
+
# rubocop: enable RSpec/InstanceVariable
|
321
|
+
end
|
322
|
+
end
|
323
|
+
|
302
324
|
it 'is able to override default line wrapping' do
|
303
|
-
described_class.extensions <<
|
325
|
+
described_class.extensions << formatted_wrap_override
|
304
326
|
pdf.formatted_text_box([{ text: 'hello world' }], {})
|
305
|
-
described_class.extensions.delete(
|
327
|
+
described_class.extensions.delete(formatted_wrap_override)
|
306
328
|
text = PDF::Inspector::Text.analyze(pdf.render)
|
307
329
|
expect(text.strings[0]).to eq('all your base are belong to us')
|
308
330
|
end
|
309
331
|
|
310
332
|
it 'overrides Text::Formatted::Box line wrapping does not affect ' \
|
311
333
|
'Text::Box wrapping' do
|
312
|
-
described_class.extensions <<
|
334
|
+
described_class.extensions << formatted_wrap_override
|
313
335
|
pdf.text_box('hello world', {})
|
314
|
-
described_class.extensions.delete(
|
336
|
+
described_class.extensions.delete(formatted_wrap_override)
|
315
337
|
text = PDF::Inspector::Text.analyze(pdf.render)
|
316
338
|
expect(text.strings[0]).to eq('hello world')
|
317
339
|
end
|
318
340
|
|
319
341
|
it "overring Text::Box line wrapping doesn't override Text::Box wrapping" do
|
320
|
-
Prawn::Text::Box.extensions <<
|
342
|
+
Prawn::Text::Box.extensions << formatted_wrap_override
|
321
343
|
pdf.text_box('hello world', {})
|
322
|
-
Prawn::Text::Box.extensions.delete(
|
344
|
+
Prawn::Text::Box.extensions.delete(formatted_wrap_override)
|
323
345
|
text = PDF::Inspector::Text.analyze(pdf.render)
|
324
346
|
expect(text.strings[0]).to eq('all your base are belong to us')
|
325
347
|
end
|
326
348
|
end
|
327
349
|
|
328
350
|
describe 'Text::Formatted::Box#render' do
|
351
|
+
let(:fragment_callback_class) do
|
352
|
+
Class.new do
|
353
|
+
def initialize(_string, _number, _options); end
|
354
|
+
|
355
|
+
def render_behind(fragment); end
|
356
|
+
|
357
|
+
def render_in_front(fragment); end
|
358
|
+
end
|
359
|
+
end
|
360
|
+
|
329
361
|
it 'handles newlines' do
|
330
362
|
array = [{ text: "hello\nworld" }]
|
331
363
|
options = { document: pdf }
|
@@ -377,11 +409,10 @@ describe Prawn::Text::Formatted::Box do
|
|
377
409
|
expect(text.strings[2]).to eq(' olleh' * number_of_hellos)
|
378
410
|
expect(text.strings[3]).to eq('?uoy')
|
379
411
|
end
|
380
|
-
end
|
381
412
|
|
382
|
-
describe 'Text::Formatted::Box#render' do
|
383
413
|
it 'is able to perform fragment callbacks' do
|
384
|
-
callback_object =
|
414
|
+
callback_object =
|
415
|
+
fragment_callback_class.new('something', 7, document: pdf)
|
385
416
|
allow(callback_object).to receive(:render_behind)
|
386
417
|
allow(callback_object).to receive(:render_in_front)
|
387
418
|
array = [
|
@@ -400,11 +431,12 @@ describe Prawn::Text::Formatted::Box do
|
|
400
431
|
end
|
401
432
|
|
402
433
|
it 'is able to perform fragment callbacks on multiple objects' do
|
403
|
-
callback_object =
|
434
|
+
callback_object =
|
435
|
+
fragment_callback_class.new('something', 7, document: pdf)
|
404
436
|
allow(callback_object).to receive(:render_behind)
|
405
437
|
allow(callback_object).to receive(:render_in_front)
|
406
438
|
|
407
|
-
callback_object2 =
|
439
|
+
callback_object2 = fragment_callback_class.new(
|
408
440
|
'something else', 14, document: pdf
|
409
441
|
)
|
410
442
|
allow(callback_object2).to receive(:render_behind)
|
@@ -432,11 +464,23 @@ describe Prawn::Text::Formatted::Box do
|
|
432
464
|
end
|
433
465
|
|
434
466
|
it 'fragment callbacks is able to define only the callback they need' do
|
435
|
-
behind =
|
467
|
+
behind = (
|
468
|
+
Class.new do
|
469
|
+
def initialize(_string, _number, _options); end
|
470
|
+
|
471
|
+
def render_behind(fragment); end
|
472
|
+
end
|
473
|
+
).new(
|
436
474
|
'something', 7,
|
437
475
|
document: pdf
|
438
476
|
)
|
439
|
-
in_front =
|
477
|
+
in_front = (
|
478
|
+
Class.new do
|
479
|
+
def initialize(_string, _number, _options); end
|
480
|
+
|
481
|
+
def render_in_front(fragment); end
|
482
|
+
end
|
483
|
+
).new(
|
440
484
|
'something', 7,
|
441
485
|
document: pdf
|
442
486
|
)
|
@@ -463,7 +507,7 @@ describe Prawn::Text::Formatted::Box do
|
|
463
507
|
text_box.render
|
464
508
|
contents = PDF::Inspector::Text.analyze(pdf.render)
|
465
509
|
fonts = contents.font_settings.map { |e| e[:name] }
|
466
|
-
expect(fonts).to eq([
|
510
|
+
expect(fonts).to eq(%i[Helvetica Times-Bold Helvetica])
|
467
511
|
expect(contents.strings[0]).to eq('this contains ')
|
468
512
|
expect(contents.strings[1]).to eq('Times-Bold')
|
469
513
|
expect(contents.strings[2]).to eq(' text')
|
@@ -479,7 +523,7 @@ describe Prawn::Text::Formatted::Box do
|
|
479
523
|
text_box.render
|
480
524
|
contents = PDF::Inspector::Text.analyze(pdf.render)
|
481
525
|
fonts = contents.font_settings.map { |e| e[:name] }
|
482
|
-
expect(fonts).to eq([
|
526
|
+
expect(fonts).to eq(%i[Helvetica Helvetica-Bold Helvetica])
|
483
527
|
expect(contents.strings[0]).to eq('this contains ')
|
484
528
|
expect(contents.strings[1]).to eq('bold')
|
485
529
|
expect(contents.strings[2]).to eq(' text')
|
@@ -495,7 +539,7 @@ describe Prawn::Text::Formatted::Box do
|
|
495
539
|
text_box.render
|
496
540
|
contents = PDF::Inspector::Text.analyze(pdf.render)
|
497
541
|
fonts = contents.font_settings.map { |e| e[:name] }
|
498
|
-
expect(fonts).to eq([
|
542
|
+
expect(fonts).to eq(%i[Helvetica Helvetica-Oblique Helvetica])
|
499
543
|
end
|
500
544
|
|
501
545
|
it 'is able to set subscript' do
|
@@ -529,15 +573,16 @@ describe Prawn::Text::Formatted::Box do
|
|
529
573
|
it 'is able to set compound bold and italic text' do
|
530
574
|
array = [
|
531
575
|
{ text: 'this contains ' },
|
532
|
-
{ text: 'bold italic', styles: [
|
576
|
+
{ text: 'bold italic', styles: %i[bold italic] },
|
533
577
|
{ text: ' text' }
|
534
578
|
]
|
535
579
|
text_box = described_class.new(array, document: pdf)
|
536
580
|
text_box.render
|
537
581
|
contents = PDF::Inspector::Text.analyze(pdf.render)
|
538
582
|
fonts = contents.font_settings.map { |e| e[:name] }
|
539
|
-
expect(fonts).to eq([
|
583
|
+
expect(fonts).to eq(%i[Helvetica Helvetica-BoldOblique Helvetica])
|
540
584
|
end
|
585
|
+
|
541
586
|
it 'is able to underline' do
|
542
587
|
array = [
|
543
588
|
{ text: 'this contains ' },
|
@@ -740,6 +785,20 @@ describe Prawn::Text::Formatted::Box do
|
|
740
785
|
contents = PDF::Inspector::Text.analyze(pdf.render)
|
741
786
|
expect(contents.word_spacing).to be_empty
|
742
787
|
end
|
788
|
+
|
789
|
+
it 'raise an exception when align value is not a symbol' do
|
790
|
+
array = [
|
791
|
+
{ text: 'hello world ' },
|
792
|
+
{ text: "\n" },
|
793
|
+
{ text: 'goodbye' }
|
794
|
+
]
|
795
|
+
options = { document: pdf, align: 'justify' }
|
796
|
+
text_box = described_class.new(array, options)
|
797
|
+
expect { text_box.render }.to raise_error(
|
798
|
+
ArgumentError,
|
799
|
+
'align must be one of :left, :right, :center or :justify symbols'
|
800
|
+
)
|
801
|
+
end
|
743
802
|
end
|
744
803
|
|
745
804
|
describe 'Text::Formatted::Box#render with :valign => :center' do
|
@@ -784,42 +843,4 @@ describe Prawn::Text::Formatted::Box do
|
|
784
843
|
expect(text_box.at[1]).to be_within(0.01).of(top_padding)
|
785
844
|
end
|
786
845
|
end
|
787
|
-
|
788
|
-
class TestFragmentCallback
|
789
|
-
def initialize(_string, _number, _options); end
|
790
|
-
|
791
|
-
def render_behind(fragment); end
|
792
|
-
|
793
|
-
def render_in_front(fragment); end
|
794
|
-
end
|
795
|
-
|
796
|
-
class TestFragmentCallbackBehind
|
797
|
-
def initialize(_string, _number, _options); end
|
798
|
-
|
799
|
-
def render_behind(fragment); end
|
800
|
-
end
|
801
|
-
|
802
|
-
class TestFragmentCallbackInFront
|
803
|
-
def initialize(_string, _number, _options); end
|
804
|
-
|
805
|
-
def render_in_front(fragment); end
|
806
|
-
end
|
807
|
-
|
808
|
-
# rubocop: disable RSpec/InstanceVariable
|
809
|
-
module TestFormattedWrapOverride
|
810
|
-
def wrap(_array)
|
811
|
-
initialize_wrap([{ text: 'all your base are belong to us' }])
|
812
|
-
@line_wrap.wrap_line(
|
813
|
-
document: @document,
|
814
|
-
kerning: @kerning,
|
815
|
-
width: 10_000,
|
816
|
-
arranger: @arranger
|
817
|
-
)
|
818
|
-
fragment = @arranger.retrieve_fragment
|
819
|
-
format_and_draw_fragment(fragment, 0, @line_wrap.width, 0)
|
820
|
-
|
821
|
-
[]
|
822
|
-
end
|
823
|
-
end
|
824
|
-
# rubocop: enable RSpec/InstanceVariable
|
825
846
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Prawn::Text::Formatted::Fragment do
|
@@ -6,7 +8,7 @@ describe Prawn::Text::Formatted::Fragment do
|
|
6
8
|
describe 'Text::Formatted::Fragment' do
|
7
9
|
let(:fragment) do
|
8
10
|
format_state = {
|
9
|
-
styles: [
|
11
|
+
styles: %i[bold italic],
|
10
12
|
color: nil,
|
11
13
|
link: nil,
|
12
14
|
anchor: nil,
|
@@ -35,7 +37,7 @@ describe Prawn::Text::Formatted::Fragment do
|
|
35
37
|
|
36
38
|
describe '#styles' do
|
37
39
|
it 'returns the styles array' do
|
38
|
-
expect(fragment.styles).to eq([
|
40
|
+
expect(fragment.styles).to eq(%i[bold italic])
|
39
41
|
end
|
40
42
|
|
41
43
|
it 'nevers return nil' do
|
@@ -88,7 +90,7 @@ describe Prawn::Text::Formatted::Fragment do
|
|
88
90
|
end
|
89
91
|
|
90
92
|
describe '#absolute_bounding_box' do
|
91
|
-
it '
|
93
|
+
it 'returns the bounding box surrounding the fragment' \
|
92
94
|
' in absolute coordinates' do
|
93
95
|
target_box = [50, 193, 150, 217]
|
94
96
|
target_box[0] += pdf.bounds.absolute_left
|
@@ -128,7 +130,7 @@ describe Prawn::Text::Formatted::Fragment do
|
|
128
130
|
expect(fragment.space_count).to eq(2)
|
129
131
|
end
|
130
132
|
|
131
|
-
it '
|
133
|
+
it 'excludes trailing spaces from the count when ' \
|
132
134
|
':exclude_trailing_white_space => true' do
|
133
135
|
format_state = { exclude_trailing_white_space: true }
|
134
136
|
fragment = described_class.new(
|
@@ -165,7 +167,7 @@ describe Prawn::Text::Formatted::Fragment do
|
|
165
167
|
expect(fragment.text).to eq('hello world ')
|
166
168
|
end
|
167
169
|
|
168
|
-
it '
|
170
|
+
it 'returns the fragment text without trailing spaces when ' \
|
169
171
|
':exclude_trailing_white_space => true' do
|
170
172
|
format_state = { exclude_trailing_white_space: true }
|
171
173
|
fragment = described_class.new(
|
@@ -180,7 +182,7 @@ describe Prawn::Text::Formatted::Fragment do
|
|
180
182
|
describe '#word_spacing=' do
|
181
183
|
let(:fragment) do
|
182
184
|
format_state = {
|
183
|
-
styles: [
|
185
|
+
styles: %i[bold italic],
|
184
186
|
color: nil,
|
185
187
|
link: nil,
|
186
188
|
anchor: nil,
|
@@ -314,7 +316,7 @@ describe Prawn::Text::Formatted::Fragment do
|
|
314
316
|
end
|
315
317
|
|
316
318
|
describe '#default_direction=' do
|
317
|
-
it '
|
319
|
+
it 'sets the direction if there is no fragment level direction ' \
|
318
320
|
'specification' do
|
319
321
|
format_state = {}
|
320
322
|
fragment = described_class.new(
|
@@ -326,7 +328,7 @@ describe Prawn::Text::Formatted::Fragment do
|
|
326
328
|
expect(fragment.direction).to eq(:rtl)
|
327
329
|
end
|
328
330
|
|
329
|
-
it '
|
331
|
+
it 'does not set the direction if there is a fragment level direction ' \
|
330
332
|
'specification' do
|
331
333
|
format_state = { direction: :rtl }
|
332
334
|
fragment = described_class.new(
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Prawn::Text::Formatted::LineWrap do
|
@@ -18,7 +20,7 @@ describe Prawn::Text::Formatted::LineWrap do
|
|
18
20
|
end
|
19
21
|
let(:line_wrap) { described_class.new }
|
20
22
|
|
21
|
-
it '
|
23
|
+
it 'only returns an empty string if nothing fit or there' \
|
22
24
|
'was nothing to wrap' do
|
23
25
|
8.times do
|
24
26
|
line = line_wrap.wrap_line(
|
@@ -59,7 +61,7 @@ describe Prawn::Text::Formatted::LineWrap do
|
|
59
61
|
expect(string).to eq('hello world, goodbye')
|
60
62
|
end
|
61
63
|
|
62
|
-
it '
|
64
|
+
it 'strips trailing spaces when a white-space-only fragment was' \
|
63
65
|
' successfully pushed onto the end of a line but no other non-white' \
|
64
66
|
' space fragment fits after it' do
|
65
67
|
array = [
|
@@ -75,6 +77,7 @@ describe Prawn::Text::Formatted::LineWrap do
|
|
75
77
|
)
|
76
78
|
expect(string).to eq('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
|
77
79
|
end
|
80
|
+
|
78
81
|
it 'raise_errors CannotFit if a too-small width is given' do
|
79
82
|
array = [
|
80
83
|
{ text: ' hello world, ' },
|
@@ -183,7 +186,7 @@ describe Prawn::Text::Formatted::LineWrap do
|
|
183
186
|
expect(string).to eq('hello-')
|
184
187
|
end
|
185
188
|
|
186
|
-
it '
|
189
|
+
it 'does not break after a hyphen that follows white space and' \
|
187
190
|
'precedes a word' do
|
188
191
|
array = [{ text: 'hello -' }]
|
189
192
|
arranger.format_array = array
|
@@ -259,7 +262,7 @@ describe Prawn::Text::Formatted::LineWrap do
|
|
259
262
|
expect(res1).to eq(res2)
|
260
263
|
end
|
261
264
|
|
262
|
-
it '
|
265
|
+
it 'does not display soft hyphens except at the end of a line ' \
|
263
266
|
'for more than one element in format_array', issue: 347 do
|
264
267
|
pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf")
|
265
268
|
line_wrap = described_class.new
|
@@ -320,7 +323,7 @@ describe Prawn::Text::Formatted::LineWrap do
|
|
320
323
|
expect(string).to eq('hello')
|
321
324
|
end
|
322
325
|
|
323
|
-
it '
|
326
|
+
it 'does not break after a hard hyphen that follows a soft hyphen and' \
|
324
327
|
'precedes a word' do
|
325
328
|
string = pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}-")
|
326
329
|
array = [{ text: string }]
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Prawn::Text::Formatted::Parser do
|
@@ -17,6 +19,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
17
19
|
character_spacing: nil
|
18
20
|
)
|
19
21
|
end
|
22
|
+
|
20
23
|
it 'handles sub' do
|
21
24
|
string = '<sub>subscript</sub>'
|
22
25
|
array = described_class.format(string)
|
@@ -32,6 +35,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
32
35
|
character_spacing: nil
|
33
36
|
)
|
34
37
|
end
|
38
|
+
|
35
39
|
it 'handles rgb' do
|
36
40
|
string = "<color rgb='#ff0000'>red text</color>"
|
37
41
|
array = described_class.format(string)
|
@@ -47,6 +51,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
47
51
|
character_spacing: nil
|
48
52
|
)
|
49
53
|
end
|
54
|
+
|
50
55
|
it '# should be optional in rgb' do
|
51
56
|
string = "<color rgb='ff0000'>red text</color>"
|
52
57
|
array = described_class.format(string)
|
@@ -62,6 +67,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
62
67
|
character_spacing: nil
|
63
68
|
)
|
64
69
|
end
|
70
|
+
|
65
71
|
it 'handles cmyk' do
|
66
72
|
string = "<color c='0' m='100' y='0' k='0'>magenta text</color>"
|
67
73
|
array = described_class.format(string)
|
@@ -77,6 +83,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
77
83
|
character_spacing: nil
|
78
84
|
)
|
79
85
|
end
|
86
|
+
|
80
87
|
it 'handles fonts' do
|
81
88
|
string = "<font name='Courier'>Courier text</font>"
|
82
89
|
array = described_class.format(string)
|
@@ -92,6 +99,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
92
99
|
character_spacing: nil
|
93
100
|
)
|
94
101
|
end
|
102
|
+
|
95
103
|
it 'handles size' do
|
96
104
|
string = "<font size='14'>14 point text</font>"
|
97
105
|
array = described_class.format(string)
|
@@ -107,6 +115,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
107
115
|
character_spacing: nil
|
108
116
|
)
|
109
117
|
end
|
118
|
+
|
110
119
|
it 'handles character_spacing' do
|
111
120
|
string = "<font character_spacing='2.5'>extra character spacing</font>"
|
112
121
|
array = described_class.format(string)
|
@@ -122,6 +131,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
122
131
|
character_spacing: 2.5
|
123
132
|
)
|
124
133
|
end
|
134
|
+
|
125
135
|
it 'handles links' do
|
126
136
|
string = "<link href='http://example.com'>external link</link>"
|
127
137
|
array = described_class.format(string)
|
@@ -137,6 +147,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
137
147
|
character_spacing: nil
|
138
148
|
)
|
139
149
|
end
|
150
|
+
|
140
151
|
it 'handles local links' do
|
141
152
|
string = "<link local='/home/example/foo.bar'>local link</link>"
|
142
153
|
array = described_class.format(string)
|
@@ -152,6 +163,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
152
163
|
character_spacing: nil
|
153
164
|
)
|
154
165
|
end
|
166
|
+
|
155
167
|
it 'handles anchors' do
|
156
168
|
string = "<link anchor='ToC'>internal link</link>"
|
157
169
|
array = described_class.format(string)
|
@@ -167,6 +179,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
167
179
|
character_spacing: nil
|
168
180
|
)
|
169
181
|
end
|
182
|
+
|
170
183
|
it 'handles higher order characters properly' do
|
171
184
|
string = "<b>©\n©</b>"
|
172
185
|
array = described_class.format(string)
|
@@ -204,6 +217,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
204
217
|
character_spacing: nil
|
205
218
|
)
|
206
219
|
end
|
220
|
+
|
207
221
|
it 'converts < >, and & to <, >, and &, respectively' do
|
208
222
|
string = 'hello <b><, >, and &</b>'
|
209
223
|
array = described_class.format(string)
|
@@ -219,6 +233,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
219
233
|
character_spacing: nil
|
220
234
|
)
|
221
235
|
end
|
236
|
+
|
222
237
|
it 'handles double qoutes around tag attributes' do
|
223
238
|
string = 'some <font size="14">sized</font> text'
|
224
239
|
array = described_class.format(string)
|
@@ -234,6 +249,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
234
249
|
character_spacing: nil
|
235
250
|
)
|
236
251
|
end
|
252
|
+
|
237
253
|
it 'handles single qoutes around tag attributes' do
|
238
254
|
string = "some <font size='14'>sized</font> text"
|
239
255
|
array = described_class.format(string)
|
@@ -249,6 +265,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
249
265
|
character_spacing: nil
|
250
266
|
)
|
251
267
|
end
|
268
|
+
|
252
269
|
it 'constructs a formatted text array from a string' do
|
253
270
|
string = "hello <b>world\nhow <i>are</i></b> you?"
|
254
271
|
array = described_class.format(string)
|
@@ -299,7 +316,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
299
316
|
)
|
300
317
|
expect(array[4]).to eq(
|
301
318
|
text: 'are',
|
302
|
-
styles: [
|
319
|
+
styles: %i[bold italic],
|
303
320
|
color: nil,
|
304
321
|
link: nil,
|
305
322
|
anchor: nil,
|
@@ -320,6 +337,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
320
337
|
character_spacing: nil
|
321
338
|
)
|
322
339
|
end
|
340
|
+
|
323
341
|
it 'accepts <strong> as an alternative to <b>' do
|
324
342
|
string = '<strong>bold</strong> not bold'
|
325
343
|
array = described_class.format(string)
|
@@ -347,6 +365,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
347
365
|
character_spacing: nil
|
348
366
|
)
|
349
367
|
end
|
368
|
+
|
350
369
|
it 'accepts <em> as an alternative to <i>' do
|
351
370
|
string = '<em>italic</em> not italic'
|
352
371
|
array = described_class.format(string)
|
@@ -374,6 +393,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
374
393
|
character_spacing: nil
|
375
394
|
)
|
376
395
|
end
|
396
|
+
|
377
397
|
it 'accepts <a> as an alternative to <link>' do
|
378
398
|
string = "<a href='http://example.com'>link</a> not a link"
|
379
399
|
array = described_class.format(string)
|
@@ -424,6 +444,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
424
444
|
}]
|
425
445
|
expect(described_class.to_string(array)).to eq(string)
|
426
446
|
end
|
447
|
+
|
427
448
|
it 'handles sub' do
|
428
449
|
string = '<sub>subscript</sub>'
|
429
450
|
array = [{
|
@@ -439,6 +460,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
439
460
|
}]
|
440
461
|
expect(described_class.to_string(array)).to eq(string)
|
441
462
|
end
|
463
|
+
|
442
464
|
it 'handles rgb' do
|
443
465
|
string = "<color rgb='ff0000'>red text</color>"
|
444
466
|
array = [{
|
@@ -454,6 +476,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
454
476
|
}]
|
455
477
|
expect(described_class.to_string(array)).to eq(string)
|
456
478
|
end
|
479
|
+
|
457
480
|
it 'handles cmyk' do
|
458
481
|
string = "<color c='0' m='100' y='0' k='0'>magenta text</color>"
|
459
482
|
array = [{
|
@@ -469,6 +492,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
469
492
|
}]
|
470
493
|
expect(described_class.to_string(array)).to eq(string)
|
471
494
|
end
|
495
|
+
|
472
496
|
it 'handles fonts' do
|
473
497
|
string = "<font name='Courier'>Courier text</font>"
|
474
498
|
array = [{
|
@@ -484,6 +508,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
484
508
|
}]
|
485
509
|
expect(described_class.to_string(array)).to eq(string)
|
486
510
|
end
|
511
|
+
|
487
512
|
it 'handles size' do
|
488
513
|
string = "<font size='14'>14 point text</font>"
|
489
514
|
array = [{
|
@@ -499,6 +524,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
499
524
|
}]
|
500
525
|
expect(described_class.to_string(array)).to eq(string)
|
501
526
|
end
|
527
|
+
|
502
528
|
it 'handles character spacing' do
|
503
529
|
string =
|
504
530
|
"<font character_spacing='2.5'>2.5 extra character spacing</font>"
|
@@ -515,6 +541,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
515
541
|
}]
|
516
542
|
expect(described_class.to_string(array)).to eq(string)
|
517
543
|
end
|
544
|
+
|
518
545
|
it 'handles links' do
|
519
546
|
array = [{
|
520
547
|
text: 'external link',
|
@@ -530,6 +557,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
530
557
|
string = "<link href='http://example.com'>external link</link>"
|
531
558
|
expect(described_class.to_string(array)).to eq(string)
|
532
559
|
end
|
560
|
+
|
533
561
|
it 'handles anchors' do
|
534
562
|
array = [{
|
535
563
|
text: 'internal link',
|
@@ -544,6 +572,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
544
572
|
string = "<link anchor='ToC'>internal link</link>"
|
545
573
|
expect(described_class.to_string(array)).to eq(string)
|
546
574
|
end
|
575
|
+
|
547
576
|
it 'converts <, >, and & to < >, and &, respectively' do
|
548
577
|
array = [
|
549
578
|
{
|
@@ -568,6 +597,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
568
597
|
string = 'hello <b><, >, and &</b>'
|
569
598
|
expect(described_class.to_string(array)).to eq(string)
|
570
599
|
end
|
600
|
+
|
571
601
|
it 'constructs an HTML-esque string from a formatted text array' do
|
572
602
|
array = [
|
573
603
|
{
|
@@ -608,7 +638,7 @@ describe Prawn::Text::Formatted::Parser do
|
|
608
638
|
},
|
609
639
|
{
|
610
640
|
text: 'are',
|
611
|
-
styles: [
|
641
|
+
styles: %i[bold italic],
|
612
642
|
color: nil,
|
613
643
|
link: nil,
|
614
644
|
font: nil,
|