asciidoctor-pdf 2.3.8 → 2.3.10

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: 5a1b77004c38f0efc5a577f0ab5222f42b66398f70d5347e333d906616734aeb
4
- data.tar.gz: 42ebc021e2b392e1b159ed0c473250b67d7e6c1f308dd7af282c61d6464538b5
3
+ metadata.gz: 53465d3756b672a087912f7052c98da2174506d348ae415702b6ad0923c35887
4
+ data.tar.gz: 81156616786953961b86a747720fdb1c92117a7645df0faba24b02e96bec4635
5
5
  SHA512:
6
- metadata.gz: '03019b94151e1fdfc90e3d4cfc2cd25b115f936300e4982a0b62903108ed54429dbaee451b0b6d86a6b10d51a7db6da87acd0f34065773c2438f32fd0fd1e899'
7
- data.tar.gz: f91b9506aa4242e9c253e0cbb5bce32666253a4af775891ab1378b5c3d48d390af45683f159fa9ce6cb26865da8f5f46320558e5929b57a41194958c83736eda
6
+ metadata.gz: 73d88491443fdafb5086bf4a122c3910631e547ef118b4ff4b23dffcbb315d7fb21a7335fc41db778b0d11bf5f851d3cae9df1b838fa342d3e5cf73cbe0f259d
7
+ data.tar.gz: cbd1fe371ed58d54c76770ef7abda45a080bb84dcbece1e5f60bda8a260668538ee5f71b92088b67ea71b9b29ed01cf6746fa9568a123366080a1e2fcdbb1c2e
data/CHANGELOG.adoc CHANGED
@@ -5,6 +5,31 @@
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.3.10 (2023-12-04) - @mojavelinux
9
+
10
+ Bug Fixes::
11
+
12
+ * show dot leaders in TOC entry if toclevels is increased for a given section (#2441)
13
+ * decouple tests from path of PWD (#2444)
14
+ * consider inherited styles when analyzing glyphs for fallback font support (#2463)
15
+ * add fallback character for placeholder character when using AFM font (#2453)
16
+ * don't advance image that's first child of block at top of page if image is taller than page (#2012)
17
+
18
+ === Details
19
+
20
+ {url-repo}/releases/tag/v2.3.10[git tag] | {url-repo}/compare/v2.3.9\...v2.3.10[full diff]
21
+
22
+ == 2.3.9 (2023-06-28) - @mojavelinux
23
+
24
+ Bug Fixes::
25
+
26
+ * correctly align block image in raster format in column when align is right or center and page columns are enabled (#2433)
27
+ * honor table caption end placement (`table-caption-end` theme key) when `unbreakable` (or `breakable`) option is set on table (#2434)
28
+
29
+ === Details
30
+
31
+ {url-repo}/releases/tag/v2.3.9[git tag] | {url-repo}/compare/v2.3.8\...v2.3.9[full diff]
32
+
8
33
  == 2.3.8 (2023-06-25) - @mojavelinux
9
34
 
10
35
  Improvements::
@@ -14,7 +39,7 @@ Improvements::
14
39
 
15
40
  Bug Fixes::
16
41
 
17
- * remove null character enclosed in XML tag when santizing text; fixes invisible text in outline when heading contains index term (#2430)
42
+ * remove null character enclosed in XML tag when sanitizing text; fixes invisible text in outline when heading contains index term (#2430)
18
43
  * alias `File.exists?` to `File.exist?` when loading RGhost optimizer to patch incompatibility when using Ruby 3.2
19
44
 
20
45
  Build / Infrastructure::
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.3.8, 2023-06-25
3
+ v2.3.10, 2023-12-04
4
4
  // Settings:
5
5
  :experimental:
6
6
  :idprefix:
@@ -377,7 +377,7 @@ module Asciidoctor
377
377
  if (rotated_page_margin = resolve_page_margin (doc.attr 'pdf-page-margin-rotated') || theme.page_margin_rotated)
378
378
  rotated_page_margin = expand_margin_value rotated_page_margin
379
379
  @edge_shorthand_cache = nil
380
- @page_margin[PageLayouts[(PageLayouts.index page.layout) - 1]] = { recto: rotated_page_margin, verso: rotated_page_margin.dup }
380
+ @page_margin[PageLayouts[(PageLayouts.index page.layout) - 1]] = { recto: rotated_page_margin, verso: (rotated_page_margin.drop 0) }
381
381
  end
382
382
  if @media == 'prepress'
383
383
  @ppbook = doc.doctype == 'book'
@@ -1048,7 +1048,7 @@ module Asciidoctor
1048
1048
  else
1049
1049
  highlighter = nil
1050
1050
  end
1051
- saved_subs = (subs = node.subs).dup
1051
+ saved_subs = (subs = node.subs).drop 0
1052
1052
  callouts_enabled = subs.include? :callouts
1053
1053
  highlight_idx = subs.index :highlight
1054
1054
  # NOTE: scratch? here only applies if listing block is nested inside another block
@@ -1069,9 +1069,9 @@ module Asciidoctor
1069
1069
  source_string = expand_tabs node.content
1070
1070
  else
1071
1071
  if callouts_enabled
1072
- saved_lines = node.lines.dup
1072
+ saved_lines = node.lines.drop 0
1073
1073
  subs.delete :callouts
1074
- prev_subs = subs.dup
1074
+ prev_subs = subs.drop 0
1075
1075
  subs.clear
1076
1076
  source_string, conum_mapping = extract_conums node.content
1077
1077
  node.lines.replace (source_string.split LF)
@@ -1421,7 +1421,7 @@ module Asciidoctor
1421
1421
  term_inline_format = (term_font_styles = font_styles).empty? ? true : [inherited: { styles: term_font_styles }]
1422
1422
  term_line_metrics = calc_line_metrics @base_line_height
1423
1423
  term_padding_no_blocks = [term_line_metrics.padding_top, 10, term_line_metrics.padding_bottom, 10]
1424
- (term_padding = term_padding_no_blocks.dup)[2] += @theme.prose_margin_bottom * 0.5
1424
+ (term_padding = (term_padding_no_blocks.drop 0))[2] += @theme.prose_margin_bottom * 0.5
1425
1425
  desc_padding = [0, 10, 0, 10]
1426
1426
  term_kerning = default_kerning?
1427
1427
  end
@@ -1802,7 +1802,7 @@ module Asciidoctor
1802
1802
  end
1803
1803
  # NOTE: shrink image so it fits within available space; group image & caption
1804
1804
  if (rendered_h = svg_size.output_height) > (available_h = cursor - caption_h)
1805
- unless pinned || at_page_top?
1805
+ unless pinned || at_page_top? || (node.first_child? && (node.parent.attr? 'pdf-at-top'))
1806
1806
  advance_page
1807
1807
  available_h = cursor - caption_h
1808
1808
  end
@@ -1844,7 +1844,7 @@ module Asciidoctor
1844
1844
  rendered_w, rendered_h = image_info.calc_image_dimensions width: (width || [available_w, actual_w].min)
1845
1845
  # NOTE: shrink image so it fits within available space; group image & caption
1846
1846
  if rendered_h > (available_h = cursor - caption_h)
1847
- unless pinned || at_page_top?
1847
+ unless pinned || at_page_top? || (node.first_child? && (node.parent.attr? 'pdf-at-top'))
1848
1848
  advance_page
1849
1849
  available_h = cursor - caption_h
1850
1850
  end
@@ -1856,9 +1856,16 @@ module Asciidoctor
1856
1856
  update_colors if graphic_state.color_space.empty?
1857
1857
  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?
1858
1858
  image_y = y
1859
- image_cursor = cursor
1859
+ left = bounds.left
1860
+ # NOTE: prawn does not compute :at for alignment correctly in column box, so resort to our own logic
1861
+ case alignment
1862
+ when :center
1863
+ left += (available_w - rendered_w) * 0.5
1864
+ when :right
1865
+ left += available_w - rendered_w
1866
+ end
1860
1867
  # NOTE: specify both width and height to avoid recalculation
1861
- embed_image image_obj, image_info, width: rendered_w, height: rendered_h, position: alignment
1868
+ embed_image image_obj, image_info, at: [left, (image_cursor = cursor)], height: rendered_h, width: rendered_w
1862
1869
  draw_image_border image_cursor, rendered_w, rendered_h, alignment unless pinned || (node.role? && (node.has_role? 'noborder'))
1863
1870
  if (link = node.attr 'link')
1864
1871
  add_link_to_image link, { width: rendered_w, height: rendered_h }, position: alignment, y: image_y
@@ -1974,6 +1981,7 @@ module Asciidoctor
1974
1981
  end
1975
1982
 
1976
1983
  def convert_table node
1984
+ caption_end = (theme = @theme).table_caption_end&.to_sym || :top
1977
1985
  if !at_page_top? && ((unbreakable = node.option? 'unbreakable') || ((node.option? 'breakable') && (node.id || node.title?)))
1978
1986
  # NOTE: we use the current node as the parent so we can navigate back into the document model
1979
1987
  (table_container = Block.new node, :open) << (table_dup = node.dup)
@@ -1985,7 +1993,7 @@ module Asciidoctor
1985
1993
  end
1986
1994
  table_container.style = 'table-container'
1987
1995
  table_container.id, table_dup.id = table_dup.id, nil
1988
- if table_dup.title?
1996
+ if caption_end == :top && table_dup.title?
1989
1997
  table_container.title = ''
1990
1998
  table_container.instance_variable_set :@converted_title, table_dup.captioned_title
1991
1999
  table_dup.title = nil
@@ -1997,7 +2005,6 @@ module Asciidoctor
1997
2005
  num_rows = node.attr 'rowcount'
1998
2006
  num_cols = node.columns.size
1999
2007
  table_header_size = false
2000
- theme = @theme
2001
2008
  prev_font_scale, @font_scale = @font_scale, 1 if node.document.nested?
2002
2009
 
2003
2010
  tbl_bg_color = resolve_theme_color :table_background_color
@@ -2023,15 +2030,15 @@ module Asciidoctor
2023
2030
  head_rows = node.rows[:head]
2024
2031
  body_rows = node.rows[:body]
2025
2032
  #if (hrows = node.attr 'hrows') && (shift_rows = hrows.to_i - head_rows.size) > 0
2026
- # head_rows = head_rows.dup
2027
- # body_rows = body_rows.dup
2033
+ # head_rows = head_rows.drop 0
2034
+ # body_rows = body_rows.drop 0
2028
2035
  # shift_rows.times { head_rows << body_rows.shift unless body_rows.empty? }
2029
2036
  #end
2030
2037
  theme_font :table_head do
2031
2038
  table_header_size = head_rows.size
2032
2039
  head_font_info = font_info
2033
2040
  head_line_metrics = calc_line_metrics theme.table_head_line_height || theme.table_cell_line_height || @base_line_height
2034
- head_cell_padding = ((head_cell_padding = theme.table_head_cell_padding) ? (expand_padding_value head_cell_padding) : body_cell_padding).dup
2041
+ head_cell_padding = (theme.table_head_cell_padding ? (expand_padding_value theme.table_head_cell_padding) : body_cell_padding).drop 0
2035
2042
  head_cell_padding[0] += head_line_metrics.padding_top
2036
2043
  head_cell_padding[2] += head_line_metrics.padding_bottom
2037
2044
  # QUESTION: why doesn't text transform inherit from table?
@@ -2142,7 +2149,7 @@ module Asciidoctor
2142
2149
  cell_data = { content: asciidoc_cell, source_location: cell.source_location }
2143
2150
  end
2144
2151
  if cell_line_metrics
2145
- cell_padding = body_cell_padding.dup
2152
+ cell_padding = body_cell_padding.drop 0
2146
2153
  cell_padding[0] += cell_line_metrics.padding_top
2147
2154
  cell_padding[2] += cell_line_metrics.padding_bottom
2148
2155
  cell_data[:leading] = cell_line_metrics.leading
@@ -2235,7 +2242,6 @@ module Asciidoctor
2235
2242
  alignment = theme.table_align&.to_sym || :left
2236
2243
  end
2237
2244
 
2238
- caption_end = theme.table_caption_end&.to_sym || :top
2239
2245
  caption_max_width = theme.table_caption_max_width || 'fit-content'
2240
2246
 
2241
2247
  table_settings = {
@@ -2267,7 +2273,7 @@ module Asciidoctor
2267
2273
  @column_widths = column_widths unless column_widths.empty?
2268
2274
  # NOTE: call width to capture resolved table width
2269
2275
  table_width = width
2270
- @pdf.ink_table_caption node, alignment, table_width, caption_max_width if node.title? && caption_end == :top
2276
+ @pdf.ink_table_caption node, alignment, table_width, caption_max_width if caption_end == :top && node.title?
2271
2277
  # NOTE: align using padding instead of bounding_box as prawn-table does
2272
2278
  # using a bounding_box across pages mangles the margin box of subsequent pages
2273
2279
  if alignment != :left && table_width != (this_bounds = @pdf.bounds).width
@@ -2340,7 +2346,7 @@ module Asciidoctor
2340
2346
  bounds.subtract_left_padding left_padding
2341
2347
  bounds.subtract_right_padding right_padding if right_padding
2342
2348
  end
2343
- ink_table_caption node, alignment, table_width, caption_max_width, caption_end if node.title? && caption_end == :bottom
2349
+ ink_table_caption node, alignment, table_width, caption_max_width, caption_end if caption_end == :bottom && node.title?
2344
2350
  theme_margin :block, :bottom, (next_enclosed_block node)
2345
2351
  rescue ::Prawn::Errors::CannotFit
2346
2352
  log :error, (message_with_context 'cannot fit contents of table cell into specified column width', source_location: node.source_location)
@@ -3855,7 +3861,7 @@ module Asciidoctor
3855
3861
  font_style: dot_leader_font_style,
3856
3862
  font_size: font_size,
3857
3863
  levels: ((dot_leader_l = @theme.toc_dot_leader_levels) == 'none' ? ::Set.new :
3858
- (dot_leader_l && dot_leader_l != 'all' ? dot_leader_l.to_s.split.map(&:to_i).to_set : (0..num_levels).to_set)),
3864
+ (dot_leader_l && dot_leader_l != 'all' ? dot_leader_l.to_s.split.map(&:to_i).to_set : nil)),
3859
3865
  text: (dot_leader_text = @theme.toc_dot_leader_content || DotLeaderTextDefault),
3860
3866
  width: dot_leader_text.empty? ? 0 : (rendered_width_of_string dot_leader_text),
3861
3867
  # TODO: spacer gives a little bit of room between dots and page number
@@ -3929,7 +3935,7 @@ module Asciidoctor
3929
3935
  end_cursor = cursor
3930
3936
  move_cursor_to start_cursor
3931
3937
  # NOTE: we're guaranteed to be on the same page as the final line of the entry
3932
- if dot_leader[:width] > 0 && (dot_leader[:levels].include? entry_level.pred)
3938
+ if dot_leader[:width] > 0 && (dot_leader[:levels] ? (dot_leader[:levels].include? entry_level.pred) : true)
3933
3939
  pgnum_label_width = rendered_width_of_string pgnum_label
3934
3940
  pgnum_label_font_settings = { color: @font_color, font: font_family, size: @font_size, styles: font_styles }
3935
3941
  save_font do
@@ -4903,7 +4909,7 @@ module Asciidoctor
4903
4909
  end
4904
4910
 
4905
4911
  def init_float_box _node, block_width, block_height, float_to
4906
- gap = ::Array === (gap = @theme.image_float_gap) ? gap.dup : [gap, gap]
4912
+ gap = ::Array === (gap = @theme.image_float_gap) ? (gap.drop 0) : [gap, gap]
4907
4913
  float_w = block_width + (gap[0] ||= 12)
4908
4914
  float_h = block_height + (gap[1] ||= 6)
4909
4915
  box_l = bounds.left + (float_to == 'right' ? 0 : float_w)
@@ -13,6 +13,10 @@ Asciidoctor::AbstractBlock.prepend (Module.new do
13
13
  blocks[-1]
14
14
  end
15
15
 
16
+ def first_child?
17
+ self == parent.blocks[0]
18
+ end
19
+
16
20
  def last_child?
17
21
  self == parent.blocks[-1]
18
22
  end
@@ -9,6 +9,6 @@ File.singleton_class.prepend (Module.new do
9
9
 
10
10
  # NOTE: JRuby < 9.4 doesn't implement this method; JRuby 9.4 implements it incorrectly
11
11
  def absolute_path? path
12
- (::Pathname.new path).absolute? && !(%r/\A[[:alpha:]][[:alnum:]\-+]*:\/\/\S/.match? path)
12
+ (Pathname.new path).absolute? && !(%r/\A[[:alpha:]][[:alnum:]\-+]*:\/\/\S/.match? path)
13
13
  end
14
14
  end) if RUBY_ENGINE == 'jruby'
@@ -4,7 +4,7 @@ Prawn::Font::AFM.instance_variable_set :@hide_m17n_warning, true
4
4
 
5
5
  require 'prawn/icon'
6
6
 
7
- Prawn::Icon::Compatibility.prepend (::Module.new { def warning *_args; end })
7
+ Prawn::Icon::Compatibility.prepend (Module.new { def warning *_args; end })
8
8
 
9
9
  module Asciidoctor
10
10
  module Prawn
@@ -1002,9 +1002,16 @@ module Asciidoctor
1002
1002
  # start_new_page. Using start_new_page can mangle the calculation of content block's extent.
1003
1003
  #
1004
1004
  def arrange_block node, &block
1005
- keep_together = (node.option? 'unbreakable') && !at_page_top?
1005
+ if at_page_top?
1006
+ at_top = true
1007
+ else
1008
+ at_top = true if node.first_child? && (node.parent.attr? 'pdf-at-top')
1009
+ keep_together = true if node.option? 'unbreakable'
1010
+ end
1011
+ node.set_attr 'pdf-at-top', '' if at_top
1006
1012
  doc = node.document
1007
1013
  block_for_scratch = proc do
1014
+ at_top = node.set_attr 'pdf-at-top', '' if !at_top && at_page_top?
1008
1015
  push_scratch doc
1009
1016
  instance_exec(&block)
1010
1017
  ensure
@@ -1012,6 +1019,8 @@ module Asciidoctor
1012
1019
  end
1013
1020
  extent = dry_run keep_together: keep_together, onto: [self, keep_together], &block_for_scratch
1014
1021
  scratch? ? block_for_scratch.call : (yield extent)
1022
+ ensure
1023
+ node.remove_attr 'pdf-at-top' if at_top
1015
1024
  end
1016
1025
 
1017
1026
  # This method installs an on_page_create_callback that stops processing if the first page is
@@ -7,6 +7,7 @@ class Prawn::Font::AFM
7
7
  ?\u200b => '',
8
8
  ?\u202f => ?\u00a0,
9
9
  ?\u2009 => ' ',
10
+ ?\u2063 => ?\u00ad,
10
11
  ?\u25e6 => '-',
11
12
  ?\u25aa => ?\u00b7,
12
13
  }
@@ -32,21 +32,26 @@ Prawn::Text::Formatted::Box.prepend (Module.new do
32
32
  end
33
33
  end
34
34
 
35
- # TODO: remove when upgrading to prawn-2.5.0
35
+ # help Prawn correctly resolve which font to analyze, including the font style
36
36
  def analyze_glyphs_for_fallback_font_support fragment_hash
37
37
  fragment_font = fragment_hash[:font] || (original_font = @document.font.family)
38
+ effective_font_styles = @document.font_styles
39
+ fragment_font_opts = {}
38
40
  if (fragment_font_styles = fragment_hash[:styles])
39
- if fragment_font_styles.include? :bold
40
- fragment_font_opts = { style: (fragment_font_styles.include? :italic) ? :bold_italic : :bold }
41
- elsif fragment_font_styles.include? :italic
42
- fragment_font_opts = { style: :italic }
41
+ effective_font_styles.merge fragment_font_styles
42
+ if effective_font_styles.include? :bold
43
+ fragment_font_opts[:style] = (effective_font_styles.include? :italic) ? :bold_italic : :bold
44
+ elsif effective_font_styles.include? :italic
45
+ fragment_font_opts[:style] = :italic
43
46
  end
47
+ elsif !effective_font_styles.empty?
48
+ fragment_font_opts[:style] = @document.resolve_font_style effective_font_styles
44
49
  end
45
- fallback_fonts = @fallback_fonts.dup
50
+ fallback_fonts = @fallback_fonts.drop 0
46
51
  font_glyph_pairs = []
47
52
  @document.save_font do
48
53
  fragment_hash[:text].each_char do |char|
49
- font_glyph_pairs << [(find_font_for_this_glyph char, fragment_font, fragment_font_opts || {}, fallback_fonts.dup), char]
54
+ font_glyph_pairs << [(find_font_for_this_glyph char, fragment_font, fragment_font_opts, (fallback_fonts.drop 0)), char]
50
55
  end
51
56
  end
52
57
  # NOTE: don't add a :font to fragment if it wasn't there originally
@@ -61,7 +66,7 @@ Prawn::Text::Formatted::Box.prepend (Module.new do
61
66
  current_font
62
67
  elsif fallback_fonts_to_check.empty?
63
68
  if logger.info? && !doc.scratch?
64
- fonts_checked = @fallback_fonts.dup.unshift original_font
69
+ fonts_checked = [original_font].concat @fallback_fonts
65
70
  missing_chars = (doc.instance_variable_defined? :@missing_chars) ?
66
71
  (doc.instance_variable_get :@missing_chars) : (doc.instance_variable_set :@missing_chars, {})
67
72
  previous_fonts_checked = (missing_chars[char] ||= [])
@@ -3,7 +3,7 @@
3
3
  Prawn::SVG::Elements::Image.prepend (Module.new do
4
4
  def image_dimensions data
5
5
  unless (handler = find_image_handler data)
6
- raise ::Prawn::SVG::Elements::Base::SkipElementError, 'Unsupported image type supplied to image tag'
6
+ raise Prawn::SVG::Elements::Base::SkipElementError, 'Unsupported image type supplied to image tag'
7
7
  end
8
8
  image = handler.new data
9
9
  [image.width.to_f, image.height.to_f]
@@ -136,7 +136,7 @@ module Rouge
136
136
  fragment[:color] = fg
137
137
  end
138
138
  if style_rules[:bold]
139
- fragment[:styles] = style_rules[:italic] ? BoldItalicStyle.dup : BoldStyle.dup
139
+ fragment[:styles] = (style_rules[:italic] ? BoldItalicStyle : BoldStyle).dup
140
140
  elsif style_rules[:italic]
141
141
  fragment[:styles] = ItalicStyle.dup
142
142
  end
@@ -379,7 +379,7 @@ module Asciidoctor
379
379
  if fragment
380
380
  fragment = fragment.dup
381
381
  fragment[:styles] = fragment[:styles].dup if fragment.key? :styles
382
- fragment[:callback] = fragment[:callback].dup if fragment.key? :callback
382
+ fragment[:callback] = fragment[:callback].drop 0 if fragment.key? :callback
383
383
  else
384
384
  fragment = {}
385
385
  end
@@ -11,7 +11,7 @@ File.singleton_class.alias_method :exists?, :exist? unless File.respond_to? :exi
11
11
 
12
12
  RGhost::GSAlone.prepend (Module.new do
13
13
  def initialize params, debug
14
- (@params = params.dup).push(*(@params.pop.split File::PATH_SEPARATOR))
14
+ (@params = params.drop 0).push(*(@params.pop.split File::PATH_SEPARATOR))
15
15
  @debug = debug
16
16
  end
17
17
 
@@ -22,7 +22,7 @@ module Asciidoctor
22
22
  LoneVariableRx = /^\$([a-z0-9_-]+)$/
23
23
  HexColorEntryRx = /^(?<k> *\p{Graph}+): +(?!null$)(?<q>["']?)(?<h>#)?(?<v>\h\h\h\h{0,3})\k<q> *(?:#.*)?$/
24
24
  MultiplyDivideOpRx = %r((-?\d+(?:\.\d+)?) +([*/^]) +(-?\d+(?:\.\d+)?))
25
- AddSubtractOpRx = /(-?\d+(?:\.\d+)?) +([+\-]) +(-?\d+(?:\.\d+)?)/
25
+ AddSubtractOpRx = /(-?\d+(?:\.\d+)?) +([+-]) +(-?\d+(?:\.\d+)?)/
26
26
  PrecisionFuncRx = /^(round|floor|ceil)\(/
27
27
  RoleAlignKeyRx = /(?:_text)?_align$/
28
28
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Asciidoctor
4
4
  module PDF
5
- VERSION = '2.3.8'
5
+ VERSION = '2.3.10'
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.3.8
4
+ version: 2.3.10
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: 2023-06-25 00:00:00.000000000 Z
12
+ date: 2023-12-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: asciidoctor