summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDan Allen <dan.j.allen@gmail.com>2022-05-15 14:29:26 -0600
committerGitHub <noreply@github.com>2022-05-15 14:29:26 -0600
commit8294aa6a671893740bbe487760f4c9727bb0d2bf (patch)
tree98b589866b75f2eb6445d1f281a324ce87b35065 /lib
parent229e6428a7e244a368fe8b1ae8a946999f821695 (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.rb9
-rw-r--r--lib/asciidoctor/pdf/ext/prawn/extensions.rb23
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