summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Allen <dan.j.allen@gmail.com>2022-05-26 15:31:51 -0600
committerGitHub <noreply@github.com>2022-05-26 15:31:51 -0600
commit5aee1f6277b2c791be2132ebedc2db1ccd30c1db (patch)
tree4b489bc479af5e29ce9e3b6850999afd757ef514
parentd679ff1066326d37b91bb8285a36666033098873 (diff)
resolves #2059 fix width of multi-word phrase with background and border offset (PR #2212)
-rw-r--r--CHANGELOG.adoc1
-rw-r--r--lib/asciidoctor/pdf/ext/prawn/formatted_text/fragment.rb8
-rw-r--r--lib/asciidoctor/pdf/formatted_text/inline_text_aligner.rb13
-rw-r--r--spec/formatted_text_formatter_spec.rb9
-rw-r--r--spec/reference/arrange-block-at-top-does-not-fit.pdfbin100471 -> 100474 bytes
-rw-r--r--spec/reference/arrange-block-at-top-fits.pdfbin135790 -> 135801 bytes
-rw-r--r--spec/reference/arrange-block-below-top-does-not-fit-prepress.pdfbin99203 -> 99176 bytes
-rw-r--r--spec/reference/arrange-block-below-top-does-not-fit.pdfbin98825 -> 98828 bytes
-rw-r--r--spec/reference/arrange-block-below-top-fits.pdfbin132396 -> 132424 bytes
-rw-r--r--spec/reference/text-formatter-marked-phrase-word-spacing.pdfbin0 -> 19757 bytes
10 files changed, 25 insertions, 6 deletions
diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc
index 51b5a470..aa7ac359 100644
--- a/CHANGELOG.adoc
+++ b/CHANGELOG.adoc
@@ -10,6 +10,7 @@ For a detailed view of what has changed, refer to the {url-repo}/commits/main[co
Bug Fixes::
* do not filter TOC entries without an ID when computing the TOC extent (#2210)
+* fix width of multi-word phrase with background and border offset (#2059)
== 2.0.4 (2022-05-25) - @mojavelinux
diff --git a/lib/asciidoctor/pdf/ext/prawn/formatted_text/fragment.rb b/lib/asciidoctor/pdf/ext/prawn/formatted_text/fragment.rb
index c96e6cdb..220a9830 100644
--- a/lib/asciidoctor/pdf/ext/prawn/formatted_text/fragment.rb
+++ b/lib/asciidoctor/pdf/ext/prawn/formatted_text/fragment.rb
@@ -5,8 +5,12 @@ Prawn::Text::Formatted::Fragment.prepend (Module.new do
# Prevent fragment from being written by discarding the text, optionally forcing the width to 0
def conceal force_width_to_zero = false
- @text = ''
- @width = 0 if force_width_to_zero
+ if force_width_to_zero
+ @width = 0
+ @text = ''
+ else
+ @text = ' ' * space_count # preserve space_count so width is still computed correctly
+ end
end
# Don't strip soft hyphens when repacking unretrieved fragments
diff --git a/lib/asciidoctor/pdf/formatted_text/inline_text_aligner.rb b/lib/asciidoctor/pdf/formatted_text/inline_text_aligner.rb
index d7b9086c..79c8ae26 100644
--- a/lib/asciidoctor/pdf/formatted_text/inline_text_aligner.rb
+++ b/lib/asciidoctor/pdf/formatted_text/inline_text_aligner.rb
@@ -9,11 +9,16 @@ module Asciidoctor::PDF::FormattedText
text = fragment.text
x = fragment.left
y = fragment.baseline
- align = fragment.format_state[:align]
- if (align == :center || align == :right) && (gap_width = fragment.width - (document.width_of text)) != 0
- x += gap_width * (align == :center ? 0.5 : 1)
+ align = (format_state = fragment.format_state)[:align]
+ if align == :center || align == :right
+ gap_width = (format_state.key? :width) ?
+ fragment.width - (document.width_of text) :
+ (format_state[:border_offset] || 0) * 2
+ x += gap_width * (align == :center ? 0.5 : 1) if gap_width > 0
+ end
+ document.word_spacing fragment.word_spacing do
+ document.draw_text! text, at: [x, y], kerning: document.default_kerning?
end
- document.draw_text! text, at: [x, y]
fragment.conceal
end
end
diff --git a/spec/formatted_text_formatter_spec.rb b/spec/formatted_text_formatter_spec.rb
index 48d25db5..7712c042 100644
--- a/spec/formatted_text_formatter_spec.rb
+++ b/spec/formatted_text_formatter_spec.rb
@@ -596,6 +596,15 @@ describe Asciidoctor::PDF::FormattedText::Formatter do
end
end
+ it 'should preserve word spacing in multi-word phrase that has a border offset', visual: true do
+ pdf_theme = { role_wild_background_color: 'CCCCCC', role_wild_border_offset: 1.5 }
+ to_file = to_pdf_file <<~EOS, 'text-formatter-marked-phrase-word-spacing.pdf', pdf_theme: pdf_theme
+ To tame the [.wild]#extremely wild and dangerous wolpertingers#, we needed to build a *charm*.
+ But ultimate victory could only be won if we divined the true name of the warlock.
+ EOS
+ (expect to_file).to visually_match 'text-formatter-marked-phrase-word-spacing.pdf'
+ end
+
it 'should not warn if text contains invalid markup in scratch document' do
# NOTE: this assertion will fail if the message is logged multiple times
(expect do
diff --git a/spec/reference/arrange-block-at-top-does-not-fit.pdf b/spec/reference/arrange-block-at-top-does-not-fit.pdf
index 5563beae..c6d4f6e2 100644
--- a/spec/reference/arrange-block-at-top-does-not-fit.pdf
+++ b/spec/reference/arrange-block-at-top-does-not-fit.pdf
Binary files differ
diff --git a/spec/reference/arrange-block-at-top-fits.pdf b/spec/reference/arrange-block-at-top-fits.pdf
index 483c3b8b..f9c7d982 100644
--- a/spec/reference/arrange-block-at-top-fits.pdf
+++ b/spec/reference/arrange-block-at-top-fits.pdf
Binary files differ
diff --git a/spec/reference/arrange-block-below-top-does-not-fit-prepress.pdf b/spec/reference/arrange-block-below-top-does-not-fit-prepress.pdf
index 53ed4775..4052bfc4 100644
--- a/spec/reference/arrange-block-below-top-does-not-fit-prepress.pdf
+++ b/spec/reference/arrange-block-below-top-does-not-fit-prepress.pdf
Binary files differ
diff --git a/spec/reference/arrange-block-below-top-does-not-fit.pdf b/spec/reference/arrange-block-below-top-does-not-fit.pdf
index 64009725..40a188fe 100644
--- a/spec/reference/arrange-block-below-top-does-not-fit.pdf
+++ b/spec/reference/arrange-block-below-top-does-not-fit.pdf
Binary files differ
diff --git a/spec/reference/arrange-block-below-top-fits.pdf b/spec/reference/arrange-block-below-top-fits.pdf
index 1672a594..d730b182 100644
--- a/spec/reference/arrange-block-below-top-fits.pdf
+++ b/spec/reference/arrange-block-below-top-fits.pdf
Binary files differ
diff --git a/spec/reference/text-formatter-marked-phrase-word-spacing.pdf b/spec/reference/text-formatter-marked-phrase-word-spacing.pdf
new file mode 100644
index 00000000..d9e2bbf5
--- /dev/null
+++ b/spec/reference/text-formatter-marked-phrase-word-spacing.pdf
Binary files differ