asciidoctor-pdf 2.1.0 → 2.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3fc9b0baae841d33e6205109c5aeacbb88bc196e6396b5dac8df187e0d209f9c
4
- data.tar.gz: 21fd8ea4cebcb721dc273fa1a8f81104ec8f14f6a4c1a6f396bf6194f5e2309d
3
+ metadata.gz: f7753392586bac4a044601fefa9ecb58745e02fc37434dd5a26e020692890e65
4
+ data.tar.gz: 301fe3fef546588aacba4ca8d9c5afd91d4a19a816f07a8fcc66121c8f58f626
5
5
  SHA512:
6
- metadata.gz: 956e66763693837a9483919f0b8b0428adbda5858efbfa75aa7b3a2fc04aff92a8e666643f7aae74ee01b656c1b9ad16984173dec4d0b0552bf668d0ad73d024
7
- data.tar.gz: e6e2ca9d393d1eafbea531bdf9b828d50075bf398723ecca99549175331aa9f1422a9640128ccbf511e8ec97db3e7ce0c6d763a3bc28aeadf92fc6fd2a130f77
6
+ metadata.gz: b26fe1f74b22bd73eba166190d21afebafdc1630dba5fee8174aa946b463d81b7e620cb8f400e803507f050c6dd48a1d732a1273a78fc1cd0e958da69a0a3c9c
7
+ data.tar.gz: 15cd75342088585a51f19cb342a8023fbc2aa6d0cd89fff72385370172059ac10c98fa51b8126845ce40436fcd89dc0c1f47aa763df14dad24ba2bcd95f92205
data/CHANGELOG.adoc CHANGED
@@ -5,6 +5,48 @@
5
5
  This document provides a high-level view of the changes to the {project-name} by release.
6
6
  For a detailed view of what has changed, refer to the {url-repo}/commits/main[commit history] on GitHub.
7
7
 
8
+ == 2.1.3 (2022-06-23) - @mojavelinux
9
+
10
+ Bug Fixes::
11
+
12
+ * interpret `start-at` theme keys with value `1` correctly (as `1` instead of `2`) (#2255)
13
+ * restore column layout after importing page(s) from PDF (#2253)
14
+ * fix crash when border color is transparent (`thematic-break-border-color`, `admonition-column-rule`, `quote-border-color`, `verse-border-color`)
15
+ * ensure page margin is restored after imported page
16
+
17
+ === Details
18
+
19
+ {url-repo}/releases/tag/v2.1.3[git tag] | {url-repo}/compare/v2.1.2\...v2.1.3[full diff]
20
+
21
+ == 2.1.2 (2022-06-17) - @mojavelinux
22
+
23
+ Bug Fixes::
24
+
25
+ * apply page layout from main document to new page in scratch document (#2248)
26
+ * use correct logic to insert page before TOC with automatic placement when doctype=book and media=prepress
27
+ * use `get_entries_for_toc` to determine if the TOC is non-empty rather than `Document#sections?`
28
+
29
+ === Details
30
+
31
+ {url-repo}/releases/tag/v2.1.2[git tag] | {url-repo}/compare/v2.1.1\...v2.1.2[full diff]
32
+
33
+ == 2.1.1 (2022-06-15) - @mojavelinux
34
+
35
+ Improvements::
36
+
37
+ * store zero-based column on Extent for extensions to use to position cursor at start of extent
38
+
39
+ Bug Fixes::
40
+
41
+ * place block image in SVG format in correct column when align is left and page columns are enabled (#2241)
42
+ * accurately trap LoadError from CodeRay if source language is not recognized on code block
43
+ * only draw rounded rectangle around phrase if `border-radius` is > 0
44
+ * use `base-border-color` value if border width is set on role for inline phrase but not border color
45
+
46
+ === Details
47
+
48
+ {url-repo}/releases/tag/v2.1.1[git tag] | {url-repo}/compare/v2.1.0\...v2.1.1[full diff]
49
+
8
50
  == 2.1.0 (2022-06-11) - @mojavelinux
9
51
 
10
52
  Enhancements::
data/README.adoc CHANGED
@@ -1,6 +1,6 @@
1
1
  = Asciidoctor PDF: A native PDF converter for AsciiDoc
2
2
  Dan Allen <https://github.com/mojavelinux[@mojavelinux]>; Sarah White <https://github.com/graphitefriction[@graphitefriction]>
3
- v2.1.0, 2022-06-11
3
+ v2.1.3, 2022-06-23
4
4
  // Settings:
5
5
  :experimental:
6
6
  :idprefix:
@@ -22,8 +22,6 @@ endif::[]
22
22
  // Aliases:
23
23
  :project-name: Asciidoctor PDF
24
24
  :project-handle: asciidoctor-pdf
25
- // Variables:
26
- :release-line: 2.1.x
27
25
  // URLs:
28
26
  :url-gem: https://rubygems.org/gems/asciidoctor-pdf
29
27
  :url-project: https://github.com/asciidoctor/asciidoctor-pdf
@@ -46,7 +44,7 @@ The aim of this library is to take the pain out of creating PDF documents from A
46
44
 
47
45
  [NOTE]
48
46
  ====
49
- The documentation for the latest, stable release of Asciidoctor PDF 2.0.x is available at {url-project-docs}/.
47
+ The documentation for the latest, stable release of Asciidoctor PDF is available at {url-project-docs}/.
50
48
 
51
49
  If you're looking for the documentation for Asciidoctor PDF 1.6, refer to the {url-project-repo}/tree/v1.6.x#readme[README] in the v1.6.x branch.
52
50
  Asciidoctor PDF 1.6 is no longer being developed and will reach EOL later this year.
@@ -198,8 +198,8 @@ module Asciidoctor
198
198
 
199
199
  indent_section do
200
200
  toc_num_levels = (doc.attr 'toclevels', 2).to_i
201
- if (insert_toc = (doc.attr? 'toc') && !((toc_placement = doc.attr 'toc-placement') == 'macro' || toc_placement == 'preamble') && doc.sections?)
202
- start_toc_page doc, toc_placement if title_page_on
201
+ if (insert_toc = (doc.attr? 'toc') && !((toc_placement = doc.attr 'toc-placement') == 'macro' || toc_placement == 'preamble') && !(get_entries_for_toc doc).empty?)
202
+ start_new_page if @ppbook && verso_page?
203
203
  add_dest_for_block doc, id: 'toc', y: (at_page_top? ? page_height : nil)
204
204
  @toc_extent = allocate_toc doc, toc_num_levels, cursor, title_page_on
205
205
  else
@@ -213,7 +213,7 @@ module Asciidoctor
213
213
  first_page_offset = has_title_page ? zero_page_offset.next : zero_page_offset
214
214
  body_offset = (body_start_page_number = page_number) - 1
215
215
  if ::Integer === (running_content_start_at = @theme.running_content_start_at)
216
- running_content_body_offset = body_offset + [running_content_start_at.pred, 1].max
216
+ running_content_body_offset = body_offset + [running_content_start_at.pred, 0].max
217
217
  running_content_start_at = 'body'
218
218
  else
219
219
  running_content_body_offset = body_offset
@@ -227,7 +227,7 @@ module Asciidoctor
227
227
  end
228
228
  end
229
229
  if ::Integer === (page_numbering_start_at = @theme.page_numbering_start_at)
230
- page_numbering_body_offset = body_offset + [page_numbering_start_at.pred, 1].max
230
+ page_numbering_body_offset = body_offset + [page_numbering_start_at.pred, 0].max
231
231
  page_numbering_start_at = 'body'
232
232
  else
233
233
  page_numbering_body_offset = body_offset
@@ -263,12 +263,12 @@ module Asciidoctor
263
263
  else
264
264
  body_offset = body_start_page_number - 1
265
265
  if ::Integer === (running_content_start_at = @theme.running_content_start_at)
266
- running_content_body_offset = body_offset + [running_content_start_at.pred, 1].max
266
+ running_content_body_offset = body_offset + [running_content_start_at.pred, 0].max
267
267
  else
268
268
  running_content_body_offset = body_offset
269
269
  end
270
270
  if ::Integer === (page_numbering_start_at = @theme.page_numbering_start_at)
271
- page_numbering_body_offset = body_offset + [page_numbering_start_at.pred, 1].max
271
+ page_numbering_body_offset = body_offset + [page_numbering_start_at.pred, 0].max
272
272
  elsif page_numbering_start_at == 'cover' && has_front_cover
273
273
  page_numbering_body_offset = 0
274
274
  else
@@ -371,8 +371,6 @@ module Asciidoctor
371
371
  if (page_margin_inner = theme.page_margin_inner)
372
372
  page_margin_recto[3] = page_margin_verso[1] = page_margin_inner
373
373
  end
374
- # NOTE: prepare scratch document to use page margin from recto side (which has same width as verso side)
375
- set_page_margin page_margin_recto unless page_margin_recto == page_margin
376
374
  else
377
375
  @ppbook = nil
378
376
  end
@@ -581,6 +579,7 @@ module Asciidoctor
581
579
  end
582
580
 
583
581
  def prepare_theme theme
582
+ theme.base_border_color = nil if theme.base_border_color == 'transparent'
584
583
  theme.base_font_color ||= '000000'
585
584
  theme.base_font_size ||= 12
586
585
  theme.base_font_style = theme.base_font_style&.to_sym || :normal
@@ -943,7 +942,7 @@ module Asciidoctor
943
942
  if extent
944
943
  label_height = extent.single_page_height || cursor
945
944
  if (rule_width = @theme.admonition_column_rule_width || 0) > 0 &&
946
- (rule_color = @theme.admonition_column_rule_color || @theme.base_border_color)
945
+ (rule_color = resolve_theme_color :admonition_column_rule_color, @theme.base_border_color, nil)
947
946
  rule_style = @theme.admonition_column_rule_style&.to_sym || :solid
948
947
  float do
949
948
  extent.each_page do |first_page, last_page|
@@ -1108,7 +1107,10 @@ module Asciidoctor
1108
1107
  srclang = node.attr 'language', 'text'
1109
1108
  begin
1110
1109
  ::CodeRay::Scanners[(srclang = (srclang.start_with? 'html+') ? (srclang.slice 5, srclang.length).to_sym : srclang.to_sym)]
1111
- rescue ::ArgumentError
1110
+ rescue
1111
+ until ::LoadError === (cause ||= $!) || ::ArgumentError === cause
1112
+ raise $! unless (cause = cause.cause)
1113
+ end
1112
1114
  srclang = :text
1113
1115
  end
1114
1116
  fragments = (::CodeRay.scan source_string, srclang).to_prawn
@@ -1270,7 +1272,7 @@ module Asciidoctor
1270
1272
  category = node.context == :quote ? :quote : :verse
1271
1273
  # NOTE: b_width and b_left_width are mutually exclusive
1272
1274
  if (b_left_width = @theme[%(#{category}_border_left_width)]) && b_left_width > 0
1273
- b_color = @theme[%(#{category}_border_color)] || @theme.base_border_color
1275
+ b_left_width = nil unless (b_color = resolve_theme_color %(#{category}_border_color), @theme.base_border_color, nil)
1274
1276
  else
1275
1277
  b_left_width = nil
1276
1278
  b_width = nil if (b_width = @theme[%(#{category}_border_width)]) == 0
@@ -1787,7 +1789,6 @@ module Asciidoctor
1787
1789
  file_request_root = { base: (::File.dirname image_path), root: @jail_dir }
1788
1790
  end
1789
1791
  svg_obj = ::Prawn::SVG::Interface.new svg_data, self,
1790
- position: alignment,
1791
1792
  width: width,
1792
1793
  fallback_font_name: fallback_svg_font_name,
1793
1794
  enable_web_requests: allow_uri_read ? (method :load_open_uri).to_proc : false,
@@ -1804,7 +1805,6 @@ module Asciidoctor
1804
1805
  if (rendered_h = svg_size.output_height) > (available_h = cursor - caption_h)
1805
1806
  unless pinned || at_page_top?
1806
1807
  advance_page
1807
- (svg_obj.options[:at] = svg_obj.position)[0] += bounds.left if ColumnBox === bounds
1808
1808
  available_h = cursor - caption_h
1809
1809
  end
1810
1810
  rendered_w = (svg_obj.resize height: (rendered_h = available_h)).output_width if rendered_h > available_h
@@ -1815,7 +1815,16 @@ module Asciidoctor
1815
1815
  update_colors if graphic_state.color_space.empty?
1816
1816
  ink_caption node, category: :image, end: :top, block_align: alignment, block_width: rendered_w, max_width: caption_max_width if caption_end == :top && node.title?
1817
1817
  image_y = y
1818
- image_cursor = cursor
1818
+ # NOTE: prawn-svg does not compute :at for alignment correctly in column box, so resort to our own logic
1819
+ case alignment
1820
+ when :center
1821
+ left = bounds.left + (available_w - rendered_w) * 0.5
1822
+ when :right
1823
+ left = bounds.left + available_w - rendered_w
1824
+ else
1825
+ left = bounds.left
1826
+ end
1827
+ svg_obj.options[:at] = [left, (image_cursor = cursor)]
1819
1828
  svg_obj.draw # NOTE: cursor advances automatically
1820
1829
  svg_obj.document.warnings.each do |img_warning|
1821
1830
  log :warn, %(problem encountered in image: #{image_path}; #{img_warning})
@@ -2331,9 +2340,11 @@ module Asciidoctor
2331
2340
 
2332
2341
  def convert_thematic_break node
2333
2342
  pad_box @theme.thematic_break_padding || [@theme.thematic_break_margin_top, 0] do
2334
- stroke_horizontal_rule @theme.thematic_break_border_color,
2335
- line_width: @theme.thematic_break_border_width,
2336
- line_style: (@theme.thematic_break_border_style&.to_sym || :solid)
2343
+ if (b_color = resolve_theme_color :thematic_break_border_color)
2344
+ stroke_horizontal_rule b_color,
2345
+ line_width: @theme.thematic_break_border_width,
2346
+ line_style: (@theme.thematic_break_border_style&.to_sym || :solid)
2347
+ end
2337
2348
  end
2338
2349
  conceal_page_top { theme_margin :block, :bottom, (next_enclosed_block node) }
2339
2350
  end
@@ -2342,7 +2353,7 @@ module Asciidoctor
2342
2353
  # NOTE: only allow document to have a single managed toc
2343
2354
  return if @toc_extent
2344
2355
  is_macro = (placement = opts[:placement] || 'macro') == 'macro'
2345
- if ((doc = node.document).attr? 'toc-placement', placement) && (doc.attr? 'toc') && doc.sections?
2356
+ if ((doc = node.document).attr? 'toc-placement', placement) && (doc.attr? 'toc') && !(get_entries_for_toc doc).empty?
2346
2357
  start_toc_page node, placement if (is_book = doc.doctype == 'book')
2347
2358
  add_dest_for_block node, id: (node.id || 'toc') if is_macro
2348
2359
  toc_extent = @toc_extent = allocate_toc doc, (doc.attr 'toclevels', 2).to_i, cursor, (title_page_on = is_book || (doc.attr? 'title-page'))
@@ -2792,13 +2803,7 @@ module Asciidoctor
2792
2803
  value = (value.split LF).delete_if {|line| SimpleAttributeRefRx.match? line }.join LF if opts[:drop_lines_with_unresolved_attributes] && (value.include? '{')
2793
2804
  value = value.gsub '\{', '{' if escaped_attr_ref
2794
2805
  doc.set_attr 'attribute-missing', attribute_missing unless attribute_missing == 'skip'
2795
- if imagesdir
2796
- if imagesdir_to_restore
2797
- doc.set_attr 'imagesdir', imagesdir_to_restore
2798
- else
2799
- doc.remove_attr 'imagesdir'
2800
- end
2801
- end
2806
+ imagesdir_to_restore ? (doc.set_attr 'imagesdir', imagesdir_to_restore) : (doc.remove_attr 'imagesdir') if imagesdir
2802
2807
  value
2803
2808
  end
2804
2809
 
@@ -4389,7 +4394,7 @@ module Asciidoctor
4389
4394
  b_shift, b_gap_color = (b_width ||= 0.5) * 0.5, @page_bg_color
4390
4395
  end
4391
4396
  ink_caption node_with_caption, category: category if node_with_caption
4392
- extent.from.page += 1 unless extent.from.page == page_number || ColumnBox === bounds # sanity check
4397
+ extent.from.page = page_number unless extent.from.page == page_number # sanity check
4393
4398
  float do
4394
4399
  extent.each_page do |first_page, last_page|
4395
4400
  advance_page unless first_page
@@ -4813,18 +4818,17 @@ module Asciidoctor
4813
4818
  end
4814
4819
 
4815
4820
  # NOTE: init_page is called within a float context; this will suppress prawn-svg messing with the cursor
4816
- # NOTE: init_page is not called for imported pages, front and back cover pages, and other image pages
4821
+ # NOTE: init_page is not called for imported pages, cover pages, image pages, and pages in the scratch document
4817
4822
  def init_page *_args
4818
4823
  next_page_side = page_side nil, @folio_placement[:inverted]
4819
4824
  if @media == 'prepress' && (next_page_margin = @page_margin_by_side[page_number == 1 ? :cover : next_page_side]) != page_margin
4820
4825
  set_page_margin next_page_margin
4821
4826
  end
4822
4827
  unless @page_bg_color == 'FFFFFF'
4823
- tare = true
4824
4828
  fill_absolute_bounds @page_bg_color
4829
+ tare = true
4825
4830
  end
4826
4831
  if (bg_image_path, bg_image_opts = @page_bg_image[next_page_side])
4827
- tare = true
4828
4832
  begin
4829
4833
  if bg_image_opts[:format] == 'pdf'
4830
4834
  # NOTE: pages that use PDF for the background do not support a background color or running content
@@ -4833,6 +4837,7 @@ module Asciidoctor
4833
4837
  else
4834
4838
  canvas { image bg_image_path, ({ position: :center, vposition: :center }.merge bg_image_opts) }
4835
4839
  end
4840
+ tare = true
4836
4841
  rescue
4837
4842
  facing_page_side = (PageSides - [next_page_side])[0]
4838
4843
  @page_bg_image[facing_page_side] = nil if @page_bg_image[facing_page_side] == @page_bg_image[next_page_side]
@@ -5027,10 +5032,8 @@ module Asciidoctor
5027
5032
  # QUESTION: should we pass a category as an argument?
5028
5033
  # QUESTION: should we make this a method on the theme ostruct? (e.g., @theme.resolve_color key, fallback)
5029
5034
  def resolve_theme_color key, fallback_color = nil, transparent_color = fallback_color
5030
- if (color = @theme[key])
5035
+ if (color = @theme[key] || fallback_color)
5031
5036
  color == 'transparent' ? transparent_color : color
5032
- else
5033
- fallback_color
5034
5037
  end
5035
5038
  end
5036
5039
 
@@ -5110,6 +5113,10 @@ module Asciidoctor
5110
5113
  end
5111
5114
 
5112
5115
  def init_scratch originator
5116
+ if @media == 'prepress' && page_margin != (page_margin_recto = @page_margin_by_side[:recto])
5117
+ # NOTE: prepare scratch document to use page margin from recto side (which has same width as verso side)
5118
+ set_page_margin page_margin_recto
5119
+ end
5113
5120
  @scratch_prototype = originator.instance_variable_get :@scratch_prototype
5114
5121
  @tmp_files = originator.instance_variable_get :@tmp_files
5115
5122
  text_formatter.scratch = true
@@ -6,20 +6,23 @@ Prawn::Document::ColumnBox.prepend (Module.new do
6
6
  def move_past_bottom
7
7
  (doc = @document).y = @y
8
8
  return if (@current_column = (@current_column + 1) % @columns) > 0
9
- par = @parent
10
- if (reset_y = @reflow_margins) && (reset_y == true || reset_y > doc.page_number)
11
- @y = par.absolute_top
12
- @height = par.height unless stretchy?
13
- end
9
+ parent_ = @parent
10
+ reset_top parent_ if (reflow_at = @reflow_margins) && (reflow_at == true || reflow_at > doc.page_number)
14
11
  initial_margins = doc.page.margins
15
- par.move_past_bottom
12
+ parent_.move_past_bottom
16
13
  if doc.page.margins != initial_margins
17
- doc.bounds = self.class.new doc, par, [(margin_box = doc.margin_box).absolute_left, @y],
14
+ doc.bounds = self.class.new doc, parent_, [(margin_box = doc.margin_box).absolute_left, @y],
18
15
  columns: @columns, reflow_margins: @reflow_margins, spacer: @spacer, width: margin_box.width, height: @height
19
16
  end
20
17
  nil
21
18
  end
22
19
 
20
+ def reset_top parent_ = @parent
21
+ @current_column = 0
22
+ @height = parent_.height unless stretchy?
23
+ @y = parent_.absolute_top
24
+ end
25
+
23
26
  # Rearranges the column box into a single column, where the original columns are in a single file. Used
24
27
  # for the purpose of computing the extent of content in a scratch document.
25
28
  def single_file
@@ -34,13 +34,14 @@ module Asciidoctor
34
34
  # - :final_gap determines whether a gap is added below the last line
35
35
  LineMetrics = ::Struct.new :height, :leading, :padding_top, :padding_bottom, :final_gap
36
36
 
37
- Position = ::Struct.new :page, :cursor
37
+ Position = ::Struct.new :page, :column, :cursor
38
38
 
39
39
  Extent = ::Struct.new :current, :from, :to do
40
- def initialize current_page, current_cursor, start_page, start_cursor, end_page, end_cursor
41
- self.from = self.current = Position.new current_page, current_cursor
42
- self.from = Position.new start_page, start_cursor unless start_page == current_page && start_cursor == current_cursor
43
- self.to = Position.new end_page, end_cursor
40
+ def initialize current_page, current_column, current_cursor, from_page, from_column, from_cursor, to_page, to_cursor
41
+ self.current = Position.new current_page, current_column, current_cursor
42
+ self.from = Position.new from_page, from_column, from_cursor
43
+ self.from = current if from == current
44
+ self.to = Position.new to_page, nil, to_cursor
44
45
  end
45
46
 
46
47
  def each_page
@@ -64,23 +65,23 @@ module Asciidoctor
64
65
 
65
66
  ScratchExtent = ::Struct.new :from, :to do
66
67
  def initialize start_page, start_cursor, end_page, end_cursor
67
- self.from = Position.new start_page, start_cursor
68
- self.to = Position.new end_page, end_cursor
68
+ self.from = Position.new start_page, 0, start_cursor
69
+ self.to = Position.new end_page, 0, end_cursor
69
70
  end
70
71
 
71
72
  def position_onto pdf, keep_together = nil
72
73
  current_page = pdf.page_number
74
+ current_column = ColumnBox === pdf.bounds ? (column_box = pdf.bounds).current_column : 0
73
75
  current_cursor = pdf.cursor
74
- from_page = current_page + (advance_by = from.page - 1)
75
- to_page = current_page + (to.page - 1)
76
- if advance_by > 0
76
+ if (advance_by = from.page - 1) > 0
77
77
  advance_by.times { pdf.advance_page }
78
78
  elsif keep_together && single_page? && !(try_to_fit_on_previous current_cursor)
79
79
  pdf.advance_page
80
- from_page += 1
81
- to_page += 1
82
80
  end
83
- Extent.new current_page, current_cursor, from_page, from.cursor, to_page, to.cursor
81
+ from_page = pdf.page_number
82
+ from_column = column_box&.current_column || 0
83
+ to_page = from_page + (to.page - from.page)
84
+ Extent.new current_page, current_column, current_cursor, from_page, from_column, from.cursor, to_page, to.cursor
84
85
  end
85
86
 
86
87
  def single_page?
@@ -923,6 +924,8 @@ module Asciidoctor
923
924
  def import_page file, options = {}
924
925
  prev_page_layout = page.layout
925
926
  prev_page_size = page.size
927
+ prev_page_margin = page_margin
928
+ prev_bounds = bounds
926
929
  state.compress = false if state.compress # can't use compression if using template
927
930
  prev_text_rendering_mode = (defined? @text_rendering_mode) ? @text_rendering_mode : nil
928
931
  delete_current_page if options[:replace]
@@ -935,11 +938,15 @@ module Asciidoctor
935
938
  # NOTE: set page size & layout explicitly in case imported page differs
936
939
  # I'm not sure it's right to start a new page here, but unfortunately there's no other
937
940
  # way atm to prevent the size & layout of the imported page from affecting subsequent pages
938
- advance_page size: prev_page_size, layout: prev_page_layout if options.fetch :advance, true
941
+ if options.fetch :advance, true
942
+ advance_page layout: prev_page_layout, margin: prev_page_margin, size: prev_page_size
943
+ (@bounding_box = prev_bounds).reset_top if ColumnBox === prev_bounds
944
+ end
939
945
  elsif options.fetch :advance_if_missing, true
940
946
  delete_current_page
941
947
  # NOTE: see previous comment
942
- advance_page size: prev_page_size, layout: prev_page_layout
948
+ advance_page layout: prev_page_layout, margin: prev_page_margin, size: prev_page_size
949
+ @y = (@bounding_box = prev_bounds).reset_top if ColumnBox === prev_bounds
943
950
  else
944
951
  delete_current_page
945
952
  end
@@ -972,11 +979,11 @@ module Asciidoctor
972
979
  state.on_page_create_callback = saved_callback
973
980
  end
974
981
 
975
- # This method is a smarter version of start_new_page. It calls start_new_page
976
- # if the current page is the last page of the document. Otherwise, it simply
977
- # advances to the next existing page.
982
+ # This method is a smarter version of start_new_page. It only calls start_new_page options are
983
+ # specified and the current page is the last page in the document. Otherwise, it advances the
984
+ # cursor to the next page (or column) using Bounds#move_past_bottom.
978
985
  def advance_page options = {}
979
- !options.empty? && last_page? ? (start_new_page options) : bounds.move_past_bottom
986
+ options.empty? || !last_page? ? bounds.move_past_bottom : (start_new_page options)
980
987
  end
981
988
 
982
989
  # Start a new page without triggering the on_page_create callback
@@ -1111,7 +1118,8 @@ module Asciidoctor
1111
1118
  # This method performs all work in a scratch document (or documents). It begins by starting a
1112
1119
  # new page in the scratch document, first creating the scratch document if necessary. It then
1113
1120
  # applies all the settings from the main document to the scratch document that impact
1114
- # rendering. This includes the bounds, the cursor position, and the font settings.
1121
+ # rendering. This includes the bounds, the cursor position, and the font settings. This method
1122
+ # assumes that the content area remains constant when content flows from one page to the next.
1115
1123
  #
1116
1124
  # From this point, the number of attempts the method makes is determined by the value of the
1117
1125
  # keep_together keyword parameter. If the value is true (or the parent document is inhibiting
@@ -1136,19 +1144,19 @@ module Asciidoctor
1136
1144
  # Note that if the block has content that itself requires a dry run, that nested dry run will
1137
1145
  # be performed in a separate scratch document.
1138
1146
  #
1139
- # opts - A Hash of options that configure the dry run computation:
1140
- # :keep_together - A Boolean indicating whether an attempt should be made to keep the
1141
- # content on the same page (optional, default: false).
1142
- # :single_page - A Boolean indicating whether the operation should stop if the content
1143
- # exceeds the height of a single page.
1144
- # :onto - The document onto which to position the scratch extent. If this option is
1145
- # set, the method returns an Extent instead of a ScratchExtent (optional, default: nil)
1146
- # :pages_advanced - The number of pages the content has been advanced during this
1147
- # operation (internal only) (optional, default: 0)
1147
+ # options - A Hash of options that configure the dry run computation:
1148
+ # :keep_together - A Boolean indicating whether an attempt should be made to keep
1149
+ # the content on the same page (optional, default: false).
1150
+ # :single_page - A Boolean indicating whether the operation should stop if the
1151
+ # content exceeds the height of a single page.
1152
+ # :onto - The document onto which to position the scratch extent. If this option is
1153
+ # set, the method returns an Extent instance (optional, default: false)
1154
+ # :pages_advanced - The number of pages the content has been advanced during this
1155
+ # operation (internal only) (optional, default: 0)
1148
1156
  #
1149
1157
  # Returns an Extent or ScratchExtent object that describes the bounds of the content block.
1150
1158
  def dry_run keep_together: nil, pages_advanced: 0, single_page: nil, onto: nil, &block
1151
- (scratch_pdf = scratch).start_new_page
1159
+ (scratch_pdf = scratch).start_new_page layout: page.layout
1152
1160
  saved_bounds = scratch_pdf.bounds
1153
1161
  scratch_pdf.bounds = bounds.dup.tap do |bounds_copy|
1154
1162
  bounds_copy.instance_variable_set :@document, scratch_pdf
@@ -25,11 +25,11 @@ module Asciidoctor::PDF::FormattedText
25
25
  width = fragment.width
26
26
  height = fragment.height
27
27
  end
28
- border_radius = data[:border_radius]
28
+ border_radius = data[:border_radius] || 0
29
29
  if (background_color = data[:background_color])
30
30
  prev_fill_color = pdf.fill_color
31
31
  pdf.fill_color background_color
32
- if border_radius
32
+ if border_radius > 0
33
33
  pdf.fill_rounded_rectangle at, width, height, border_radius
34
34
  else
35
35
  pdf.fill_rectangle at, width, height
@@ -41,7 +41,7 @@ module Asciidoctor::PDF::FormattedText
41
41
  prev_line_width = pdf.line_width
42
42
  pdf.stroke_color border_color
43
43
  pdf.line_width border_width
44
- border_radius ? (pdf.stroke_rounded_rectangle at, width, height, border_radius) : (pdf.stroke_rectangle at, width, height)
44
+ border_radius > 0 ? (pdf.stroke_rounded_rectangle at, width, height, border_radius) : (pdf.stroke_rectangle at, width, height)
45
45
  pdf.stroke_color prev_stroke_color
46
46
  pdf.line_width prev_line_width
47
47
  end
@@ -96,21 +96,24 @@ module Asciidoctor
96
96
  }.compact,
97
97
  }
98
98
  @theme_settings.tap do |accum|
99
- revise_roles = [].to_set
99
+ roles_with_styles = [].to_set
100
100
  theme.each_pair do |key, val|
101
101
  next unless (key = key.to_s).start_with? 'role_'
102
102
  role, key = (key.slice 5, key.length).split '_', 2
103
103
  if (prop = ThemeKeyToFragmentProperty[key])
104
104
  (accum[role] ||= {})[prop] = val
105
+ if key == 'border_width' && val && !(theme[%(role_#{role}_border_color)])
106
+ accum[role][:border_color] = theme.base_border_color
107
+ end
105
108
  #elsif key == 'font_kerning'
106
109
  # unless (resolved_val = val == 'none' ? false : (val == 'normal' ? true : nil)).nil?
107
110
  # (accum[role] ||= {})[:kerning] = resolved_val
108
111
  # end
109
112
  elsif key == 'font_style' || key == 'text_decoration'
110
- revise_roles << role
113
+ roles_with_styles << role
111
114
  end
112
115
  end
113
- revise_roles.each do |role|
116
+ roles_with_styles.each do |role|
114
117
  (accum[role] ||= {})[:styles] = to_styles theme[%(role_#{role}_font_style)], theme[%(role_#{role}_text_decoration)]
115
118
  end
116
119
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Asciidoctor
4
4
  module PDF
5
- VERSION = '2.1.0'
5
+ VERSION = '2.1.3'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asciidoctor-pdf
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Allen
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-06-11 00:00:00.000000000 Z
12
+ date: 2022-06-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: asciidoctor