asciidoctor-pdf 2.1.4 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eb8baebe850d75fcfc95460fbbdf89978867adb076acf572abaff0f51e18fb04
4
- data.tar.gz: d4dbbaab4981db0666488ae108aee0f5851feb706e3846b13cd5cf46c341b5bc
3
+ metadata.gz: 5dbb3a6c2c5b664510e19714de969553f3943994b4be273238c646e41274885f
4
+ data.tar.gz: f6495e965c651113bbc61383d82a18db4fb78a7df64644801bd10fba1c6ed078
5
5
  SHA512:
6
- metadata.gz: 26b1c9830deeb0a39494e9cdb85fa5c2e2295efe8b3d527525b27c6dcf420a8ab94e06eeaca3431425e9cf547150d372bab49813af946cdd5ea0e155d6aad1f0
7
- data.tar.gz: d584830d1eb1f76a005b48cf6a20030311d40184254d4ddfbd752f99a66c27feab85292c79012af0c9c4b7272a1727f402828f1c6d992228660ccbf78be44d2a
6
+ metadata.gz: 0b93162e6b69d1c32cf3365c08f78457f80cb1588a98c847b0ddfa6946074ba1c7c163009434243d9c78d87e6982c84b2c74eb06fbb72003f003854fbadea926
7
+ data.tar.gz: 2cc9d0d4d64ac4ae889e54cf272339019ec91a812ba38f22f28b81abb8daa6af086941e8b50bb95a70f1f1028dd06879952fd51da4219fc46db523f4757ca774
data/CHANGELOG.adoc CHANGED
@@ -5,6 +5,54 @@
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.2.0 (2022-07-22) - @mojavelinux
9
+
10
+ Enhancements::
11
+
12
+ * allow page background image to be specified per layout using `+{page-layout}+` attribute reference in path (#1739)
13
+ * allow page margin for rotated page to be configured independently using `page-margin-rotated` theme key or `pdf-page-margin-rotated` document attribute (#1719)
14
+ * allow orphan detection to be enabled for all section titles and discrete headings by setting `heading-min-height-after` to `auto` in theme (#2268)
15
+ * set `docimagesdir` attribute when attribute substitutions are applied to value from theme (#2278)
16
+ * start page numbering and running content on empty verso page before first chapter of prepress book if `start-at` value is 0 (#2252)
17
+ * don't force page break after TOC with automatic placement in article if `title-page` attribute is set and value of `toc-break-after` theme key is `auto` (#1768)
18
+ * add `--theme` option to CLI as shorthand for `-a pdf-theme` (#2250)
19
+ * add `--sourcemap` option to CLI to enable `:sourcemap` option on processor (#2265)
20
+ * broaden support for relative font sizes in theme to more than just inline elements; document support for relative font sizes
21
+ * allow theme to control font properties of marker for ordered list using `olist-marker` category (#2279)
22
+ * allow theme to control font style of marker (per marker or all markers) for unordered list
23
+
24
+ Improvements::
25
+
26
+ * add internal `Document#attr_unspecified?` method to simplify check for an attribute which has not been set or unset
27
+
28
+ Bug Fixes::
29
+
30
+ * always set `imagesdir` attribute to value of `themesdir` when resolving images from theme
31
+ * allow `top` keys in `title-page` theme category to accept a fixed value (e.g., `1in`) (#2269)
32
+ * prevent orphan detection for heading (section title or discrete heading) from modifying document state (#2288)
33
+
34
+ Compliance::
35
+
36
+ * configure table borders in way that is compatible with prawn-table > 0.2.2
37
+ * don't coerce font size < 1 to relative font size; relative font size should be specified in units
38
+
39
+ === Details
40
+
41
+ {url-repo}/releases/tag/v2.2.0[git tag] | {url-repo}/compare/v2.1.6\...v2.2.0[full diff]
42
+
43
+ == 2.1.6 (2022-07-19) - @mojavelinux
44
+
45
+ Bug Fixes::
46
+
47
+ * resolve font size for monospaced cell when font size value on `codespan` key in theme is relative (#2281)
48
+
49
+ == 2.1.5 (2022-07-10) - @mojavelinux
50
+
51
+ Bug Fixes::
52
+
53
+ * fix position of background color on caption with outside margin (#2271)
54
+ * don't allow font scale to compound when entering nested table (#2276)
55
+
8
56
  == 2.1.4 (2022-06-26) - @mojavelinux
9
57
 
10
58
  Improvements::
@@ -17,10 +65,6 @@ Bug Fixes::
17
65
  * apply text-tranform from custom role on phrase after attributes have been resolved (#2263)
18
66
  * make URL check more strict so image target containing a colon is not mistaken as a URL
19
67
 
20
- === Details
21
-
22
- {url-repo}/releases/tag/v2.1.4[git tag] | {url-repo}/compare/v2.1.3\...v2.1.4[full diff]
23
-
24
68
  == 2.1.3 (2022-06-23) - @mojavelinux
25
69
 
26
70
  Bug Fixes::
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.4, 2022-06-26
3
+ v2.2.0, 2022-07-22
4
4
  // Settings:
5
5
  :experimental:
6
6
  :idprefix:
data/bin/asciidoctor-pdf CHANGED
@@ -1,24 +1,43 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- if File.file?(asciidoctor_pdf = (File.expand_path '../../lib/asciidoctor/pdf.rb', __FILE__))
4
+ if File.file? (asciidoctor_pdf = File.join (File.dirname __dir__), 'lib/asciidoctor/pdf.rb')
5
5
  require asciidoctor_pdf
6
6
  else
7
7
  require 'asciidoctor/pdf'
8
8
  end
9
9
  require 'asciidoctor/cli'
10
10
 
11
- options = Asciidoctor::Cli::Options.new backend: 'pdf', header_footer: true
11
+ # FIXME: provide an API in Asciidoctor for sub-projects to prepend version information
12
+ options = (Asciidoctor::Cli::Options.new backend: 'pdf', header_footer: true).extend (Module.new do
13
+ def print_version os = $stdout
14
+ os.write %(Asciidoctor PDF #{Asciidoctor::PDF::VERSION} using )
15
+ super
16
+ end
17
+ end)
12
18
 
13
- # FIXME provide an API in Asciidoctor for sub-components to print version information
14
- unless ARGV != ['-v'] && (ARGV & ['-V', '--version']).empty?
15
- $stdout.write %(Asciidoctor PDF #{Asciidoctor::PDF::VERSION} using )
16
- options.print_version
17
- exit 0
19
+ args = ARGV.dup
20
+
21
+ if (theme_idx = args.index {|it| it == '--theme' || (it.start_with? '--theme=') })
22
+ if (theme_arg = args[theme_idx]).length > 7
23
+ args[theme_idx..theme_idx] = ['-a', %(pdf#{theme_arg.slice 1, theme_arg.length})]
24
+ elsif (val = args[theme_idx + 1]) && !(val.start_with? '-')
25
+ args[theme_idx] = '-a'
26
+ args[theme_idx + 1] = %(pdf-theme=#{val})
27
+ end
28
+ end
29
+
30
+ if (Gem::Version.new Asciidoctor::VERSION) < (Gem::Version.new '2.1.0') && (args.include? '--sourcemap')
31
+ args.delete '--sourcemap'
32
+ Asciidoctor::Extensions.register do
33
+ preprocessor do
34
+ process {|doc| (doc.sourcemap = true) && nil }
35
+ end
36
+ end
18
37
  end
19
38
 
20
- # FIXME This is a really bizarre API. Please make me simpler.
21
- case (result = options.parse! ARGV)
39
+ # FIXME: This is a really bizarre API. Please make me simpler.
40
+ case (result = options.parse! args)
22
41
  when Integer
23
42
  exit result
24
43
  else
@@ -1,8 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- optimizer = File.absolute_path '../lib/asciidoctor/pdf/optimizer.rb', __dir__
5
- if File.exist? optimizer
4
+ if File.file? (optimizer = File.join (File.dirname __dir__), 'lib/asciidoctor/pdf/optimizer.rb')
6
5
  require optimizer
7
6
  else
8
7
  require 'asciidoctor/pdf/optimizer'
@@ -27,8 +27,6 @@ module Asciidoctor
27
27
 
28
28
  attr_accessor :font_scale
29
29
 
30
- attr_reader :root_font_size
31
-
32
30
  attr_reader :index
33
31
 
34
32
  attr_reader :theme
@@ -162,11 +160,11 @@ module Asciidoctor
162
160
  doc.promote_preface_block
163
161
  init_pdf doc
164
162
  # set default value for outline, outline-title, and pagenums attributes if not otherwise set
165
- doc.attributes['outline'] = '' unless (doc.attribute_locked? 'outline') || ((doc.instance_variable_get :@attributes_modified).include? 'outline')
166
- doc.attributes['outline-title'] = '' unless (doc.attribute_locked? 'outline-title') || ((doc.instance_variable_get :@attributes_modified).include? 'outline-title')
167
- doc.attributes['pagenums'] = '' unless (doc.attribute_locked? 'pagenums') || ((doc.instance_variable_get :@attributes_modified).include? 'pagenums')
163
+ doc.attributes['outline'] = '' if doc.attr_unspecified? 'outline'
164
+ doc.attributes['outline-title'] = '' if doc.attr_unspecified? 'outline-title'
165
+ doc.attributes['pagenums'] = '' if doc.attr_unspecified? 'pagenums'
168
166
 
169
- on_page_create(&(method :init_page))
167
+ on_page_create(&(method :init_page).curry[doc])
170
168
 
171
169
  marked_page_number = page_number
172
170
  # NOTE: a new page will already be started (page_number = 2) if the front cover image is a PDF
@@ -181,7 +179,7 @@ module Asciidoctor
181
179
  end
182
180
  start_new_page
183
181
  else
184
- @page_margin_by_side[:cover] = @page_margin_by_side[:recto] if @media == 'prepress' && page_number == 0
182
+ @page_margin[:cover] = @page_margin[page.layout][:recto] if @media == 'prepress' && page_number == 0
185
183
  start_new_page unless page&.empty? # rubocop:disable Lint/SafeNavigationWithEmpty
186
184
  # NOTE: the base font must be set before any content is written to the main or scratch document
187
185
  # this method is called inside ink_title_page if the title page is active
@@ -202,19 +200,24 @@ module Asciidoctor
202
200
  if (insert_toc = (doc.attr? 'toc') && !((toc_placement = doc.attr 'toc-placement') == 'macro' || toc_placement == 'preamble') && !(get_entries_for_toc doc).empty?)
203
201
  start_new_page if @ppbook && verso_page?
204
202
  add_dest_for_block doc, id: 'toc', y: (at_page_top? ? page_height : nil)
205
- @toc_extent = allocate_toc doc, toc_num_levels, cursor, title_page_on
203
+ @toc_extent = allocate_toc doc, toc_num_levels, cursor, (title_page_on && theme.toc_break_after != 'auto')
206
204
  else
207
205
  @toc_extent = nil
208
206
  end
209
207
 
210
- start_new_page if @ppbook && verso_page? && !(((next_block = doc.first_child)&.context == :preamble ? next_block.first_child : next_block)&.option? 'nonfacing')
208
+ if @ppbook && verso_page? && !(((next_block = doc.first_child)&.context == :preamble ? next_block.first_child : next_block)&.option? 'nonfacing')
209
+ min_start_at = 0
210
+ start_new_page
211
+ else
212
+ min_start_at = 1
213
+ end
211
214
 
212
215
  if title_page_on
213
216
  zero_page_offset = has_front_cover ? 1 : 0
214
217
  first_page_offset = has_title_page ? zero_page_offset.next : zero_page_offset
215
218
  body_offset = (body_start_page_number = page_number) - 1
216
219
  if ::Integer === (running_content_start_at = @theme.running_content_start_at)
217
- running_content_body_offset = body_offset + [running_content_start_at.pred, 0].max
220
+ running_content_body_offset = body_offset + [running_content_start_at.pred, min_start_at.pred].max
218
221
  running_content_start_at = 'body'
219
222
  else
220
223
  running_content_body_offset = body_offset
@@ -228,7 +231,7 @@ module Asciidoctor
228
231
  end
229
232
  end
230
233
  if ::Integer === (page_numbering_start_at = @theme.page_numbering_start_at)
231
- page_numbering_body_offset = body_offset + [page_numbering_start_at.pred, 0].max
234
+ page_numbering_body_offset = body_offset + [page_numbering_start_at.pred, min_start_at.pred].max
232
235
  page_numbering_start_at = 'body'
233
236
  else
234
237
  page_numbering_body_offset = body_offset
@@ -353,7 +356,6 @@ module Asciidoctor
353
356
  @cache_uri = doc.attr? 'cache-uri'
354
357
  @jail_dir = doc.safe < ::Asciidoctor::SafeMode::SAFE ? nil : doc.base_dir
355
358
  @media ||= doc.attr 'media', 'screen'
356
- @page_margin_by_side = { recto: (page_margin_recto = page_margin), verso: (page_margin_verso = page_margin), cover: page_margin }
357
359
  case doc.attr 'pdf-folio-placement', (@media == 'prepress' ? 'physical' : 'virtual')
358
360
  when 'physical'
359
361
  @folio_placement = { basis: :physical }
@@ -364,6 +366,13 @@ module Asciidoctor
364
366
  else
365
367
  @folio_placement = { basis: :virtual }
366
368
  end
369
+ @page_margin = { cover: page_margin }
370
+ @page_margin[:portrait] = @page_margin[:landscape] = { recto: (page_margin_recto = page_margin), verso: (page_margin_verso = page_margin) }
371
+ if (rotated_page_margin = resolve_page_margin (doc.attr 'pdf-page-margin-rotated') || theme.page_margin_rotated)
372
+ rotated_page_margin = expand_margin_value rotated_page_margin
373
+ @edge_shorthand_cache = nil
374
+ @page_margin[PageLayouts[(PageLayouts.index page.layout) - 1]] = { recto: rotated_page_margin, verso: rotated_page_margin.dup }
375
+ end
367
376
  if @media == 'prepress'
368
377
  @ppbook = doc.doctype == 'book'
369
378
  if (page_margin_outer = theme.page_margin_outer)
@@ -375,17 +384,7 @@ module Asciidoctor
375
384
  else
376
385
  @ppbook = nil
377
386
  end
378
- if (bg_image = resolve_background_image doc, theme, 'page-background-image')&.first
379
- @page_bg_image = { verso: bg_image, recto: bg_image }
380
- else
381
- @page_bg_image = { verso: nil, recto: nil }
382
- end
383
- if (bg_image = resolve_background_image doc, theme, 'page-background-image-verso')
384
- @page_bg_image[:verso] = bg_image[0] && bg_image
385
- end
386
- if (bg_image = resolve_background_image doc, theme, 'page-background-image-recto')
387
- @page_bg_image[:recto] = bg_image[0] && bg_image
388
- end
387
+ @page_bg_image = {}
389
388
  @page_bg_color = resolve_theme_color :page_background_color, 'FFFFFF'
390
389
  # QUESTION: should ThemeLoader handle registering fonts instead?
391
390
  register_fonts theme.font_catalog, ((doc.attr 'pdf-fontsdir')&.sub '{docdir}', (doc.attr 'docdir')) || 'GEM_FONTS_DIR'
@@ -398,8 +397,7 @@ module Asciidoctor
398
397
  @base_text_align = (text_align = doc.attr 'text-align') && (TextAlignmentNames.include? text_align) ? text_align : theme.base_text_align
399
398
  @base_line_height = theme.base_line_height
400
399
  @cjk_line_breaks = doc.attr? 'scripts', 'cjk'
401
- if (hyphen_lang = (doc.attr 'hyphens') ||
402
- (((doc.attribute_locked? 'hyphens') || ((doc.instance_variable_get :@attributes_modified).include? 'hyphens')) ? nil : @theme.base_hyphens)) &&
400
+ if (hyphen_lang = (doc.attr 'hyphens') || ((doc.attr_unspecified? 'hyphens') ? @theme.base_hyphens : nil)) &&
403
401
  ((defined? ::Text::Hyphen::VERSION) || !(Helpers.require_library 'text/hyphen', 'text-hyphen', :warn).nil?)
404
402
  hyphen_lang = doc.attr 'lang' if !(::String === hyphen_lang) || hyphen_lang.empty?
405
403
  hyphen_lang = 'en_us' if hyphen_lang.nil_or_empty? || hyphen_lang == 'en'
@@ -437,34 +435,7 @@ module Asciidoctor
437
435
  end
438
436
 
439
437
  def build_pdf_options doc, theme
440
- case (page_margin = (doc.attr 'pdf-page-margin') || theme.page_margin)
441
- when ::Array
442
- if page_margin.empty?
443
- page_margin = nil
444
- else
445
- page_margin = page_margin.slice 0, 4 if page_margin.length > 4
446
- page_margin = page_margin.map {|v| ::Numeric === v ? v : (str_to_pt v.to_s) }
447
- end
448
- when ::Numeric
449
- page_margin = [page_margin]
450
- when ::String
451
- if page_margin.empty?
452
- page_margin = nil
453
- elsif (page_margin.start_with? '[') && (page_margin.end_with? ']')
454
- if (page_margin = (page_margin.slice 1, page_margin.length - 2).rstrip).empty?
455
- page_margin = nil
456
- else
457
- if (page_margin = page_margin.split ',', -1).length > 4
458
- page_margin = page_margin.slice 0, 4
459
- end
460
- page_margin = page_margin.map {|v| str_to_pt v.rstrip }
461
- end
462
- else
463
- page_margin = [(str_to_pt page_margin)]
464
- end
465
- else
466
- page_margin = nil
467
- end
438
+ page_margin = resolve_page_margin (doc.attr 'pdf-page-margin') || theme.page_margin
468
439
 
469
440
  if (doc.attr? 'pdf-page-size') && PageSizeRx =~ (doc.attr 'pdf-page-size')
470
441
  # e.g, [8.5in, 11in]
@@ -917,7 +888,7 @@ module Asciidoctor
917
888
  label_width = label_min_width || (icon_size * 1.5)
918
889
  elsif (icon_path = has_icon || !(icon_path = (@theme[%(admonition_icon_#{type})] || {})[:image]) ?
919
890
  (get_icon_image_path node, type) :
920
- (ThemeLoader.resolve_theme_asset (apply_subs_discretely doc, icon_path, subs: [:attributes]), @themesdir)) &&
891
+ (ThemeLoader.resolve_theme_asset (apply_subs_discretely doc, icon_path, subs: [:attributes], imagesdir: @themesdir), @themesdir)) &&
921
892
  (::File.readable? icon_path)
922
893
  icons = true
923
894
  # TODO: introduce @theme.admonition_image_width? or use size key from admonition_icon_<name>?
@@ -1464,7 +1435,8 @@ module Asciidoctor
1464
1435
  end
1465
1436
  max_term_width += (term_padding[1] + term_padding[3])
1466
1437
  term_column_width = [max_term_width, bounds.width * 0.5].min
1467
- table table_data, position: :left, cell_style: { border_width: 0 }, column_widths: [term_column_width] do
1438
+ table table_data, position: :left, column_widths: [term_column_width] do
1439
+ cells.style border_width: 0
1468
1440
  @pdf.ink_table_caption node if node.title?
1469
1441
  end
1470
1442
  theme_margin :prose, :bottom, (next_enclosed_block actual_node) #unless actual_node.nested?
@@ -1633,6 +1605,9 @@ module Asciidoctor
1633
1605
  marker = node.parent.style == 'decimal' && index.abs < 10 ? %(#{index < 0 ? '-' : ''}0#{index.abs}.) : %(#{index}.)
1634
1606
  dir = (node.parent.option? 'reversed') ? :pred : :next
1635
1607
  @list_numerals << (index.public_send dir)
1608
+ [:font_color, :font_family, :font_size, :font_style, :line_height].each do |prop|
1609
+ marker_style[prop] = @theme[%(olist_marker_#{prop})] || marker_style[prop]
1610
+ end
1636
1611
  end
1637
1612
  end
1638
1613
  else # :ulist
@@ -1647,7 +1622,7 @@ module Asciidoctor
1647
1622
  else
1648
1623
  marker = @theme[%(ulist_marker_#{marker_type}_content)] || Bullets[marker_type]
1649
1624
  end
1650
- [:font_color, :font_family, :font_size, :line_height].each do |prop|
1625
+ [:font_color, :font_family, :font_size, :font_style, :line_height].each do |prop|
1651
1626
  marker_style[prop] = @theme[%(ulist_marker_#{marker_type}_#{prop})] || @theme[%(ulist_marker_#{prop})] || marker_style[prop]
1652
1627
  end if marker
1653
1628
  end
@@ -1658,8 +1633,9 @@ module Asciidoctor
1658
1633
  log :info, 'deprecated fa icon set found in theme; use fas, far, or fab instead'
1659
1634
  marker_style[:font_family] = FontAwesomeIconSets.find {|candidate| (icon_font_data candidate).yaml[candidate].value? marker } || 'fas'
1660
1635
  end
1636
+ marker_style[:font_style] &&= marker_style[:font_style].to_sym
1661
1637
  marker_gap = rendered_width_of_char 'x'
1662
- font marker_style[:font_family], marker_style[:font_size] do
1638
+ font marker_style[:font_family], size: marker_style[:font_size], style: marker_style[:font_style] do
1663
1639
  marker_width = rendered_width_of_string marker
1664
1640
  # NOTE: compensate if character_spacing is not applied to first character
1665
1641
  # see https://github.com/prawnpdf/prawn/commit/c61c5d48841910aa11b9e3d6f0e01b68ce435329
@@ -1678,6 +1654,7 @@ module Asciidoctor
1678
1654
  color: marker_style[:font_color],
1679
1655
  inline_format: false,
1680
1656
  line_height: marker_style[:line_height],
1657
+ style: marker_style[:font_style],
1681
1658
  margin: 0,
1682
1659
  normalize: false,
1683
1660
  single_line: true
@@ -1942,10 +1919,10 @@ module Asciidoctor
1942
1919
  if at_page_top?
1943
1920
  if page_layout && page_layout != page.layout && page.empty?
1944
1921
  delete_current_page
1945
- advance_page layout: page_layout
1922
+ advance_page layout: page_layout, margin: @page_margin[page_layout][page_side nil, @folio_placement[:inverted]]
1946
1923
  end
1947
1924
  elsif page_layout
1948
- advance_page layout: page_layout
1925
+ advance_page layout: page_layout, margin: @page_margin[page_layout][page_side nil, @folio_placement[:inverted]]
1949
1926
  else
1950
1927
  advance_page
1951
1928
  end
@@ -1996,6 +1973,7 @@ module Asciidoctor
1996
1973
  num_cols = node.columns.size
1997
1974
  table_header_size = false
1998
1975
  theme = @theme
1976
+ prev_font_scale, @font_scale = @font_scale, 1 if node.document.nested?
1999
1977
 
2000
1978
  tbl_bg_color = resolve_theme_color :table_background_color
2001
1979
  # QUESTION: should we fallback to page background color? (which is never transparent)
@@ -2135,7 +2113,7 @@ module Asciidoctor
2135
2113
  end
2136
2114
  # NOTE: line metrics get applied when AsciiDoc content is converted
2137
2115
  cell_line_metrics = nil
2138
- asciidoc_cell = ::Prawn::Table::Cell::AsciiDoc.new self, (cell_data.merge content: cell.inner_document, padding: body_cell_padding)
2116
+ asciidoc_cell = ::Prawn::Table::Cell::AsciiDoc.new self, (cell_data.merge content: cell.inner_document, padding: body_cell_padding, root_font_size: @root_font_size)
2139
2117
  cell_data = { content: asciidoc_cell, source_location: cell.source_location }
2140
2118
  end
2141
2119
  if cell_line_metrics
@@ -2240,10 +2218,10 @@ module Asciidoctor
2240
2218
  # NOTE: position is handled by this method
2241
2219
  position: :left,
2242
2220
  # NOTE: the border color, style, and width of the outer frame is set in the table callback block
2243
- cell_style: { border_color: grid_color.values, border_lines: grid_style.values, border_width: grid_width.values },
2244
2221
  width: table_width,
2245
2222
  column_widths: column_widths,
2246
2223
  }
2224
+ cell_style = { border_color: grid_color.values, border_lines: grid_style.values, border_width: grid_width.values }
2247
2225
 
2248
2226
  # QUESTION: should we support nth; should we support sequence of roles?
2249
2227
  case node.attr 'stripes', nil, 'table-stripes'
@@ -2259,6 +2237,8 @@ module Asciidoctor
2259
2237
 
2260
2238
  left_padding = right_padding = nil
2261
2239
  table table_data, table_settings do
2240
+ # NOTE: cell_style must be applied manually to be compatible with both prawn-table 0.2.2 and prawn-table 0.2.3
2241
+ cells.style cell_style
2262
2242
  @column_widths = column_widths unless column_widths.empty?
2263
2243
  # NOTE: call width to capture resolved table width
2264
2244
  table_width = width
@@ -2339,6 +2319,8 @@ module Asciidoctor
2339
2319
  theme_margin :block, :bottom, (next_enclosed_block node)
2340
2320
  rescue ::Prawn::Errors::CannotFit
2341
2321
  log :error, (message_with_context 'cannot fit contents of table cell into specified column width', source_location: node.source_location)
2322
+ ensure
2323
+ @font_scale = prev_font_scale if prev_font_scale
2342
2324
  end
2343
2325
 
2344
2326
  def convert_thematic_break node
@@ -2428,7 +2410,7 @@ module Asciidoctor
2428
2410
  # QUESTION: should we insert breakable chars into URI when building fragment instead?
2429
2411
  %(#{anchor}<a href="#{target}"#{attrs.join}>#{breakable_uri text}</a>)
2430
2412
  # NOTE: @media may not be initialized if method is called before convert phase
2431
- elsif (doc.attr? 'show-link-uri') || !(@media == 'screen' || (doc.attribute_locked? 'show-link-uri') || ((doc.instance_variable_get :@attributes_modified).include? 'show-link-uri'))
2413
+ elsif (doc.attr? 'show-link-uri') || (@media != 'screen' && (doc.attr_unspecified? 'show-link-uri'))
2432
2414
  # QUESTION: should we insert breakable chars into URI when building fragment instead?
2433
2415
  # TODO: allow style of printed link to be controlled by theme
2434
2416
  %(#{anchor}<a href="#{target}"#{attrs.join}>#{text}</a> [<font size="0.85em">#{breakable_uri bare_target}</font>&#93;)
@@ -2792,6 +2774,11 @@ module Asciidoctor
2792
2774
  if (imagesdir = opts[:imagesdir])
2793
2775
  imagesdir_to_restore = doc.attr 'imagesdir'
2794
2776
  doc.set_attr 'imagesdir', imagesdir
2777
+ remove_docimagesdir = doc.set_attr 'docimagesdir', (::File.absolute_path imagesdir_to_restore.to_s, (doc.attr 'docdir', '')), false
2778
+ end
2779
+ if (page_layout = opts[:page_layout])
2780
+ page_layout_to_restore = doc.attr 'page-layout'
2781
+ doc.set_attr 'page-layout', page.layout.to_s
2795
2782
  end
2796
2783
  # FIXME: get sub_attributes to handle drop-line w/o a warning
2797
2784
  doc.set_attr 'attribute-missing', 'skip' unless (attribute_missing = doc.attr 'attribute-missing') == 'skip'
@@ -2800,20 +2787,26 @@ module Asciidoctor
2800
2787
  value = (value.split LF).delete_if {|line| SimpleAttributeRefRx.match? line }.join LF if opts[:drop_lines_with_unresolved_attributes] && (value.include? '{')
2801
2788
  value = value.gsub '\{', '{' if escaped_attr_ref
2802
2789
  doc.set_attr 'attribute-missing', attribute_missing unless attribute_missing == 'skip'
2803
- imagesdir_to_restore ? (doc.set_attr 'imagesdir', imagesdir_to_restore) : (doc.remove_attr 'imagesdir') if imagesdir
2790
+ page_layout_to_restore ? (doc.set_attr 'page-layout', page_layout_to_restore) : (doc.remove_attr 'page-layout') if page_layout
2791
+ if imagesdir
2792
+ imagesdir_to_restore ? (doc.set_attr 'imagesdir', imagesdir_to_restore) : (doc.remove_attr 'imagesdir')
2793
+ doc.remove_attr 'docimagesdir' if remove_docimagesdir
2794
+ end
2804
2795
  value
2805
2796
  end
2806
2797
 
2807
2798
  # Position the cursor for where to ink the specified section title or discrete heading node.
2808
2799
  #
2809
- # This method computes whether there is enough room on the page to prevent the specified node
2810
- # from being orphaned. If there is not enough room, the method will advance the cursor to
2800
+ # This method computes whether there's enough room on the page to prevent the specified node
2801
+ # from being orphaned. If there's not enough room, the method will advance the cursor to
2811
2802
  # the next page. This method is not called if the cursor is already at the top of the page or
2812
2803
  # whether this node has no node that follows it in document order.
2813
2804
  def arrange_heading node, title, opts
2814
- if node.option? 'breakable'
2805
+ if (min_height_after = @theme.heading_min_height_after) == 'auto' || (node.option? 'breakable')
2815
2806
  orphaned = nil
2807
+ doc = node.document
2816
2808
  dry_run single_page: true do
2809
+ push_scratch doc
2817
2810
  start_page = page
2818
2811
  theme_font :heading, level: opts[:level] do
2819
2812
  if opts[:part]
@@ -2828,6 +2821,8 @@ module Asciidoctor
2828
2821
  page.tare_content_stream
2829
2822
  orphaned = stop_if_first_page_empty { node.context == :section ? (traverse node) : (convert node.next_sibling) }
2830
2823
  end
2824
+ ensure
2825
+ pop_scratch doc
2831
2826
  end
2832
2827
  advance_page if orphaned
2833
2828
  else
@@ -2838,9 +2833,7 @@ module Asciidoctor
2838
2833
  heading_h = (height_of_typeset_text title) +
2839
2834
  (@theme[%(heading_h#{hlevel}_margin_top)] || @theme.heading_margin_top) +
2840
2835
  (@theme[%(heading_h#{hlevel}_margin_bottom)] || @theme.heading_margin_bottom) + h_padding_t + h_padding_b
2841
- if (min_height_after = @theme.heading_min_height_after) && (node.context == :section ? node.blocks? : !node.last_child?)
2842
- heading_h += min_height_after
2843
- end
2836
+ heading_h += min_height_after if min_height_after && (node.context == :section ? node.blocks? : !node.last_child?)
2844
2837
  cursor >= heading_h
2845
2838
  end
2846
2839
  advance_page unless h_fits
@@ -3103,7 +3096,8 @@ module Asciidoctor
3103
3096
  end
3104
3097
  unless scratch? || !(bg_color = @theme[%(#{category_caption}_background_color)] || @theme.caption_background_color)
3105
3098
  caption_height = height_of_typeset_text string
3106
- fill_at = [bounds.left, cursor + (margin[:top] || 0)]
3099
+ fill_at = [bounds.left, cursor]
3100
+ fill_at[1] -= (margin[:top] || 0) unless at_page_top?
3107
3101
  float { bounding_box(fill_at, width: container_width, height: caption_height) { fill_bounds bg_color } }
3108
3102
  end
3109
3103
  indent(*indent_by) do
@@ -3141,7 +3135,7 @@ module Asciidoctor
3141
3135
  open_graphics_state if face == :front
3142
3136
  return
3143
3137
  elsif image_path == '~'
3144
- @page_margin_by_side[:cover] = @page_margin_by_side[:recto] if @media == 'prepress'
3138
+ @page_margin[:cover] = @page_margin[page.layout][:recto] if @media == 'prepress'
3145
3139
  return
3146
3140
  end
3147
3141
 
@@ -3272,7 +3266,7 @@ module Asciidoctor
3272
3266
 
3273
3267
  def allocate_running_content_layout doc, page, periphery, cache
3274
3268
  cache[layout = page.layout] ||= begin
3275
- page_margin_recto = @page_margin_by_side[:recto]
3269
+ page_margin_recto = @page_margin[layout][:recto]
3276
3270
  trim_margin_recto = @theme[%(#{periphery}_recto_margin)] || @theme[%(#{periphery}_margin)] || [0, 'inherit', 0, 'inherit']
3277
3271
  trim_margin_recto = (expand_margin_value trim_margin_recto).map.with_index {|v, i| i.odd? && v == 'inherit' ? page_margin_recto[i] : v.to_f }
3278
3272
  trim_content_margin_recto = @theme[%(#{periphery}_recto_content_margin)] || @theme[%(#{periphery}_content_margin)] || [0, 'inherit', 0, 'inherit']
@@ -3282,7 +3276,7 @@ module Asciidoctor
3282
3276
  else
3283
3277
  trim_padding_recto = trim_content_margin_recto
3284
3278
  end
3285
- page_margin_verso = @page_margin_by_side[:verso]
3279
+ page_margin_verso = @page_margin[layout][:verso]
3286
3280
  trim_margin_verso = @theme[%(#{periphery}_verso_margin)] || @theme[%(#{periphery}_margin)] || [0, 'inherit', 0, 'inherit']
3287
3281
  trim_margin_verso = (expand_margin_value trim_margin_verso).map.with_index {|v, i| i.odd? && v == 'inherit' ? page_margin_verso[i] : v.to_f }
3288
3282
  trim_content_margin_verso = @theme[%(#{periphery}_verso_content_margin)] || @theme[%(#{periphery}_content_margin)] || [0, 'inherit', 0, 'inherit']
@@ -3677,7 +3671,7 @@ module Asciidoctor
3677
3671
  logo_image_attrs = (AttributeList.new $2).parse %w(alt width height)
3678
3672
  if logo_image_from_theme
3679
3673
  relative_to_imagesdir = false
3680
- logo_image_path = apply_subs_discretely doc, $1, subs: [:attributes]
3674
+ logo_image_path = apply_subs_discretely doc, $1, subs: [:attributes], imagesdir: @themesdir
3681
3675
  logo_image_path = ThemeLoader.resolve_theme_asset logo_image_path, @themesdir unless doc.is_uri? logo_image_path
3682
3676
  else
3683
3677
  relative_to_imagesdir = true
@@ -3687,7 +3681,7 @@ module Asciidoctor
3687
3681
  logo_image_attrs = {}
3688
3682
  relative_to_imagesdir = false
3689
3683
  if logo_image_from_theme
3690
- logo_image_path = apply_subs_discretely doc, logo_image_path, subs: [:attributes]
3684
+ logo_image_path = apply_subs_discretely doc, logo_image_path, subs: [:attributes], imagesdir: @themesdir
3691
3685
  logo_image_path = ThemeLoader.resolve_theme_asset logo_image_path, @themesdir unless doc.is_uri? logo_image_path
3692
3686
  end
3693
3687
  end
@@ -3773,12 +3767,12 @@ module Asciidoctor
3773
3767
  end
3774
3768
  end
3775
3769
 
3776
- def allocate_toc doc, toc_num_levels, toc_start_cursor, title_page_on
3770
+ def allocate_toc doc, toc_num_levels, toc_start_cursor, break_after_toc
3777
3771
  toc_start_page_number = page_number
3778
3772
  to_page = nil
3779
3773
  extent = dry_run onto: self do
3780
3774
  to_page = (ink_toc doc, toc_num_levels, toc_start_page_number, toc_start_cursor).end
3781
- theme_margin :block, :bottom unless title_page_on
3775
+ theme_margin :block, :bottom unless break_after_toc
3782
3776
  end
3783
3777
  # NOTE: patch for custom converters that allocate extra TOC pages without actually creating them
3784
3778
  if to_page > extent.to.page
@@ -3786,7 +3780,7 @@ module Asciidoctor
3786
3780
  extent.to.cursor = bounds.height
3787
3781
  end
3788
3782
  # NOTE: reserve pages for the toc; leaves cursor on page after last page in toc
3789
- if title_page_on
3783
+ if break_after_toc
3790
3784
  extent.each_page { start_new_page }
3791
3785
  else
3792
3786
  extent.each_page {|first_page| start_new_page unless first_page }
@@ -4057,18 +4051,14 @@ module Asciidoctor
4057
4051
  return []
4058
4052
  elsif (image_path.include? ':') && image_path =~ ImageAttributeValueRx
4059
4053
  image_attrs = (AttributeList.new $2).parse %w(alt width)
4060
- if from_theme
4061
- image_path = apply_subs_discretely doc, $1, subs: [:attributes]
4062
- image_relative_to = @themesdir
4063
- else
4064
- image_path = $1
4065
- image_relative_to = true
4066
- end
4067
- elsif from_theme
4068
- image_path = apply_subs_discretely doc, image_path, subs: [:attributes]
4069
- image_relative_to = @themesdir
4054
+ image_path = $1
4055
+ image_relative_to = true
4056
+ end
4057
+ if from_theme
4058
+ image_path = apply_subs_discretely doc, image_path, subs: [:attributes], imagesdir: (image_relative_to = @themesdir), page_layout: page.layout.to_s
4059
+ elsif image_path.include? '{page-layout}'
4060
+ image_path = image_path.sub '{page-layout}', page.layout.to_s
4070
4061
  end
4071
-
4072
4062
  image_path, image_format = ::Asciidoctor::Image.target_and_format image_path, image_attrs
4073
4063
  image_path = resolve_image_path doc, image_path, image_format, image_relative_to
4074
4064
 
@@ -4282,6 +4272,27 @@ module Asciidoctor
4282
4272
  end
4283
4273
  end
4284
4274
 
4275
+ def resolve_page_margin value
4276
+ return if value.nil_or_empty?
4277
+ case value
4278
+ when ::Array
4279
+ value = value.slice 0, 4 if value.length > 4
4280
+ value.map {|v| ::Numeric === v ? v : (str_to_pt v.to_s) }
4281
+ when ::Numeric
4282
+ [value]
4283
+ when ::String
4284
+ if (value.start_with? '[') && (value.end_with? ']')
4285
+ return if (value = (value.slice 1, value.length - 2).rstrip).empty?
4286
+ if (value = value.split ',', -1).length > 4
4287
+ value = value.slice 0, 4
4288
+ end
4289
+ value.map {|v| str_to_pt v.rstrip }
4290
+ else
4291
+ [(str_to_pt value)]
4292
+ end
4293
+ end
4294
+ end
4295
+
4285
4296
  def resolve_text_align_from_role roles, query_theme: false, remove_predefined: false
4286
4297
  if (align_role = roles.reverse.find {|r| TextAlignmentRoles.include? r })
4287
4298
  roles.replace roles - TextAlignmentRoles if remove_predefined
@@ -4334,17 +4345,17 @@ module Asciidoctor
4334
4345
  elsif @ppbook && page_number > 0 && recto_page?
4335
4346
  start_new_page
4336
4347
  end
4337
- side = page_side (recycle ? nil : page_number + 1), @folio_placement[:inverted]
4338
- prev_bg_image = @page_bg_image[side]
4339
- prev_bg_color = @page_bg_color
4340
4348
  if (bg_image = resolve_background_image doc, @theme, 'title-page-background-image')
4341
- @page_bg_image[side] = bg_image[0] && bg_image
4349
+ side = page_side (recycle ? nil : page_number + 1), @folio_placement[:inverted]
4350
+ prev_bg_image = get_page_bg_image doc, @theme, (layout = page.layout), side
4351
+ @page_bg_image[layout][side] = bg_image[0] && bg_image
4342
4352
  end
4343
4353
  if (bg_color = resolve_theme_color :title_page_background_color)
4354
+ prev_bg_color = @page_bg_color
4344
4355
  @page_bg_color = bg_color
4345
4356
  end
4346
- recycle ? float { init_page self } : start_new_page
4347
- @page_bg_image[side] = prev_bg_image if bg_image
4357
+ recycle ? float { init_page doc, self } : start_new_page
4358
+ @page_bg_image[layout][side] = prev_bg_image if bg_image
4348
4359
  @page_bg_color = prev_bg_color if bg_color
4349
4360
  true
4350
4361
  end
@@ -4431,7 +4442,12 @@ module Asciidoctor
4431
4442
  if opts.key? :level
4432
4443
  hlevel_category = %(#{category}_h#{opts[:level]})
4433
4444
  family = @theme[%(#{hlevel_category}_font_family)] || @theme[%(#{category}_font_family)] || @theme.base_font_family || font_family
4434
- size = (@theme[%(#{hlevel_category}_font_size)] || @theme[%(#{category}_font_size)] || @root_font_size) * @font_scale
4445
+ if (size = @theme[%(#{hlevel_category}_font_size)] || @theme[%(#{category}_font_size)])
4446
+ scale = @font_scale unless ::String === size
4447
+ else
4448
+ scale = @font_scale
4449
+ size = @root_font_size
4450
+ end
4435
4451
  style = @theme[%(#{hlevel_category}_font_style)] || @theme[%(#{category}_font_style)]
4436
4452
  color = @theme[%(#{hlevel_category}_font_color)] || @theme[%(#{category}_font_color)]
4437
4453
  kerning = resolve_font_kerning @theme[%(#{hlevel_category}_font_kerning)] || @theme[%(#{category}_font_kerning)]
@@ -4441,7 +4457,11 @@ module Asciidoctor
4441
4457
  else
4442
4458
  inherited_font = font_info
4443
4459
  family = @theme[%(#{category}_font_family)] || inherited_font[:family]
4444
- size = (size = @theme[%(#{category}_font_size)]) ? size * @font_scale : inherited_font[:size]
4460
+ if (size = @theme[%(#{category}_font_size)])
4461
+ scale = @font_scale unless ::String === size
4462
+ else
4463
+ size = inherited_font[:size]
4464
+ end
4445
4465
  style = @theme[%(#{category}_font_style)] || inherited_font[:style]
4446
4466
  color = @theme[%(#{category}_font_color)]
4447
4467
  kerning = resolve_font_kerning @theme[%(#{category}_font_kerning)]
@@ -4457,6 +4477,7 @@ module Asciidoctor
4457
4477
 
4458
4478
  result = nil
4459
4479
  font family, size: size, style: style&.to_sym do
4480
+ @font_size *= scale if scale
4460
4481
  result = yield
4461
4482
  ensure
4462
4483
  @font_color = prev_color if color
@@ -4793,6 +4814,23 @@ module Asciidoctor
4793
4814
  (code.start_with? '\u') ? ([((code.slice 2, code.length).to_i 16)].pack 'U1') : code
4794
4815
  end
4795
4816
 
4817
+ def get_page_bg_image doc, theme_, layout, side
4818
+ (@page_bg_image[layout] ||= begin
4819
+ if (bg_image = resolve_background_image doc, theme_, 'page-background-image')&.first
4820
+ val = { verso: bg_image, recto: bg_image }
4821
+ else
4822
+ val = { verso: nil, recto: nil }
4823
+ end
4824
+ if (bg_image = resolve_background_image doc, theme_, 'page-background-image-verso')
4825
+ val[:verso] = bg_image[0] && bg_image
4826
+ end
4827
+ if (bg_image = resolve_background_image doc, theme_, 'page-background-image-recto')
4828
+ val[:recto] = bg_image[0] && bg_image
4829
+ end
4830
+ val
4831
+ end)[side]
4832
+ end
4833
+
4796
4834
  def get_icon_image_path node, type, resolve = true
4797
4835
  doc = node.document
4798
4836
  doc.remove_attr 'data-uri' if (data_uri_enabled = doc.attr? 'data-uri')
@@ -4816,18 +4854,17 @@ module Asciidoctor
4816
4854
  @float_box = { page: page_number, top: box_t, right: box_r, bottom: box_b, left: box_l, width: box_w, height: box_h, gap: gap }
4817
4855
  end
4818
4856
 
4819
- # NOTE: init_page is called within a float context; this will suppress prawn-svg messing with the cursor
4820
4857
  # NOTE: init_page is not called for imported pages, cover pages, image pages, and pages in the scratch document
4821
- def init_page *_args
4858
+ def init_page doc, _self
4822
4859
  next_page_side = page_side nil, @folio_placement[:inverted]
4823
- if @media == 'prepress' && (next_page_margin = @page_margin_by_side[page_number == 1 ? :cover : next_page_side]) != page_margin
4860
+ if @media == 'prepress' && (next_page_margin = page_number == 1 ? @page_margin[:cover] : @page_margin[page.layout][next_page_side]) != page_margin
4824
4861
  set_page_margin next_page_margin
4825
4862
  end
4826
4863
  unless @page_bg_color == 'FFFFFF'
4827
4864
  fill_absolute_bounds @page_bg_color
4828
4865
  tare = true
4829
4866
  end
4830
- if (bg_image_path, bg_image_opts = @page_bg_image[next_page_side])
4867
+ if (bg_image_path, bg_image_opts = get_page_bg_image doc, @theme, (layout = page.layout), next_page_side)
4831
4868
  begin
4832
4869
  if bg_image_opts[:format] == 'pdf'
4833
4870
  # NOTE: pages that use PDF for the background do not support a background color or running content
@@ -4838,9 +4875,10 @@ module Asciidoctor
4838
4875
  end
4839
4876
  tare = true
4840
4877
  rescue
4841
- facing_page_side = (PageSides - [next_page_side])[0]
4842
- @page_bg_image[facing_page_side] = nil if @page_bg_image[facing_page_side] == @page_bg_image[next_page_side]
4843
- @page_bg_image[next_page_side] = nil
4878
+ facing_page_side = PageSides[(PageSides.index next_page_side) - 1]
4879
+ bg_image_by_side = @page_bg_image[layout]
4880
+ bg_image_by_side[facing_page_side] = nil if bg_image_by_side[facing_page_side] == bg_image_by_side[next_page_side]
4881
+ bg_image_by_side[next_page_side] = nil
4844
4882
  log :warn, %(could not embed page background image: #{bg_image_path}; #{$!.message})
4845
4883
  end
4846
4884
  end
@@ -5011,7 +5049,9 @@ module Asciidoctor
5011
5049
  end
5012
5050
 
5013
5051
  def resolve_top val
5014
- if val.end_with? 'vh'
5052
+ if ::Numeric === val
5053
+ @y - val
5054
+ elsif val.end_with? 'vh'
5015
5055
  page_height * (1 - (val.to_f / 100))
5016
5056
  elsif val.end_with? '%'
5017
5057
  @y - effective_page_height * (val.to_f / 100)
@@ -5103,20 +5143,17 @@ module Asciidoctor
5103
5143
  @label = :scratch
5104
5144
  @save_state = nil
5105
5145
  @scratch_depth = 0
5106
- # NOTE: don't need background image in scratch document; can cause marshal error anyway
5107
- saved_page_bg_image, @page_bg_image = @page_bg_image, { verso: nil, recto: nil }
5108
5146
  # NOTE: pdfmark has a reference to the Asciidoctor::Document, which we don't want to serialize
5109
5147
  saved_pdfmark, @pdfmark = @pdfmark, nil
5110
5148
  # IMPORTANT: don't set font before using marshal as it causes serialization to fail
5111
5149
  result = yield
5112
5150
  @pdfmark = saved_pdfmark
5113
- @page_bg_image = saved_page_bg_image
5114
5151
  @label = :primary
5115
5152
  result
5116
5153
  end
5117
5154
 
5118
5155
  def init_scratch originator
5119
- if @media == 'prepress' && page_margin != (page_margin_recto = @page_margin_by_side[:recto])
5156
+ if @media == 'prepress' && page_margin != (page_margin_recto = @page_margin[page.layout][:recto])
5120
5157
  # NOTE: prepare scratch document to use page margin from recto side (which has same width as verso side)
5121
5158
  set_page_margin page_margin_recto
5122
5159
  end
@@ -23,4 +23,9 @@ class Asciidoctor::Document
23
23
  end
24
24
  nil
25
25
  end
26
+
27
+ # Internal: Returns whether the specified attribute has never been set and is not locked.
28
+ def attr_unspecified? name
29
+ !((attribute_locked? name) || (@attributes_modified.include? name))
30
+ end
26
31
  end
@@ -371,14 +371,16 @@ module Asciidoctor
371
371
  else
372
372
  super points.to_f
373
373
  end
374
- # NOTE: assume em value (since a font size of 1 is extremely unlikely)
375
- elsif points <= 1
376
- super @font_size * points
377
374
  else
378
375
  super points
379
376
  end
380
377
  end
381
378
 
379
+ def set_font font, size = nil
380
+ @font = font
381
+ font_size size if size
382
+ end
383
+
382
384
  def resolve_font_style styles
383
385
  if styles.include? :bold
384
386
  (styles.include? :italic) ? :bold_italic : :bold
@@ -1121,6 +1123,10 @@ module Asciidoctor
1121
1123
  # Note that if the block has content that itself requires a dry run, that nested dry run will
1122
1124
  # be performed in a separate scratch document.
1123
1125
  #
1126
+ # The block passed to dry run should take steps to avoid leaving the document state modified.
1127
+ # This can be done by calling `push_scratch doc` at the start of the block and `pop_scratch`
1128
+ # in the ensure clause of the block.
1129
+ #
1124
1130
  # options - A Hash of options that configure the dry run computation:
1125
1131
  # :keep_together - A Boolean indicating whether an attempt should be made to keep
1126
1132
  # the content on the same page (optional, default: false).
@@ -1133,7 +1139,7 @@ module Asciidoctor
1133
1139
  #
1134
1140
  # Returns an Extent or ScratchExtent object that describes the bounds of the content block.
1135
1141
  def dry_run keep_together: nil, pages_advanced: 0, single_page: nil, onto: nil, &block
1136
- (scratch_pdf = scratch).start_new_page layout: page.layout
1142
+ (scratch_pdf = scratch).start_new_page layout: page.layout, margin: page_margin
1137
1143
  saved_bounds = scratch_pdf.bounds
1138
1144
  scratch_pdf.bounds = bounds.dup.tap do |bounds_copy|
1139
1145
  bounds_copy.instance_variable_set :@document, scratch_pdf
@@ -7,6 +7,7 @@ module Prawn
7
7
  include ::Asciidoctor::Logging
8
8
 
9
9
  attr_accessor :align
10
+ attr_accessor :root_font_size
10
11
  attr_accessor :valign
11
12
 
12
13
  def initialize pdf, opts = {}
@@ -109,7 +110,7 @@ module Prawn
109
110
  prev_font_color, pdf.font_color = pdf.font_color, font_color if font_color
110
111
  font_family ||= font_info[:family]
111
112
  if font_size
112
- prev_font_scale, pdf.font_scale = pdf.font_scale, (font_size.to_f / @pdf.root_font_size)
113
+ prev_font_scale, pdf.font_scale = pdf.font_scale, (font_size.to_f / @root_font_size)
113
114
  else
114
115
  font_size = font_info[:size]
115
116
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Asciidoctor
4
4
  module PDF
5
- VERSION = '2.1.4'
5
+ VERSION = '2.2.0'
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.4
4
+ version: 2.2.0
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-26 00:00:00.000000000 Z
12
+ date: 2022-07-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: asciidoctor