diff options
| author | Dan Allen <dan.j.allen@gmail.com> | 2022-05-15 14:29:26 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-15 14:29:26 -0600 |
| commit | 8294aa6a671893740bbe487760f4c9727bb0d2bf (patch) | |
| tree | 98b589866b75f2eb6445d1f281a324ce87b35065 /lib | |
| parent | 229e6428a7e244a368fe8b1ae8a946999f821695 (diff) | |
resolves #2173 apply top line height padding to first line of text when text runs to top of next page (PR #2170)
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/asciidoctor/pdf/converter.rb | 9 | ||||
| -rw-r--r-- | lib/asciidoctor/pdf/ext/prawn/extensions.rb | 23 |
2 files changed, 16 insertions, 16 deletions
diff --git a/lib/asciidoctor/pdf/converter.rb b/lib/asciidoctor/pdf/converter.rb index c0fa5d47..6b2709a0 100644 --- a/lib/asciidoctor/pdf/converter.rb +++ b/lib/asciidoctor/pdf/converter.rb @@ -3086,7 +3086,7 @@ module Asciidoctor end end - # private + # @private def ink_paragraph_in_float_box node, float_box, prose_opts, role_keys, block_next, insert_margin_bottom @float_box = para_font_descender = para_font_size = end_cursor = nil if role_keys @@ -3105,7 +3105,7 @@ module Asciidoctor start_page_number = float_box[:page] start_cursor = cursor block_bottom = (float_box_bottom = float_box[:bottom]) + float_box[:gap][1] - # use :at to incorporate padding top from line metrics + # use :at to incorporate padding top from line metrics since text_box method does not apply it # use :final_gap to incorporate padding bottom from line metrics # use :draw_text_callback to track end cursor (requires applying :final_gap to result manually) prose_opts.update \ @@ -4287,7 +4287,7 @@ module Asciidoctor opts = { leading: line_metrics.leading, final_gap: line_metrics.final_gap }.merge opts string = string.gsub CjkLineBreakRx, ZeroWidthSpace if @cjk_line_breaks return text_box string, opts if opts[:height] - move_down line_metrics.padding_top + opts[:initial_gap] = line_metrics.padding_top if (hanging_indent = (opts.delete :hanging_indent) || 0) > 0 indent hanging_indent do text string, (opts.merge indent_paragraphs: -hanging_indent) @@ -4303,8 +4303,7 @@ module Asciidoctor # QUESTION: combine with typeset_text? def typeset_formatted_text fragments, line_metrics, opts = {} - move_down line_metrics.padding_top - opts = { leading: line_metrics.leading, final_gap: line_metrics.final_gap }.merge opts + opts = { leading: line_metrics.leading, initial_gap: line_metrics.padding_top, final_gap: line_metrics.final_gap }.merge opts if (hanging_indent = (opts.delete :hanging_indent) || 0) > 0 indent hanging_indent do formatted_text fragments, (opts.merge indent_paragraphs: -hanging_indent) diff --git a/lib/asciidoctor/pdf/ext/prawn/extensions.rb b/lib/asciidoctor/pdf/ext/prawn/extensions.rb index c0ec7b67..07e8059d 100644 --- a/lib/asciidoctor/pdf/ext/prawn/extensions.rb +++ b/lib/asciidoctor/pdf/ext/prawn/extensions.rb @@ -429,11 +429,15 @@ module Asciidoctor # NOTE: override built-in fill_formatted_text_box to insert leading before second line when :first_line is true def fill_formatted_text_box text, options + if (initial_gap = options[:initial_gap]) && (first_text = text[0]) && first_text[:from_page] != page_number + self.y -= initial_gap + end merge_text_box_positioning_options options box = ::Prawn::Text::Formatted::Box.new text, options remaining_text = box.render @no_text_printed = box.nothing_printed? @all_text_printed = box.everything_printed? + remaining_text[0][:from_page] = page_number unless remaining_text.empty? if @final_gap || (options[:first_line] && !(@no_text_printed || @all_text_printed)) self.y -= box.height + box.line_gap + box.leading @@ -454,7 +458,7 @@ module Asciidoctor # remaining lines (which is the default behavior in Prawn). def text_with_formatted_first_line string, first_line_options, options if (first_line_font_color = first_line_options.delete :color) - other_lines_font_color, options[:color] = options[:color], first_line_font_color + remaining_lines_font_color, options[:color] = options[:color], first_line_font_color end fragments = parse_text string, options # NOTE: the low-level APIs we're using don't recognize the :styles option, so we must resolve @@ -473,14 +477,13 @@ module Asciidoctor first_line_options = (options.merge first_line_options).merge single_line: true, first_line: true box = ::Prawn::Text::Formatted::Box.new fragments, first_line_options if text_indent - remaining_fragments = indent text_indent do - box.render dry_run: true - end + remaining_fragments = indent(text_indent) { box.render dry_run: true } else remaining_fragments = box.render dry_run: true end + remaining_fragments.empty? ? (remaining_fragments = nil) : (remaining_fragments[0][:from_page] = page_number) if first_line_text_transform - # NOTE: applying text transform here could alter the wrapping, so we need to isolate first line and shrink to fit + # NOTE: applying text transform here could alter the wrapping, so isolate first line and shrink it to fit first_line_text = (box.instance_variable_get :@printed_lines)[0] unless first_line_text == fragments[0][:text] original_fragments, fragments = fragments, [] @@ -496,18 +499,16 @@ module Asciidoctor end fragments.each {|fragment| fragment[:text] = transform_text fragment[:text], first_line_text_transform } first_line_options[:overflow] = :shrink_to_fit - @final_gap = first_line_options[:force_justify] = true unless remaining_fragments.empty? + @final_gap = first_line_options[:force_justify] = true if remaining_fragments end if text_indent - indent text_indent do - fill_formatted_text_box fragments, first_line_options - end + indent(text_indent) { fill_formatted_text_box fragments, first_line_options } else fill_formatted_text_box fragments, first_line_options end - unless remaining_fragments.empty? + if remaining_fragments + options[:color] = remaining_lines_font_color if first_line_font_color @final_gap = final_gap if first_line_text_transform - options[:color] = other_lines_font_color if first_line_font_color remaining_fragments = fill_formatted_text_box remaining_fragments, options draw_remaining_formatted_text_on_new_pages remaining_fragments, options end |
