prawn 0.13.0 → 2.4.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/.yardopts +10 -0
- data/GPLv2 +20 -21
- data/Gemfile +3 -16
- data/Rakefile +17 -39
- data/lib/prawn/document/bounding_box.rb +85 -42
- data/lib/prawn/document/column_box.rb +21 -11
- data/lib/prawn/document/internals.rb +40 -147
- data/lib/prawn/document/span.rb +25 -17
- data/lib/prawn/document.rb +286 -245
- data/lib/prawn/encoding.rb +68 -101
- data/lib/prawn/errors.rb +47 -43
- data/lib/prawn/font.rb +204 -155
- data/lib/prawn/font_metric_cache.rb +25 -21
- data/lib/prawn/fonts/afm.rb +292 -0
- data/lib/prawn/{font → fonts}/dfont.rb +7 -13
- data/lib/prawn/fonts/otf.rb +11 -0
- data/lib/prawn/fonts/ttc.rb +36 -0
- data/lib/prawn/{font → fonts}/ttf.rb +142 -80
- data/lib/prawn/graphics/blend_mode.rb +65 -0
- data/lib/prawn/graphics/cap_style.rb +6 -5
- data/lib/prawn/graphics/color.rb +47 -44
- data/lib/prawn/graphics/dash.rb +30 -13
- data/lib/prawn/graphics/join_style.rb +13 -6
- data/lib/prawn/graphics/patterns.rb +221 -90
- data/lib/prawn/graphics/transformation.rb +21 -12
- data/lib/prawn/graphics/transparency.rb +21 -17
- data/lib/prawn/graphics.rb +155 -128
- data/lib/prawn/{layout/grid.rb → grid.rb} +110 -47
- data/lib/prawn/image_handler.rb +16 -2
- data/lib/prawn/images/image.rb +4 -2
- data/lib/prawn/images/jpg.rb +39 -30
- data/lib/prawn/images/png.rb +132 -169
- data/lib/prawn/images.rb +70 -62
- data/lib/prawn/measurement_extensions.rb +15 -10
- data/lib/prawn/measurements.rb +22 -23
- data/lib/prawn/outline.rb +301 -13
- data/lib/prawn/repeater.rb +19 -17
- data/lib/prawn/security/arcfour.rb +54 -0
- data/lib/prawn/security.rb +108 -86
- data/lib/prawn/soft_mask.rb +40 -41
- data/lib/prawn/stamp.rb +29 -12
- data/lib/prawn/text/box.rb +27 -29
- data/lib/prawn/text/formatted/arranger.rb +110 -67
- data/lib/prawn/text/formatted/box.rb +233 -165
- data/lib/prawn/text/formatted/fragment.rb +27 -27
- data/lib/prawn/text/formatted/line_wrap.rb +137 -97
- data/lib/prawn/text/formatted/parser.rb +149 -127
- data/lib/prawn/text/formatted/wrap.rb +57 -37
- data/lib/prawn/text/formatted.rb +6 -4
- data/lib/prawn/text.rb +105 -73
- data/lib/prawn/transformation_stack.rb +44 -0
- data/lib/prawn/utilities.rb +11 -21
- data/lib/prawn/version.rb +5 -0
- data/lib/prawn/view.rb +101 -0
- data/lib/prawn.rb +42 -68
- data/{data/images/fractal.jpg → manual/absolute_position.pdf} +0 -0
- data/manual/basic_concepts/adding_pages.rb +9 -10
- data/manual/basic_concepts/basic_concepts.rb +33 -24
- data/manual/basic_concepts/creation.rb +10 -11
- data/manual/basic_concepts/cursor.rb +9 -10
- data/manual/basic_concepts/measurement.rb +10 -11
- data/manual/basic_concepts/origin.rb +8 -9
- data/manual/basic_concepts/other_cursor_helpers.rb +17 -18
- data/manual/basic_concepts/view.rb +48 -0
- data/manual/bounding_box/bounding_box.rb +31 -29
- data/manual/bounding_box/bounds.rb +17 -18
- data/manual/bounding_box/canvas.rb +8 -9
- data/manual/bounding_box/creation.rb +8 -9
- data/manual/bounding_box/indentation.rb +22 -23
- data/manual/bounding_box/nesting.rb +32 -25
- data/manual/bounding_box/russian_boxes.rb +19 -19
- data/manual/bounding_box/stretchy.rb +18 -20
- data/manual/contents.rb +35 -0
- data/manual/cover.rb +43 -0
- data/manual/document_and_page_options/background.rb +16 -14
- data/manual/document_and_page_options/document_and_page_options.rb +26 -23
- data/manual/document_and_page_options/metadata.rb +21 -19
- data/manual/document_and_page_options/page_margins.rb +20 -22
- data/manual/document_and_page_options/page_size.rb +15 -15
- data/manual/document_and_page_options/print_scaling.rb +23 -0
- data/manual/example_helper.rb +5 -408
- data/manual/graphics/blend_mode.rb +52 -0
- data/manual/graphics/circle_and_ellipse.rb +8 -9
- data/manual/graphics/color.rb +11 -13
- data/manual/graphics/common_lines.rb +13 -12
- data/manual/graphics/fill_and_stroke.rb +10 -11
- data/manual/graphics/fill_rules.rb +13 -12
- data/manual/graphics/gradients.rb +28 -22
- data/manual/graphics/graphics.rb +52 -46
- data/manual/graphics/helper.rb +20 -10
- data/manual/graphics/line_width.rb +13 -12
- data/manual/graphics/lines_and_curves.rb +13 -14
- data/manual/graphics/polygon.rb +10 -12
- data/manual/graphics/rectangle.rb +7 -8
- data/manual/graphics/rotate.rb +9 -12
- data/manual/graphics/scale.rb +19 -18
- data/manual/graphics/soft_masks.rb +5 -7
- data/manual/graphics/stroke_cap.rb +10 -11
- data/manual/graphics/stroke_dash.rb +16 -17
- data/manual/graphics/stroke_join.rb +10 -11
- data/manual/graphics/translate.rb +13 -13
- data/manual/graphics/transparency.rb +11 -13
- data/manual/{manual/how_to_read_this_manual.rb → how_to_read_this_manual.rb} +23 -25
- data/manual/images/absolute_position.rb +9 -10
- data/manual/images/fit.rb +9 -10
- data/manual/images/horizontal.rb +13 -14
- data/manual/images/images.rb +31 -30
- data/manual/images/plain_image.rb +6 -7
- data/manual/images/scale.rb +12 -13
- data/manual/images/vertical.rb +19 -17
- data/manual/images/width_and_height.rb +13 -14
- data/manual/layout/boxes.rb +14 -15
- data/manual/layout/content.rb +12 -13
- data/manual/layout/layout.rb +19 -20
- data/manual/layout/simple_grid.rb +8 -9
- data/manual/outline/add_subsection_to.rb +26 -27
- data/manual/outline/insert_section_after.rb +19 -20
- data/manual/outline/outline.rb +23 -22
- data/manual/outline/sections_and_pages.rb +24 -25
- data/manual/repeatable_content/alternate_page_numbering.rb +36 -0
- data/manual/repeatable_content/page_numbering.rb +20 -19
- data/manual/repeatable_content/repeatable_content.rb +26 -22
- data/manual/repeatable_content/repeater.rb +18 -19
- data/manual/repeatable_content/stamp.rb +18 -19
- data/manual/security/encryption.rb +8 -11
- data/manual/security/permissions.rb +20 -15
- data/manual/security/security.rb +20 -20
- data/manual/table.rb +16 -0
- data/manual/text/alignment.rb +17 -18
- data/manual/text/color.rb +13 -13
- data/manual/text/column_box.rb +10 -12
- data/manual/text/fallback_fonts.rb +29 -25
- data/manual/text/font.rb +17 -18
- data/manual/text/font_size.rb +21 -22
- data/manual/text/font_style.rb +12 -10
- data/manual/text/formatted_callbacks.rb +36 -26
- data/manual/text/formatted_text.rb +41 -34
- data/manual/text/free_flowing_text.rb +28 -29
- data/manual/text/inline.rb +23 -26
- data/manual/text/kerning_and_character_spacing.rb +20 -21
- data/manual/text/leading.rb +10 -11
- data/manual/text/line_wrapping.rb +40 -21
- data/manual/text/paragraph_indentation.rb +17 -12
- data/manual/text/positioned_text.rb +19 -20
- data/manual/text/registering_families.rb +33 -30
- data/manual/text/rendering_and_color.rb +11 -12
- data/manual/text/right_to_left_text.rb +31 -20
- data/manual/text/rotation.rb +36 -27
- data/manual/text/single_usage.rb +13 -14
- data/manual/text/text.rb +62 -62
- data/manual/text/text_box_excess.rb +22 -19
- data/manual/text/text_box_extensions.rb +21 -18
- data/manual/text/text_box_overflow.rb +28 -21
- data/manual/text/utf8.rb +16 -17
- data/manual/text/win_ansi_charset.rb +29 -26
- data/prawn.gemspec +45 -43
- data/spec/extensions/encoding_helpers.rb +4 -3
- data/spec/prawn/document/bounding_box_spec.rb +550 -0
- data/spec/prawn/document/column_box_spec.rb +75 -0
- data/spec/prawn/document/security_spec.rb +176 -0
- data/spec/prawn/document_annotations_spec.rb +76 -0
- data/spec/prawn/document_destinations_spec.rb +15 -0
- data/spec/prawn/document_grid_spec.rb +99 -0
- data/spec/prawn/document_reference_spec.rb +27 -0
- data/spec/prawn/document_span_spec.rb +44 -0
- data/spec/prawn/document_spec.rb +805 -0
- data/spec/prawn/font_metric_cache_spec.rb +54 -0
- data/spec/prawn/font_spec.rb +544 -0
- data/spec/prawn/graphics/blend_mode_spec.rb +63 -0
- data/spec/prawn/graphics/transparency_spec.rb +81 -0
- data/spec/prawn/graphics_spec.rb +872 -0
- data/spec/prawn/graphics_stroke_styles_spec.rb +229 -0
- data/spec/prawn/image_handler_spec.rb +53 -0
- data/spec/prawn/images/jpg_spec.rb +20 -0
- data/spec/prawn/images/png_spec.rb +283 -0
- data/spec/prawn/images_spec.rb +229 -0
- data/spec/prawn/measurements_extensions_spec.rb +24 -0
- data/spec/prawn/outline_spec.rb +512 -0
- data/spec/prawn/repeater_spec.rb +166 -0
- data/spec/prawn/soft_mask_spec.rb +74 -0
- data/spec/prawn/stamp_spec.rb +173 -0
- data/spec/prawn/text/box_spec.rb +1110 -0
- data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
- data/spec/prawn/text/formatted/box_spec.rb +849 -0
- data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
- data/spec/prawn/text/formatted/line_wrap_spec.rb +495 -0
- data/spec/prawn/text/formatted/parser_spec.rb +697 -0
- data/spec/prawn/text_draw_text_spec.rb +150 -0
- data/spec/prawn/text_rendering_mode_spec.rb +48 -0
- data/spec/prawn/text_spacing_spec.rb +95 -0
- data/spec/prawn/text_spec.rb +603 -0
- data/spec/prawn/text_with_inline_formatting_spec.rb +35 -0
- data/spec/prawn/transformation_stack_spec.rb +66 -0
- data/spec/prawn/view_spec.rb +63 -0
- data/spec/prawn_manual_spec.rb +35 -0
- data/spec/spec_helper.rb +22 -21
- data.tar.gz.sig +0 -0
- metadata +168 -307
- metadata.gz.sig +0 -0
- data/README.md +0 -109
- data/data/encodings/win_ansi.txt +0 -29
- data/data/images/16bit.alpha +0 -0
- data/data/images/16bit.dat +0 -0
- data/data/images/16bit.png +0 -0
- data/data/images/arrow.png +0 -0
- data/data/images/arrow2.png +0 -0
- data/data/images/barcode_issue.png +0 -0
- data/data/images/dice.alpha +0 -0
- data/data/images/dice.dat +0 -0
- data/data/images/dice.png +0 -0
- data/data/images/dice_interlaced.png +0 -0
- data/data/images/indexed_color.dat +0 -0
- data/data/images/indexed_color.png +0 -0
- data/data/images/letterhead.jpg +0 -0
- data/data/images/page_white_text.alpha +0 -0
- data/data/images/page_white_text.dat +0 -0
- data/data/images/page_white_text.png +0 -0
- data/data/images/pigs.jpg +0 -0
- data/data/images/prawn.png +0 -0
- data/data/images/ruport.png +0 -0
- data/data/images/ruport_data.dat +0 -0
- data/data/images/ruport_transparent.png +0 -0
- data/data/images/ruport_type0.png +0 -0
- data/data/images/stef.jpg +0 -0
- data/data/images/tru256.bmp +0 -0
- data/data/images/web-links.dat +0 -1
- data/data/images/web-links.png +0 -0
- data/data/pdfs/complex_template.pdf +0 -0
- data/data/pdfs/contains_ttf_font.pdf +0 -0
- data/data/pdfs/encrypted.pdf +0 -0
- data/data/pdfs/form.pdf +1 -819
- data/data/pdfs/hexagon.pdf +0 -61
- data/data/pdfs/indirect_reference.pdf +0 -86
- data/data/pdfs/multipage_template.pdf +0 -127
- data/data/pdfs/nested_pages.pdf +0 -118
- data/data/pdfs/page_without_mediabox.pdf +0 -193
- data/data/pdfs/resources_as_indirect_object.pdf +0 -83
- data/data/pdfs/two_hexagons.pdf +0 -90
- data/data/pdfs/version_1_6.pdf +0 -61
- data/data/shift_jis_text.txt +0 -1
- data/lib/pdf/core/annotations.rb +0 -60
- data/lib/pdf/core/byte_string.rb +0 -9
- data/lib/pdf/core/destinations.rb +0 -90
- data/lib/pdf/core/document_state.rb +0 -78
- data/lib/pdf/core/filter_list.rb +0 -51
- data/lib/pdf/core/filters.rb +0 -36
- data/lib/pdf/core/graphics_state.rb +0 -68
- data/lib/pdf/core/literal_string.rb +0 -16
- data/lib/pdf/core/name_tree.rb +0 -177
- data/lib/pdf/core/object_store.rb +0 -320
- data/lib/pdf/core/outline.rb +0 -315
- data/lib/pdf/core/page.rb +0 -212
- data/lib/pdf/core/page_geometry.rb +0 -126
- data/lib/pdf/core/pdf_object.rb +0 -124
- data/lib/pdf/core/reference.rb +0 -103
- data/lib/pdf/core/stream.rb +0 -98
- data/lib/pdf/core/text.rb +0 -275
- data/lib/pdf/core.rb +0 -35
- data/lib/prawn/compatibility.rb +0 -91
- data/lib/prawn/document/graphics_state.rb +0 -73
- data/lib/prawn/document/snapshot.rb +0 -89
- data/lib/prawn/font/afm.rb +0 -203
- data/lib/prawn/layout.rb +0 -20
- data/lib/prawn/table/cell/image.rb +0 -70
- data/lib/prawn/table/cell/in_table.rb +0 -27
- data/lib/prawn/table/cell/span_dummy.rb +0 -92
- data/lib/prawn/table/cell/subtable.rb +0 -65
- data/lib/prawn/table/cell/text.rb +0 -153
- data/lib/prawn/table/cell.rb +0 -770
- data/lib/prawn/table/cells.rb +0 -295
- data/lib/prawn/table.rb +0 -643
- data/manual/example_file.rb +0 -116
- data/manual/example_package.rb +0 -53
- data/manual/example_section.rb +0 -46
- data/manual/manual/cover.rb +0 -35
- data/manual/manual/foreword.rb +0 -85
- data/manual/manual/manual.rb +0 -35
- data/manual/syntax_highlight.rb +0 -52
- data/manual/table/basic_block.rb +0 -53
- data/manual/table/before_rendering_page.rb +0 -26
- data/manual/table/cell_border_lines.rb +0 -24
- data/manual/table/cell_borders_and_bg.rb +0 -31
- data/manual/table/cell_dimensions.rb +0 -30
- data/manual/table/cell_text.rb +0 -38
- data/manual/table/column_widths.rb +0 -30
- data/manual/table/content_and_subtables.rb +0 -39
- data/manual/table/creation.rb +0 -27
- data/manual/table/filtering.rb +0 -36
- data/manual/table/flow_and_header.rb +0 -17
- data/manual/table/image_cells.rb +0 -33
- data/manual/table/position.rb +0 -29
- data/manual/table/row_colors.rb +0 -20
- data/manual/table/span.rb +0 -30
- data/manual/table/style.rb +0 -22
- data/manual/table/table.rb +0 -52
- data/manual/table/width.rb +0 -27
- data/manual/templates/full_template.rb +0 -25
- data/manual/templates/page_template.rb +0 -48
- data/manual/templates/templates.rb +0 -27
- data/manual/text/group.rb +0 -29
- data/spec/acceptance/png.rb +0 -23
- data/spec/annotations_spec.rb +0 -74
- data/spec/bounding_box_spec.rb +0 -493
- data/spec/cell_spec.rb +0 -628
- data/spec/column_box_spec.rb +0 -33
- data/spec/destinations_spec.rb +0 -15
- data/spec/document_spec.rb +0 -761
- data/spec/extensions/mocha.rb +0 -44
- data/spec/filters_spec.rb +0 -34
- data/spec/font_metric_cache_spec.rb +0 -52
- data/spec/font_spec.rb +0 -464
- data/spec/formatted_text_arranger_spec.rb +0 -421
- data/spec/formatted_text_box_spec.rb +0 -650
- data/spec/formatted_text_fragment_spec.rb +0 -298
- data/spec/graphics_spec.rb +0 -651
- data/spec/grid_spec.rb +0 -85
- data/spec/image_handler_spec.rb +0 -42
- data/spec/images_spec.rb +0 -157
- data/spec/inline_formatted_text_parser_spec.rb +0 -564
- data/spec/jpg_spec.rb +0 -25
- data/spec/line_wrap_spec.rb +0 -333
- data/spec/measurement_units_spec.rb +0 -23
- data/spec/name_tree_spec.rb +0 -112
- data/spec/object_store_spec.rb +0 -170
- data/spec/outline_spec.rb +0 -448
- data/spec/pdf_object_spec.rb +0 -172
- data/spec/png_spec.rb +0 -240
- data/spec/reference_spec.rb +0 -82
- data/spec/repeater_spec.rb +0 -158
- data/spec/security_spec.rb +0 -158
- data/spec/snapshot_spec.rb +0 -186
- data/spec/soft_mask_spec.rb +0 -117
- data/spec/span_spec.rb +0 -44
- data/spec/stamp_spec.rb +0 -158
- data/spec/stream_spec.rb +0 -58
- data/spec/stroke_styles_spec.rb +0 -211
- data/spec/table/span_dummy_spec.rb +0 -17
- data/spec/table_spec.rb +0 -1355
- data/spec/template_spec.rb +0 -351
- data/spec/text_at_spec.rb +0 -130
- data/spec/text_box_spec.rb +0 -1030
- data/spec/text_rendering_mode_spec.rb +0 -45
- data/spec/text_spacing_spec.rb +0 -93
- data/spec/text_spec.rb +0 -425
- data/spec/text_with_inline_formatting_spec.rb +0 -35
- data/spec/transparency_spec.rb +0 -89
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            #  | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 3 | 
             
            # text/formatted/rectangle.rb : Implements text boxes with formatted text
         | 
| 4 4 | 
             
            #
         | 
| @@ -10,6 +10,7 @@ | |
| 10 10 | 
             
            module Prawn
         | 
| 11 11 | 
             
              module Text
         | 
| 12 12 | 
             
                module Formatted
         | 
| 13 | 
            +
                  # @group Stable API
         | 
| 13 14 |  | 
| 14 15 | 
             
                  # Draws the requested formatted text into a box. When the text overflows
         | 
| 15 16 | 
             
                  # the rectangle shrink to fit or truncate the text. Text boxes are
         | 
| @@ -53,8 +54,8 @@ module Prawn | |
| 53 54 | 
             
                  #     a file or application to be opened locally. A clickable link will be
         | 
| 54 55 | 
             
                  #     created to the provided local file or application. If the file is
         | 
| 55 56 | 
             
                  #     another PDF, it will be opened in a new window. Note that you must
         | 
| 56 | 
            -
                  #     explicitly underline and color using the appropriate tags if you | 
| 57 | 
            -
                  #     to draw attention to the link
         | 
| 57 | 
            +
                  #     explicitly underline and color using the appropriate tags if you
         | 
| 58 | 
            +
                  #     which to draw attention to the link
         | 
| 58 59 | 
             
                  # <tt>:draw_text_callback</tt>:
         | 
| 59 60 | 
             
                  #     if provided, this Proc will be called instead of #draw_text! once
         | 
| 60 61 | 
             
                  #     per fragment for every low-level addition of text to the page.
         | 
| @@ -82,13 +83,14 @@ module Prawn | |
| 82 83 | 
             
                  #
         | 
| 83 84 | 
             
                  # == Exceptions
         | 
| 84 85 | 
             
                  #
         | 
| 85 | 
            -
                  # Raises "Bad font family" if no font family is defined for the current | 
| 86 | 
            +
                  # Raises "Bad font family" if no font family is defined for the current
         | 
| 87 | 
            +
                  # font
         | 
| 86 88 | 
             
                  #
         | 
| 87 | 
            -
                  # Raises <tt>Prawn:: | 
| 89 | 
            +
                  # Raises <tt>Prawn::Errors::CannotFit</tt> if not wide enough to print
         | 
| 88 90 | 
             
                  # any text
         | 
| 89 91 | 
             
                  #
         | 
| 90 | 
            -
                  def formatted_text_box(array, options={})
         | 
| 91 | 
            -
                    Text::Formatted::Box.new(array, options.merge(: | 
| 92 | 
            +
                  def formatted_text_box(array, options = {})
         | 
| 93 | 
            +
                    Text::Formatted::Box.new(array, options.merge(document: self)).render
         | 
| 92 94 | 
             
                  end
         | 
| 93 95 |  | 
| 94 96 | 
             
                  # Generally, one would use the Prawn::Text::Formatted#formatted_text_box
         | 
| @@ -100,31 +102,19 @@ module Prawn | |
| 100 102 | 
             
                  class Box
         | 
| 101 103 | 
             
                    include Prawn::Text::Formatted::Wrap
         | 
| 102 104 |  | 
| 103 | 
            -
                     | 
| 104 | 
            -
                      PDF::Core::Text::VALID_OPTIONS + [:at, :height, :width,
         | 
| 105 | 
            -
                                                          :align, :valign,
         | 
| 106 | 
            -
                                                          :rotate, :rotate_around,
         | 
| 107 | 
            -
                                                          :overflow, :min_font_size,
         | 
| 108 | 
            -
                                                          :leading, :character_spacing,
         | 
| 109 | 
            -
                                                          :mode, :single_line,
         | 
| 110 | 
            -
                                                          :skip_encoding,
         | 
| 111 | 
            -
                                                          :document,
         | 
| 112 | 
            -
                                                          :direction,
         | 
| 113 | 
            -
                                                          :fallback_fonts,
         | 
| 114 | 
            -
                                                          :draw_text_callback]
         | 
| 115 | 
            -
                    end
         | 
| 105 | 
            +
                    # @group Experimental API
         | 
| 116 106 |  | 
| 117 107 | 
             
                    # The text that was successfully printed (or, if <tt>dry_run</tt> was
         | 
| 118 108 | 
             
                    # used, the text that would have been successfully printed)
         | 
| 119 109 | 
             
                    attr_reader :text
         | 
| 120 110 |  | 
| 121 | 
            -
                    # True  | 
| 111 | 
            +
                    # True if nothing printed (or, if <tt>dry_run</tt> was
         | 
| 122 112 | 
             
                    # used, nothing would have been successfully printed)
         | 
| 123 113 | 
             
                    def nothing_printed?
         | 
| 124 114 | 
             
                      @nothing_printed
         | 
| 125 115 | 
             
                    end
         | 
| 126 116 |  | 
| 127 | 
            -
                    # True  | 
| 117 | 
            +
                    # True if everything printed (or, if <tt>dry_run</tt> was
         | 
| 128 118 | 
             
                    # used, everything would have been successfully printed)
         | 
| 129 119 | 
             
                    def everything_printed?
         | 
| 130 120 | 
             
                      @everything_printed
         | 
| @@ -145,76 +135,41 @@ module Prawn | |
| 145 135 | 
             
                      line_height - (ascender + descender)
         | 
| 146 136 | 
             
                    end
         | 
| 147 137 |  | 
| 148 | 
            -
                    #
         | 
| 149 | 
            -
                    # Example (see Prawn::Text::Core::Formatted::Wrap for what is required
         | 
| 150 | 
            -
                    # of the wrap method if you want to override the default wrapping
         | 
| 151 | 
            -
                    # algorithm):
         | 
| 152 | 
            -
                    #
         | 
| 153 | 
            -
                    #
         | 
| 154 | 
            -
                    #   module MyWrap
         | 
| 155 | 
            -
                    #
         | 
| 156 | 
            -
                    #     def wrap(array)
         | 
| 157 | 
            -
                    #       initialize_wrap([{ :text => 'all your base are belong to us' }])
         | 
| 158 | 
            -
                    #       @line_wrap.wrap_line(:document => @document,
         | 
| 159 | 
            -
                    #                            :kerning => @kerning,
         | 
| 160 | 
            -
                    #                            :width => 10000,
         | 
| 161 | 
            -
                    #                            :arranger => @arranger)
         | 
| 162 | 
            -
                    #       fragment = @arranger.retrieve_fragment
         | 
| 163 | 
            -
                    #       format_and_draw_fragment(fragment, 0, @line_wrap.width, 0)
         | 
| 164 | 
            -
                    #       []
         | 
| 165 | 
            -
                    #     end
         | 
| 166 | 
            -
                    #
         | 
| 167 | 
            -
                    #   end
         | 
| 168 | 
            -
                    #
         | 
| 169 | 
            -
                    #   Prawn::Text::Formatted::Box.extensions << MyWrap
         | 
| 170 | 
            -
                    #
         | 
| 171 | 
            -
                    #   box = Prawn::Text::Formatted::Box.new('hello world')
         | 
| 172 | 
            -
                    #   box.render('why can't I print anything other than' +
         | 
| 173 | 
            -
                    #              '"all your base are belong to us"?')
         | 
| 174 | 
            -
                    #
         | 
| 175 | 
            -
                    #
         | 
| 176 | 
            -
                    def self.extensions
         | 
| 177 | 
            -
                      @extensions ||= []
         | 
| 178 | 
            -
                    end
         | 
| 179 | 
            -
             | 
| 180 | 
            -
                    def self.inherited(base) #:nodoc:
         | 
| 181 | 
            -
                      extensions.each { |e| base.extensions << e }
         | 
| 182 | 
            -
                    end
         | 
| 183 | 
            -
             | 
| 184 138 | 
             
                    # See Prawn::Text#text_box for valid options
         | 
| 185 139 | 
             
                    #
         | 
| 186 | 
            -
                    def initialize(formatted_text, options={})
         | 
| 187 | 
            -
                      @inked | 
| 140 | 
            +
                    def initialize(formatted_text, options = {})
         | 
| 141 | 
            +
                      @inked = false
         | 
| 188 142 | 
             
                      Prawn.verify_options(valid_options, options)
         | 
| 189 | 
            -
                      options | 
| 143 | 
            +
                      options = options.dup
         | 
| 190 144 |  | 
| 191 145 | 
             
                      self.class.extensions.reverse_each { |e| extend e }
         | 
| 192 146 |  | 
| 193 | 
            -
                      @overflow | 
| 147 | 
            +
                      @overflow = options[:overflow] || :truncate
         | 
| 148 | 
            +
                      @disable_wrap_by_char = options[:disable_wrap_by_char]
         | 
| 194 149 |  | 
| 195 150 | 
             
                      self.original_text = formatted_text
         | 
| 196 | 
            -
                      @text | 
| 197 | 
            -
             | 
| 198 | 
            -
                      @document | 
| 199 | 
            -
                      @direction | 
| 200 | 
            -
                      @fallback_fonts | 
| 201 | 
            -
             | 
| 202 | 
            -
                      @at | 
| 203 | 
            -
             | 
| 204 | 
            -
                       | 
| 205 | 
            -
             | 
| 206 | 
            -
             | 
| 207 | 
            -
                      @ | 
| 208 | 
            -
             | 
| 209 | 
            -
             | 
| 210 | 
            -
                      @ | 
| 151 | 
            +
                      @text = nil
         | 
| 152 | 
            +
             | 
| 153 | 
            +
                      @document = options[:document]
         | 
| 154 | 
            +
                      @direction = options[:direction] || @document.text_direction
         | 
| 155 | 
            +
                      @fallback_fonts = options[:fallback_fonts] ||
         | 
| 156 | 
            +
                        @document.fallback_fonts
         | 
| 157 | 
            +
                      @at = (
         | 
| 158 | 
            +
                        options[:at] || [@document.bounds.left, @document.bounds.top]
         | 
| 159 | 
            +
                      ).dup
         | 
| 160 | 
            +
                      @width = options[:width] ||
         | 
| 161 | 
            +
                        @document.bounds.right - @at[0]
         | 
| 162 | 
            +
                      @height = options[:height] || default_height
         | 
| 163 | 
            +
                      @align = options[:align] ||
         | 
| 164 | 
            +
                        (@direction == :rtl ? :right : :left)
         | 
| 165 | 
            +
                      @vertical_align = options[:valign] || :top
         | 
| 166 | 
            +
                      @leading = options[:leading] || @document.default_leading
         | 
| 211 167 | 
             
                      @character_spacing = options[:character_spacing] ||
         | 
| 212 | 
            -
             | 
| 213 | 
            -
                      @mode | 
| 214 | 
            -
                      @rotate | 
| 215 | 
            -
                      @rotate_around | 
| 216 | 
            -
                      @single_line | 
| 217 | 
            -
                      @skip_encoding     = options[:skip_encoding] || @document.skip_encoding
         | 
| 168 | 
            +
                        @document.character_spacing
         | 
| 169 | 
            +
                      @mode = options[:mode] || @document.text_rendering_mode
         | 
| 170 | 
            +
                      @rotate = options[:rotate] || 0
         | 
| 171 | 
            +
                      @rotate_around = options[:rotate_around] || :upper_left
         | 
| 172 | 
            +
                      @single_line = options[:single_line]
         | 
| 218 173 | 
             
                      @draw_text_callback = options[:draw_text_callback]
         | 
| 219 174 |  | 
| 220 175 | 
             
                      # if the text rendering mode is :unknown, force it back to :fill
         | 
| @@ -230,27 +185,30 @@ module Prawn | |
| 230 185 | 
             
                        @overflow = :truncate
         | 
| 231 186 | 
             
                      end
         | 
| 232 187 | 
             
                      @min_font_size = options[:min_font_size] || 5
         | 
| 233 | 
            -
                      if options[:kerning].nil? | 
| 188 | 
            +
                      if options[:kerning].nil?
         | 
| 234 189 | 
             
                        options[:kerning] = @document.default_kerning?
         | 
| 235 190 | 
             
                      end
         | 
| 236 | 
            -
                      @options = { | 
| 237 | 
            -
                        : | 
| 238 | 
            -
                        : | 
| 191 | 
            +
                      @options = {
         | 
| 192 | 
            +
                        kerning: options[:kerning],
         | 
| 193 | 
            +
                        size: options[:size],
         | 
| 194 | 
            +
                        style: options[:style]
         | 
| 195 | 
            +
                      }
         | 
| 239 196 |  | 
| 240 197 | 
             
                      super(formatted_text, options)
         | 
| 241 198 | 
             
                    end
         | 
| 242 199 |  | 
| 243 | 
            -
                    # Render text to the document based on the settings defined in | 
| 200 | 
            +
                    # Render text to the document based on the settings defined in
         | 
| 201 | 
            +
                    # initialize.
         | 
| 244 202 | 
             
                    #
         | 
| 245 | 
            -
                    # In order to facilitate look-ahead calculations, <tt>render</tt> | 
| 246 | 
            -
                    # a <tt>:dry_run => true</tt> option. If provided, then | 
| 247 | 
            -
                    # executed as if rendering, with the exception that | 
| 248 | 
            -
                    # the page. Useful for look-ahead computations of | 
| 249 | 
            -
                    # etc.
         | 
| 203 | 
            +
                    # In order to facilitate look-ahead calculations, <tt>render</tt>
         | 
| 204 | 
            +
                    # accepts a <tt>:dry_run => true</tt> option. If provided, then
         | 
| 205 | 
            +
                    # everything is executed as if rendering, with the exception that
         | 
| 206 | 
            +
                    # nothing is drawn on the page. Useful for look-ahead computations of
         | 
| 207 | 
            +
                    # height, unprinted text, etc.
         | 
| 250 208 | 
             
                    #
         | 
| 251 | 
            -
                    # Returns any text that did not print under the current settings
         | 
| 209 | 
            +
                    # Returns any text that did not print under the current settings.
         | 
| 252 210 | 
             
                    #
         | 
| 253 | 
            -
                    def render(flags={})
         | 
| 211 | 
            +
                    def render(flags = {})
         | 
| 254 212 | 
             
                      unprinted_text = []
         | 
| 255 213 |  | 
| 256 214 | 
             
                      @document.save_font do
         | 
| @@ -258,28 +216,27 @@ module Prawn | |
| 258 216 | 
             
                          @document.text_rendering_mode(@mode) do
         | 
| 259 217 | 
             
                            process_options
         | 
| 260 218 |  | 
| 261 | 
            -
                             | 
| 262 | 
            -
                              text = original_text
         | 
| 263 | 
            -
                            else
         | 
| 264 | 
            -
                              text = normalize_encoding
         | 
| 265 | 
            -
                            end
         | 
| 219 | 
            +
                            text = normalized_text(flags)
         | 
| 266 220 |  | 
| 267 221 | 
             
                            @document.font_size(@font_size) do
         | 
| 268 222 | 
             
                              shrink_to_fit(text) if @overflow == :shrink_to_fit
         | 
| 269 223 | 
             
                              process_vertical_alignment(text)
         | 
| 270 224 | 
             
                              @inked = true unless flags[:dry_run]
         | 
| 271 | 
            -
                               | 
| 272 | 
            -
                                 | 
| 273 | 
            -
             | 
| 274 | 
            -
                                 | 
| 275 | 
            -
             | 
| 225 | 
            +
                              unprinted_text =
         | 
| 226 | 
            +
                                if @rotate != 0 && @inked
         | 
| 227 | 
            +
                                  render_rotated(text)
         | 
| 228 | 
            +
                                else
         | 
| 229 | 
            +
                                  wrap(text)
         | 
| 230 | 
            +
                                end
         | 
| 276 231 | 
             
                              @inked = false
         | 
| 277 232 | 
             
                            end
         | 
| 278 233 | 
             
                          end
         | 
| 279 234 | 
             
                        end
         | 
| 280 235 | 
             
                      end
         | 
| 281 236 |  | 
| 282 | 
            -
                      unprinted_text
         | 
| 237 | 
            +
                      unprinted_text.map do |e|
         | 
| 238 | 
            +
                        e.merge(text: @document.font.to_utf8(e[:text]))
         | 
| 239 | 
            +
                      end
         | 
| 283 240 | 
             
                    end
         | 
| 284 241 |  | 
| 285 242 | 
             
                    # The width available at this point in the box
         | 
| @@ -292,13 +249,16 @@ module Prawn | |
| 292 249 | 
             
                    #
         | 
| 293 250 | 
             
                    def height
         | 
| 294 251 | 
             
                      return 0 if @baseline_y.nil? || @descender.nil?
         | 
| 252 | 
            +
             | 
| 295 253 | 
             
                      (@baseline_y - @descender).abs
         | 
| 296 254 | 
             
                    end
         | 
| 297 255 |  | 
| 298 256 | 
             
                    # <tt>fragment</tt> is a Prawn::Text::Formatted::Fragment object
         | 
| 299 257 | 
             
                    #
         | 
| 300 | 
            -
                    def draw_fragment( | 
| 301 | 
            -
                       | 
| 258 | 
            +
                    def draw_fragment(
         | 
| 259 | 
            +
                      fragment, accumulated_width = 0, line_width = 0, word_spacing = 0
         | 
| 260 | 
            +
                    ) #:nodoc:
         | 
| 261 | 
            +
                      case @align
         | 
| 302 262 | 
             
                      when :left
         | 
| 303 263 | 
             
                        x = @at[0]
         | 
| 304 264 | 
             
                      when :center
         | 
| @@ -306,11 +266,15 @@ module Prawn | |
| 306 266 | 
             
                      when :right
         | 
| 307 267 | 
             
                        x = @at[0] + @width - line_width
         | 
| 308 268 | 
             
                      when :justify
         | 
| 309 | 
            -
                         | 
| 310 | 
            -
                           | 
| 311 | 
            -
             | 
| 312 | 
            -
                           | 
| 313 | 
            -
             | 
| 269 | 
            +
                        x =
         | 
| 270 | 
            +
                          if @direction == :ltr
         | 
| 271 | 
            +
                            @at[0]
         | 
| 272 | 
            +
                          else
         | 
| 273 | 
            +
                            @at[0] + @width - line_width
         | 
| 274 | 
            +
                          end
         | 
| 275 | 
            +
                      else
         | 
| 276 | 
            +
                        raise ArgumentError,
         | 
| 277 | 
            +
                          'align must be one of :left, :right, :center or :justify symbols'
         | 
| 314 278 | 
             
                      end
         | 
| 315 279 |  | 
| 316 280 | 
             
                      x += accumulated_width
         | 
| @@ -325,24 +289,94 @@ module Prawn | |
| 325 289 | 
             
                      if @inked
         | 
| 326 290 | 
             
                        draw_fragment_underlays(fragment)
         | 
| 327 291 |  | 
| 328 | 
            -
                        @document.word_spacing(word_spacing)  | 
| 292 | 
            +
                        @document.word_spacing(word_spacing) do
         | 
| 329 293 | 
             
                          if @draw_text_callback
         | 
| 330 | 
            -
                            @draw_text_callback.call( | 
| 331 | 
            -
             | 
| 294 | 
            +
                            @draw_text_callback.call(
         | 
| 295 | 
            +
                              fragment.text,
         | 
| 296 | 
            +
                              at: [x, y],
         | 
| 297 | 
            +
                              kerning: @kerning
         | 
| 298 | 
            +
                            )
         | 
| 332 299 | 
             
                          else
         | 
| 333 | 
            -
                            @document.draw_text!( | 
| 334 | 
            -
             | 
| 300 | 
            +
                            @document.draw_text!(
         | 
| 301 | 
            +
                              fragment.text,
         | 
| 302 | 
            +
                              at: [x, y],
         | 
| 303 | 
            +
                              kerning: @kerning
         | 
| 304 | 
            +
                            )
         | 
| 335 305 | 
             
                          end
         | 
| 336 | 
            -
                         | 
| 306 | 
            +
                        end
         | 
| 337 307 |  | 
| 338 308 | 
             
                        draw_fragment_overlays(fragment)
         | 
| 339 309 | 
             
                      end
         | 
| 340 310 | 
             
                    end
         | 
| 341 311 |  | 
| 312 | 
            +
                    # @group Extension API
         | 
| 313 | 
            +
             | 
| 314 | 
            +
                    # Example (see Prawn::Text::Core::Formatted::Wrap for what is required
         | 
| 315 | 
            +
                    # of the wrap method if you want to override the default wrapping
         | 
| 316 | 
            +
                    # algorithm):
         | 
| 317 | 
            +
                    #
         | 
| 318 | 
            +
                    #
         | 
| 319 | 
            +
                    #   module MyWrap
         | 
| 320 | 
            +
                    #
         | 
| 321 | 
            +
                    #     def wrap(array)
         | 
| 322 | 
            +
                    #       initialize_wrap([{ :text => 'all your base are belong to us' }])
         | 
| 323 | 
            +
                    #       @line_wrap.wrap_line(:document => @document,
         | 
| 324 | 
            +
                    #                            :kerning => @kerning,
         | 
| 325 | 
            +
                    #                            :width => 10000,
         | 
| 326 | 
            +
                    #                            :arranger => @arranger)
         | 
| 327 | 
            +
                    #       fragment = @arranger.retrieve_fragment
         | 
| 328 | 
            +
                    #       format_and_draw_fragment(fragment, 0, @line_wrap.width, 0)
         | 
| 329 | 
            +
                    #       []
         | 
| 330 | 
            +
                    #     end
         | 
| 331 | 
            +
                    #
         | 
| 332 | 
            +
                    #   end
         | 
| 333 | 
            +
                    #
         | 
| 334 | 
            +
                    #   Prawn::Text::Formatted::Box.extensions << MyWrap
         | 
| 335 | 
            +
                    #
         | 
| 336 | 
            +
                    #   box = Prawn::Text::Formatted::Box.new('hello world')
         | 
| 337 | 
            +
                    #   box.render('why can't I print anything other than' +
         | 
| 338 | 
            +
                    #              '"all your base are belong to us"?')
         | 
| 339 | 
            +
                    #
         | 
| 340 | 
            +
                    #
         | 
| 341 | 
            +
                    def self.extensions
         | 
| 342 | 
            +
                      @extensions ||= []
         | 
| 343 | 
            +
                    end
         | 
| 344 | 
            +
             | 
| 345 | 
            +
                    # @private
         | 
| 346 | 
            +
                    def self.inherited(base)
         | 
| 347 | 
            +
                      super
         | 
| 348 | 
            +
                      extensions.each { |e| base.extensions << e }
         | 
| 349 | 
            +
                    end
         | 
| 350 | 
            +
             | 
| 351 | 
            +
                    def valid_options
         | 
| 352 | 
            +
                      PDF::Core::Text::VALID_OPTIONS + %i[
         | 
| 353 | 
            +
                        at
         | 
| 354 | 
            +
                        height width
         | 
| 355 | 
            +
                        align valign
         | 
| 356 | 
            +
                        rotate rotate_around
         | 
| 357 | 
            +
                        overflow min_font_size
         | 
| 358 | 
            +
                        disable_wrap_by_char
         | 
| 359 | 
            +
                        leading character_spacing
         | 
| 360 | 
            +
                        mode single_line
         | 
| 361 | 
            +
                        document
         | 
| 362 | 
            +
                        direction
         | 
| 363 | 
            +
                        fallback_fonts
         | 
| 364 | 
            +
                        draw_text_callback
         | 
| 365 | 
            +
                      ]
         | 
| 366 | 
            +
                    end
         | 
| 367 | 
            +
             | 
| 342 368 | 
             
                    private
         | 
| 343 369 |  | 
| 370 | 
            +
                    def normalized_text(flags)
         | 
| 371 | 
            +
                      text = normalize_encoding
         | 
| 372 | 
            +
             | 
| 373 | 
            +
                      text.each { |t| t.delete(:color) } if flags[:dry_run]
         | 
| 374 | 
            +
             | 
| 375 | 
            +
                      text
         | 
| 376 | 
            +
                    end
         | 
| 377 | 
            +
             | 
| 344 378 | 
             
                    def original_text
         | 
| 345 | 
            -
                      @original_array. | 
| 379 | 
            +
                      @original_array.map(&:dup)
         | 
| 346 380 | 
             
                    end
         | 
| 347 381 |  | 
| 348 382 | 
             
                    def original_text=(formatted_text)
         | 
| @@ -385,33 +419,41 @@ module Prawn | |
| 385 419 |  | 
| 386 420 | 
             
                      original_font = @document.font.family
         | 
| 387 421 | 
             
                      fragment_font = hash[:font] || original_font
         | 
| 388 | 
            -
                      @document.font(fragment_font)
         | 
| 389 422 |  | 
| 390 423 | 
             
                      fallback_fonts = @fallback_fonts.dup
         | 
| 391 424 | 
             
                      # always default back to the current font if the glyph is missing from
         | 
| 392 425 | 
             
                      # all fonts
         | 
| 393 426 | 
             
                      fallback_fonts << fragment_font
         | 
| 394 427 |  | 
| 395 | 
            -
                       | 
| 396 | 
            -
                         | 
| 397 | 
            -
             | 
| 398 | 
            -
             | 
| 399 | 
            -
             | 
| 400 | 
            -
             | 
| 428 | 
            +
                      @document.save_font do
         | 
| 429 | 
            +
                        hash[:text].each_char do |char|
         | 
| 430 | 
            +
                          font_glyph_pairs << [
         | 
| 431 | 
            +
                            find_font_for_this_glyph(
         | 
| 432 | 
            +
                              char,
         | 
| 433 | 
            +
                              fragment_font,
         | 
| 434 | 
            +
                              fallback_fonts.dup
         | 
| 435 | 
            +
                            ),
         | 
| 436 | 
            +
                            char
         | 
| 437 | 
            +
                          ]
         | 
| 438 | 
            +
                        end
         | 
| 401 439 | 
             
                      end
         | 
| 402 440 |  | 
| 403 | 
            -
                       | 
| 441 | 
            +
                      # Don't add a :font to fragments if it wasn't there originally
         | 
| 442 | 
            +
                      if hash[:font].nil?
         | 
| 443 | 
            +
                        font_glyph_pairs.each do |pair|
         | 
| 444 | 
            +
                          pair[0] = nil if pair[0] == original_font
         | 
| 445 | 
            +
                        end
         | 
| 446 | 
            +
                      end
         | 
| 404 447 |  | 
| 405 448 | 
             
                      form_fragments_from_like_font_glyph_pairs(font_glyph_pairs, hash)
         | 
| 406 449 | 
             
                    end
         | 
| 407 450 |  | 
| 408 451 | 
             
                    def find_font_for_this_glyph(char, current_font, fallback_fonts)
         | 
| 409 | 
            -
                       | 
| 452 | 
            +
                      @document.font(current_font)
         | 
| 453 | 
            +
                      if fallback_fonts.empty? || @document.font.glyph_present?(char)
         | 
| 410 454 | 
             
                        current_font
         | 
| 411 455 | 
             
                      else
         | 
| 412 | 
            -
                         | 
| 413 | 
            -
                        @document.font(current_font)
         | 
| 414 | 
            -
                        find_font_for_this_glyph(char, @document.font.family, fallback_fonts)
         | 
| 456 | 
            +
                        find_font_for_this_glyph(char, fallback_fonts.shift, fallback_fonts)
         | 
| 415 457 | 
             
                      end
         | 
| 416 458 | 
             
                    end
         | 
| 417 459 |  | 
| @@ -421,11 +463,11 @@ module Prawn | |
| 421 463 | 
             
                      current_font = nil
         | 
| 422 464 |  | 
| 423 465 | 
             
                      font_glyph_pairs.each do |font, char|
         | 
| 424 | 
            -
                        if font != current_font
         | 
| 466 | 
            +
                        if font != current_font || fragments.count.zero?
         | 
| 425 467 | 
             
                          current_font = font
         | 
| 426 468 | 
             
                          fragment = hash.dup
         | 
| 427 469 | 
             
                          fragment[:text] = char
         | 
| 428 | 
            -
                          fragment[:font] = font
         | 
| 470 | 
            +
                          fragment[:font] = font unless font.nil?
         | 
| 429 471 | 
             
                          fragments << fragment
         | 
| 430 472 | 
             
                        else
         | 
| 431 473 | 
             
                          fragment[:text] += char
         | 
| @@ -436,8 +478,8 @@ module Prawn | |
| 436 478 | 
             
                    end
         | 
| 437 479 |  | 
| 438 480 | 
             
                    def move_baseline_down
         | 
| 439 | 
            -
                      if @baseline_y | 
| 440 | 
            -
                        @baseline_y | 
| 481 | 
            +
                      if @baseline_y.zero?
         | 
| 482 | 
            +
                        @baseline_y = -@ascender
         | 
| 441 483 | 
             
                      else
         | 
| 442 484 | 
             
                        @baseline_y -= (@line_height + @leading)
         | 
| 443 485 | 
             
                      end
         | 
| @@ -461,38 +503,55 @@ module Prawn | |
| 461 503 | 
             
                      # we need to wait until render() is called so that the fonts are set
         | 
| 462 504 | 
             
                      # up properly for wrapping. So guard with a boolean to ensure this is
         | 
| 463 505 | 
             
                      # only run once.
         | 
| 464 | 
            -
                       | 
| 506 | 
            +
                      if defined?(@vertical_alignment_processed) &&
         | 
| 507 | 
            +
                          @vertical_alignment_processed
         | 
| 508 | 
            +
                        return
         | 
| 509 | 
            +
                      end
         | 
| 510 | 
            +
             | 
| 465 511 | 
             
                      @vertical_alignment_processed = true
         | 
| 466 512 |  | 
| 467 513 | 
             
                      return if @vertical_align == :top
         | 
| 514 | 
            +
             | 
| 468 515 | 
             
                      wrap(text)
         | 
| 469 516 |  | 
| 470 517 | 
             
                      case @vertical_align
         | 
| 471 518 | 
             
                      when :center
         | 
| 472 | 
            -
                        @at[1]  | 
| 519 | 
            +
                        @at[1] -= (@height - height + @descender) * 0.5
         | 
| 473 520 | 
             
                      when :bottom
         | 
| 474 | 
            -
                        @at[1]  | 
| 521 | 
            +
                        @at[1] -= (@height - height)
         | 
| 475 522 | 
             
                      end
         | 
| 523 | 
            +
             | 
| 476 524 | 
             
                      @height = height
         | 
| 477 525 | 
             
                    end
         | 
| 478 526 |  | 
| 479 527 | 
             
                    # Decrease the font size until the text fits or the min font
         | 
| 480 528 | 
             
                    # size is reached
         | 
| 481 529 | 
             
                    def shrink_to_fit(text)
         | 
| 482 | 
            -
                       | 
| 483 | 
            -
             | 
| 530 | 
            +
                      loop do
         | 
| 531 | 
            +
                        if @disable_wrap_by_char && @font_size > @min_font_size
         | 
| 532 | 
            +
                          begin
         | 
| 533 | 
            +
                            wrap(text)
         | 
| 534 | 
            +
                          rescue Errors::CannotFit
         | 
| 535 | 
            +
                            # Ignore errors while we can still attempt smaller
         | 
| 536 | 
            +
                            # font sizes.
         | 
| 537 | 
            +
                          end
         | 
| 538 | 
            +
                        else
         | 
| 539 | 
            +
                          wrap(text)
         | 
| 540 | 
            +
                        end
         | 
| 541 | 
            +
             | 
| 542 | 
            +
                        break if @everything_printed || @font_size <= @min_font_size
         | 
| 543 | 
            +
             | 
| 484 544 | 
             
                        @font_size = [@font_size - 0.5, @min_font_size].max
         | 
| 485 545 | 
             
                        @document.font_size = @font_size
         | 
| 486 | 
            -
                        wrap(text)
         | 
| 487 546 | 
             
                      end
         | 
| 488 547 | 
             
                    end
         | 
| 489 548 |  | 
| 490 549 | 
             
                    def process_options
         | 
| 491 | 
            -
                      # must be performed within a save_font  | 
| 550 | 
            +
                      # must be performed within a save_font block because
         | 
| 492 551 | 
             
                      # document.process_text_options sets the font
         | 
| 493 552 | 
             
                      @document.process_text_options(@options)
         | 
| 494 553 | 
             
                      @font_size = @options[:size]
         | 
| 495 | 
            -
                      @kerning | 
| 554 | 
            +
                      @kerning = @options[:kerning]
         | 
| 496 555 | 
             
                    end
         | 
| 497 556 |  | 
| 498 557 | 
             
                    def render_rotated(text)
         | 
| @@ -516,7 +575,7 @@ module Prawn | |
| 516 575 | 
             
                        y = @at[1]
         | 
| 517 576 | 
             
                      end
         | 
| 518 577 |  | 
| 519 | 
            -
                      @document.rotate(@rotate, : | 
| 578 | 
            +
                      @document.rotate(@rotate, origin: [x, y]) do
         | 
| 520 579 | 
             
                        unprinted_text = wrap(text)
         | 
| 521 580 | 
             
                      end
         | 
| 522 581 | 
             
                      unprinted_text
         | 
| @@ -540,47 +599,56 @@ module Prawn | |
| 540 599 |  | 
| 541 600 | 
             
                    def draw_fragment_overlay_link(fragment)
         | 
| 542 601 | 
             
                      return unless fragment.link
         | 
| 602 | 
            +
             | 
| 543 603 | 
             
                      box = fragment.absolute_bounding_box
         | 
| 544 | 
            -
                      @document.link_annotation( | 
| 545 | 
            -
             | 
| 546 | 
            -
             | 
| 547 | 
            -
             | 
| 548 | 
            -
             | 
| 604 | 
            +
                      @document.link_annotation(
         | 
| 605 | 
            +
                        box,
         | 
| 606 | 
            +
                        Border: [0, 0, 0],
         | 
| 607 | 
            +
                        A: {
         | 
| 608 | 
            +
                          Type: :Action,
         | 
| 609 | 
            +
                          S: :URI,
         | 
| 610 | 
            +
                          URI: PDF::Core::LiteralString.new(fragment.link)
         | 
| 611 | 
            +
                        }
         | 
| 612 | 
            +
                      )
         | 
| 549 613 | 
             
                    end
         | 
| 550 614 |  | 
| 551 615 | 
             
                    def draw_fragment_overlay_anchor(fragment)
         | 
| 552 616 | 
             
                      return unless fragment.anchor
         | 
| 617 | 
            +
             | 
| 553 618 | 
             
                      box = fragment.absolute_bounding_box
         | 
| 554 | 
            -
                      @document.link_annotation( | 
| 555 | 
            -
             | 
| 556 | 
            -
             | 
| 619 | 
            +
                      @document.link_annotation(
         | 
| 620 | 
            +
                        box,
         | 
| 621 | 
            +
                        Border: [0, 0, 0],
         | 
| 622 | 
            +
                        Dest: fragment.anchor
         | 
| 623 | 
            +
                      )
         | 
| 557 624 | 
             
                    end
         | 
| 558 625 |  | 
| 559 626 | 
             
                    def draw_fragment_overlay_local(fragment)
         | 
| 560 627 | 
             
                      return unless fragment.local
         | 
| 628 | 
            +
             | 
| 561 629 | 
             
                      box = fragment.absolute_bounding_box
         | 
| 562 | 
            -
                      @document.link_annotation( | 
| 563 | 
            -
             | 
| 564 | 
            -
             | 
| 565 | 
            -
             | 
| 566 | 
            -
             | 
| 567 | 
            -
             | 
| 630 | 
            +
                      @document.link_annotation(
         | 
| 631 | 
            +
                        box,
         | 
| 632 | 
            +
                        Border: [0, 0, 0],
         | 
| 633 | 
            +
                        A: {
         | 
| 634 | 
            +
                          Type: :Action,
         | 
| 635 | 
            +
                          S: :Launch,
         | 
| 636 | 
            +
                          F: PDF::Core::LiteralString.new(fragment.local),
         | 
| 637 | 
            +
                          NewWindow: true
         | 
| 638 | 
            +
                        }
         | 
| 639 | 
            +
                      )
         | 
| 568 640 | 
             
                    end
         | 
| 569 641 |  | 
| 570 642 | 
             
                    def draw_fragment_overlay_styles(fragment)
         | 
| 571 | 
            -
                       | 
| 572 | 
            -
                      if underline
         | 
| 643 | 
            +
                      if fragment.styles.include?(:underline)
         | 
| 573 644 | 
             
                        @document.stroke_line(fragment.underline_points)
         | 
| 574 645 | 
             
                      end
         | 
| 575 646 |  | 
| 576 | 
            -
                       | 
| 577 | 
            -
                      if strikethrough
         | 
| 647 | 
            +
                      if fragment.styles.include?(:strikethrough)
         | 
| 578 648 | 
             
                        @document.stroke_line(fragment.strikethrough_points)
         | 
| 579 649 | 
             
                      end
         | 
| 580 650 | 
             
                    end
         | 
| 581 | 
            -
             | 
| 582 651 | 
             
                  end
         | 
| 583 | 
            -
             | 
| 584 652 | 
             
                end
         | 
| 585 653 | 
             
              end
         | 
| 586 654 | 
             
            end
         |