asciidoctor-pdf 2.1.3 → 2.1.6

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: f7753392586bac4a044601fefa9ecb58745e02fc37434dd5a26e020692890e65
4
- data.tar.gz: 301fe3fef546588aacba4ca8d9c5afd91d4a19a816f07a8fcc66121c8f58f626
3
+ metadata.gz: 626c05cc96837efcf9f6fd0b96f0f31e8791188f27db387609a6a2d6a1345e94
4
+ data.tar.gz: 311afcb050d8063c6878166b8ce89e2e7bd1986af9b212ee9ee9202d87ba3a53
5
5
  SHA512:
6
- metadata.gz: b26fe1f74b22bd73eba166190d21afebafdc1630dba5fee8174aa946b463d81b7e620cb8f400e803507f050c6dd48a1d732a1273a78fc1cd0e958da69a0a3c9c
7
- data.tar.gz: 15cd75342088585a51f19cb342a8023fbc2aa6d0cd89fff72385370172059ac10c98fa51b8126845ce40436fcd89dc0c1f47aa763df14dad24ba2bcd95f92205
6
+ metadata.gz: a82a51068e74bf9ea3bdb89c11a8075a27e58c49fdc84bfdce9066030e7f6688a99a6956bbbd8a1739aa5d2de3eaf5943a9e6ec234ecfce0bc5bc938d0ffc91a
7
+ data.tar.gz: bad6ea4168ef017bec92534f657ec54208851cb224ae2c4e2c37fe329946192bab9d0e5519c8d2d19cf3c1184185664402523fe7175b4fb496465a3ebed41b01
data/CHANGELOG.adoc CHANGED
@@ -5,6 +5,43 @@
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.6 (2022-07-19) - @mojavelinux
9
+
10
+ Bug Fixes::
11
+
12
+ * resolve font size for monospaced cell when font size value on `codespan` key in theme is relative (#2281)
13
+
14
+ === Details
15
+
16
+ {url-repo}/releases/tag/v2.1.6[git tag] | {url-repo}/compare/v2.1.5\...v2.1.6[full diff]
17
+
18
+ == 2.1.5 (2022-07-10) - @mojavelinux
19
+
20
+ Bug Fixes::
21
+
22
+ * fix position of background color on caption with outside margin (#2271)
23
+ * don't allow font scale to compound when entering nested table (#2276)
24
+
25
+ === Details
26
+
27
+ {url-repo}/releases/tag/v2.1.5[git tag] | {url-repo}/compare/v2.1.4\...v2.1.5[full diff]
28
+
29
+ == 2.1.4 (2022-06-26) - @mojavelinux
30
+
31
+ Improvements::
32
+
33
+ * include source location in warning message for truncated table cell if sourcemap is enabled (#2261)
34
+
35
+ Bug Fixes::
36
+
37
+ * allow alt text for block image, video, and audio to wrap to next line on same page (#2258)
38
+ * apply `text-transform` from custom role on phrase after attributes have been resolved (#2263)
39
+ * make URL check more strict so image target containing a colon is not mistaken as a URL
40
+
41
+ === Details
42
+
43
+ {url-repo}/releases/tag/v2.1.4[git tag] | {url-repo}/compare/v2.1.3\...v2.1.4[full diff]
44
+
8
45
  == 2.1.3 (2022-06-23) - @mojavelinux
9
46
 
10
47
  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.3, 2022-06-23
3
+ v2.1.6, 2022-07-19
4
4
  // Settings:
5
5
  :experimental:
6
6
  :idprefix:
data/bin/asciidoctor-pdf CHANGED
@@ -1,7 +1,7 @@
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'
@@ -10,14 +10,14 @@ require 'asciidoctor/cli'
10
10
 
11
11
  options = Asciidoctor::Cli::Options.new backend: 'pdf', header_footer: true
12
12
 
13
- # FIXME provide an API in Asciidoctor for sub-components to print version information
13
+ # FIXME: provide an API in Asciidoctor for sub-components to print version information
14
14
  unless ARGV != ['-v'] && (ARGV & ['-V', '--version']).empty?
15
15
  $stdout.write %(Asciidoctor PDF #{Asciidoctor::PDF::VERSION} using )
16
16
  options.print_version
17
17
  exit 0
18
18
  end
19
19
 
20
- # FIXME This is a really bizarre API. Please make me simpler.
20
+ # FIXME: This is a really bizarre API. Please make me simpler.
21
21
  case (result = options.parse! ARGV)
22
22
  when Integer
23
23
  exit result
@@ -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
@@ -114,6 +112,7 @@ module Asciidoctor
114
112
  UriBreakCharsRx = %r((?:/|\?|&amp;|#)(?!$))
115
113
  UriBreakCharRepl = %(\\&#{ZeroWidthSpace})
116
114
  UriSchemeBoundaryRx = %r((?<=://))
115
+ UrlSniffRx = %r(^\p{Alpha}[\p{Alnum}+.-]*://)
117
116
  LineScanRx = /\n|.+/
118
117
  BlankLineRx = /\n{2,}/
119
118
  CjkLineBreakRx = /(?=[\u3000\u30a0-\u30ff\u3040-\u309f\p{Han}\uff00-\uffef])/
@@ -1886,7 +1885,7 @@ module Asciidoctor
1886
1885
  add_dest_for_block node if node.id
1887
1886
  audio_path = node.media_uri node.attr 'target'
1888
1887
  play_symbol = (node.document.attr? 'icons', 'font') ? %(<font name="fas">#{(icon_font_data 'fas').unicode 'play'}</font>) : RightPointer
1889
- ink_prose %(#{play_symbol}#{NoBreakSpace}<a href="#{audio_path}">#{audio_path}</a> <em>(audio)</em>), normalize: false, margin: 0, single_line: true
1888
+ ink_prose %(#{play_symbol}#{NoBreakSpace}<a href="#{audio_path}">#{audio_path}</a> <em>(audio)</em>), normalize: false, margin: 0
1890
1889
  ink_caption node, labeled: false, end: :bottom if node.title?
1891
1890
  theme_margin :block, :bottom, (next_enclosed_block node)
1892
1891
  end
@@ -1914,7 +1913,7 @@ module Asciidoctor
1914
1913
  if poster.nil_or_empty?
1915
1914
  add_dest_for_block node if node.id
1916
1915
  play_symbol = (node.document.attr? 'icons', 'font') ? %(<font name="fas">#{(icon_font_data 'fas').unicode 'play'}</font>) : RightPointer
1917
- ink_prose %(#{play_symbol}#{NoBreakSpace}<a href="#{video_path}">#{video_path}</a> <em>(#{type})</em>), normalize: false, margin: 0, single_line: true
1916
+ ink_prose %(#{play_symbol}#{NoBreakSpace}<a href="#{video_path}">#{video_path}</a> <em>(#{type})</em>), normalize: false, margin: 0
1918
1917
  ink_caption node, labeled: false, end: :bottom if node.title?
1919
1918
  theme_margin :block, :bottom, (next_enclosed_block node)
1920
1919
  else
@@ -1995,6 +1994,7 @@ module Asciidoctor
1995
1994
  num_cols = node.columns.size
1996
1995
  table_header_size = false
1997
1996
  theme = @theme
1997
+ prev_font_scale, @font_scale = @font_scale, 1 if node.document.nested?
1998
1998
 
1999
1999
  tbl_bg_color = resolve_theme_color :table_background_color
2000
2000
  # QUESTION: should we fallback to page background color? (which is never transparent)
@@ -2053,7 +2053,8 @@ module Asciidoctor
2053
2053
  content: cell_text,
2054
2054
  colspan: cell.colspan || 1,
2055
2055
  align: (cell.attr 'halign').to_sym,
2056
- valign: (val = cell.attr 'valign') == 'middle' ? :center : val.to_sym
2056
+ valign: (val = cell.attr 'valign') == 'middle' ? :center : val.to_sym,
2057
+ source_location: cell.source_location
2057
2058
  end)
2058
2059
  end
2059
2060
  end unless head_rows.empty?
@@ -2072,7 +2073,8 @@ module Asciidoctor
2072
2073
  colspan: cell.colspan || 1,
2073
2074
  rowspan: cell.rowspan || 1,
2074
2075
  align: (cell.attr 'halign').to_sym,
2075
- valign: (val = cell.attr 'valign') == 'middle' ? :center : val.to_sym
2076
+ valign: (val = cell.attr 'valign') == 'middle' ? :center : val.to_sym,
2077
+ source_location: cell.source_location
2076
2078
  cell_line_metrics = body_cell_line_metrics
2077
2079
  case cell.style
2078
2080
  when :emphasis
@@ -2102,10 +2104,15 @@ module Asciidoctor
2102
2104
  when :monospaced
2103
2105
  cell_data.delete :font_style
2104
2106
  cell_line_height = @base_line_height
2107
+ current_font_size = @font_size
2105
2108
  theme_font :codespan do
2106
2109
  mono_cell_font_info = font_info
2107
2110
  cell_data[:font] = mono_cell_font_info[:family]
2108
- cell_data[:size] = mono_cell_font_info[:size]
2111
+ if ::String === @font_size || @font_size < 1
2112
+ @font_size = current_font_size
2113
+ font_size mono_cell_font_info[:size]
2114
+ end
2115
+ cell_data[:size] = @font_size
2109
2116
  cell_data[:text_color] = @font_color
2110
2117
  cell_line_metrics = calc_line_metrics cell_line_height
2111
2118
  end
@@ -2132,8 +2139,8 @@ module Asciidoctor
2132
2139
  end
2133
2140
  # NOTE: line metrics get applied when AsciiDoc content is converted
2134
2141
  cell_line_metrics = nil
2135
- asciidoc_cell = ::Prawn::Table::Cell::AsciiDoc.new self, (cell_data.merge content: cell.inner_document, padding: body_cell_padding)
2136
- cell_data = { content: asciidoc_cell }
2142
+ 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)
2143
+ cell_data = { content: asciidoc_cell, source_location: cell.source_location }
2137
2144
  end
2138
2145
  if cell_line_metrics
2139
2146
  cell_padding = body_cell_padding.dup
@@ -2336,6 +2343,8 @@ module Asciidoctor
2336
2343
  theme_margin :block, :bottom, (next_enclosed_block node)
2337
2344
  rescue ::Prawn::Errors::CannotFit
2338
2345
  log :error, (message_with_context 'cannot fit contents of table cell into specified column width', source_location: node.source_location)
2346
+ ensure
2347
+ @font_scale = prev_font_scale if prev_font_scale
2339
2348
  end
2340
2349
 
2341
2350
  def convert_thematic_break node
@@ -2685,13 +2694,7 @@ module Asciidoctor
2685
2694
  end
2686
2695
 
2687
2696
  if (roles = node.role)
2688
- theme = load_theme node.document
2689
- roles.split.each do |role|
2690
- if (text_transform = theme[%(role_#{role}_text_transform)])
2691
- inner_text = transform_text inner_text, text_transform
2692
- end
2693
- inner_text = inner_text.gsub DoubleSpaceRx, ' ' + ZeroWidthSpace if role == 'pre-wrap' && (inner_text.include? DoubleSpace)
2694
- end
2697
+ inner_text = inner_text.gsub DoubleSpaceRx, ' ' + ZeroWidthSpace if (node.has_role? 'pre-wrap') && (inner_text.include? DoubleSpace)
2695
2698
  quoted_text = is_tag ? %(#{open.chop} class="#{roles}">#{inner_text}#{close}) : %(<span class="#{roles}">#{open}#{inner_text}#{close}</span>)
2696
2699
  else
2697
2700
  quoted_text = %(#{open}#{inner_text}#{close})
@@ -3106,7 +3109,8 @@ module Asciidoctor
3106
3109
  end
3107
3110
  unless scratch? || !(bg_color = @theme[%(#{category_caption}_background_color)] || @theme.caption_background_color)
3108
3111
  caption_height = height_of_typeset_text string
3109
- fill_at = [bounds.left, cursor + (margin[:top] || 0)]
3112
+ fill_at = [bounds.left, cursor]
3113
+ fill_at[1] -= (margin[:top] || 0) unless at_page_top?
3110
3114
  float { bounding_box(fill_at, width: container_width, height: caption_height) { fill_bounds bg_color } }
3111
3115
  end
3112
3116
  indent(*indent_by) do
@@ -3241,7 +3245,8 @@ module Asciidoctor
3241
3245
  end
3242
3246
  end
3243
3247
 
3244
- # NOTE: inline_format is true by default
3248
+ # NOTE: inline_format option is true by default
3249
+ # NOTE: single_line option is not compatible with this method
3245
3250
  def ink_prose string, opts = {}
3246
3251
  top_margin = (margin = (opts.delete :margin)) || (opts.delete :margin_top) || 0
3247
3252
  bot_margin = margin || (opts.delete :margin_bottom) || @theme.prose_margin_bottom
@@ -4255,10 +4260,10 @@ module Asciidoctor
4255
4260
  # NOTE: this will catch a classloader resource path on JRuby (e.g., uri:classloader:/path/to/image)
4256
4261
  elsif ::File.absolute_path? image_path
4257
4262
  ::File.absolute_path image_path
4258
- elsif !(is_uri = node.is_uri? image_path) && imagesdir && (::File.absolute_path? imagesdir)
4263
+ elsif !(is_url = url? image_path) && imagesdir && (::File.absolute_path? imagesdir)
4259
4264
  ::File.absolute_path image_path, imagesdir
4260
4265
  # handle case when image is a URI
4261
- elsif is_uri || (imagesdir && (node.is_uri? imagesdir) && (image_path = node.normalize_web_path image_path, imagesdir, false))
4266
+ elsif is_url || (imagesdir && (url? imagesdir) && (image_path = node.normalize_web_path image_path, imagesdir, false))
4262
4267
  if !allow_uri_read
4263
4268
  log :warn, %(cannot embed remote image: #{image_path} (allow-uri-read attribute not enabled))
4264
4269
  return
@@ -4496,6 +4501,7 @@ module Asciidoctor
4496
4501
  end
4497
4502
 
4498
4503
  # TODO: document me, esp the first line formatting functionality
4504
+ # NOTE: single_line option should only be used if height option is specified
4499
4505
  def typeset_text string, line_metrics, opts = {}
4500
4506
  opts = { leading: line_metrics.leading, final_gap: line_metrics.final_gap }.merge opts
4501
4507
  string = string.gsub CjkLineBreakRx, ZeroWidthSpace if @cjk_line_breaks
@@ -4950,7 +4956,7 @@ module Asciidoctor
4950
4956
  alt_text_vars[:'/link'] = ''
4951
4957
  end
4952
4958
  theme_font :image_alt do
4953
- ink_prose alt_text_template % alt_text_vars, align: opts[:align], margin: 0, normalize: false, single_line: true
4959
+ ink_prose alt_text_template % alt_text_vars, align: opts[:align], margin: 0, normalize: false
4954
4960
  end
4955
4961
  ink_caption node, category: :image, end: :bottom if node.title?
4956
4962
  theme_margin :block, :bottom, (next_enclosed_block node) unless opts[:pinned]
@@ -5045,6 +5051,10 @@ module Asciidoctor
5045
5051
  false
5046
5052
  end
5047
5053
 
5054
+ def url? str
5055
+ (str.include? ':/') && (UrlSniffRx.match? str)
5056
+ end
5057
+
5048
5058
  # Calculate the width that is needed to print all the
5049
5059
  # fragments without wrapping any lines.
5050
5060
  #
@@ -528,29 +528,6 @@ module Asciidoctor
528
528
  end
529
529
  end
530
530
 
531
- # Apply the text transform to the specified text.
532
- #
533
- # Supported transform values are "uppercase", "lowercase", or "none" (passed
534
- # as either a String or a Symbol). When the uppercase transform is applied to
535
- # the text, it correctly uppercases visible text while leaving markup and
536
- # named character entities unchanged. The none transform returns the text
537
- # unmodified.
538
- #
539
- def transform_text text, transform
540
- case transform
541
- when :uppercase, 'uppercase'
542
- uppercase_pcdata text
543
- when :lowercase, 'lowercase'
544
- lowercase_pcdata text
545
- when :capitalize, 'capitalize'
546
- capitalize_words_pcdata text
547
- when :smallcaps, 'smallcaps'
548
- smallcaps_pcdata text
549
- else
550
- text
551
- end
552
- end
553
-
554
531
  def hyphenate_text text, hyphenator
555
532
  hyphenate_words_pcdata text, hyphenator
556
533
  end
@@ -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 = {}
@@ -91,7 +92,9 @@ module Prawn
91
92
  # TODO: apply horizontal alignment; currently it is necessary to specify alignment on content blocks
92
93
  apply_font_properties { pdf.traverse content }
93
94
  if (extra_pages = pdf.page_number - start_page) > 0
94
- logger.error %(the table cell on page #{start_page} has been truncated; Asciidoctor PDF does not support table cell content that exceeds the height of a single page) unless extra_pages == 1 && pdf.page.empty?
95
+ unless extra_pages == 1 && pdf.page.empty?
96
+ logger.error message_with_context %(the table cell on page #{start_page} has been truncated; Asciidoctor PDF does not support table cell content that exceeds the height of a single page), source_location: @source_location
97
+ end
95
98
  extra_pages.times { pdf.delete_current_page }
96
99
  end
97
100
  nil
@@ -107,7 +110,7 @@ module Prawn
107
110
  prev_font_color, pdf.font_color = pdf.font_color, font_color if font_color
108
111
  font_family ||= font_info[:family]
109
112
  if font_size
110
- 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)
111
114
  else
112
115
  font_size = font_info[:size]
113
116
  end
@@ -16,7 +16,9 @@ class Prawn::Table::Cell::Text
16
16
  height: spanned_content_height + FPTolerance,
17
17
  at: [0, @pdf.cursor]).render
18
18
  end
19
- logger.error %(the table cell on page #{@pdf.page_number} has been truncated; Asciidoctor PDF does not support table cell content that exceeds the height of a single page) unless remaining_text.empty? || @pdf.scratch?
19
+ unless remaining_text.empty? || @pdf.scratch?
20
+ logger.error message_with_context %(the table cell on page #{@pdf.page_number} has been truncated; Asciidoctor PDF does not support table cell content that exceeds the height of a single page), source_location: @source_location
21
+ end
20
22
  end
21
23
  end
22
24
 
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Prawn::Table::Cell.prepend (Module.new do
4
+ attr_writer :source_location
5
+
4
6
  def border_color= color
5
7
  color = [color, color] if Asciidoctor::PDF::ThemeLoader::CMYKColorValue === color
6
8
  super
@@ -4,6 +4,8 @@ module Asciidoctor
4
4
  module PDF
5
5
  module FormattedText
6
6
  class Transform
7
+ include TextTransformer
8
+
7
9
  LF = ?\n
8
10
  ZeroWidthSpace = ?\u200b
9
11
  CharEntityTable = { amp: '&', apos: ?', gt: '>', lt: '<', nbsp: ?\u00a0, quot: '"' }
@@ -21,8 +23,8 @@ module Asciidoctor
21
23
  'font_size' => :size,
22
24
  'text_decoration_color' => :text_decoration_color,
23
25
  'text_decoration_width' => :text_decoration_width,
26
+ 'text_transform' => :text_transform,
24
27
  }
25
- #DummyText = ?\u0000
26
28
 
27
29
  def initialize options = {}
28
30
  @merge_adjacent_text_nodes = options[:merge_adjacent_text_nodes]
@@ -172,6 +174,11 @@ module Asciidoctor
172
174
  previous_fragment_is_text && ((previous_fragment_text = fragments[-1][:text]).end_with? ' ')
173
175
  fragments[-1][:text] = previous_fragment_text.chop
174
176
  end
177
+ if (text_transform = fragment.delete :text_transform)
178
+ text = (text_chunks = extract_text pcdata).join
179
+ text_io = StringIO.new transform_text text, text_transform
180
+ restore_text pcdata, text_chunks.each_with_object([]) {|chunk, accum| accum << (text_io.read chunk.length) }
181
+ end
175
182
  # NOTE: decorate child fragments with inherited properties from this element
176
183
  apply pcdata, fragments, fragment
177
184
  previous_fragment_is_text = false
@@ -251,6 +258,8 @@ module Asciidoctor
251
258
  fragments
252
259
  end
253
260
 
261
+ private
262
+
254
263
  def build_fragment fragment, tag_name, attrs
255
264
  styles = (fragment[:styles] ||= ::Set.new)
256
265
  case tag_name
@@ -324,7 +333,6 @@ module Asciidoctor
324
333
  # NOTE: spaces in style value are superfluous for our purpose; split drops record after trailing ;
325
334
  attrs[:style].tr(' ', '').split(';').each do |style|
326
335
  pname, pvalue = style.split ':', 2
327
- # TODO: text-transform
328
336
  case pname
329
337
  when 'color' # color needed to support syntax highlighters
330
338
  fragment[:color] = pvalue.length == 7 ? (pvalue.slice 1, 6) : (pvalue.slice 1, 3).each_char.map {|c| c * 2 }.join if (pvalue.start_with? '#') && (HexColorRx.match? pvalue)
@@ -409,6 +417,29 @@ module Asciidoctor
409
417
  end
410
418
  end
411
419
  end
420
+
421
+ def extract_text pcdata
422
+ pcdata.reduce [] do |accum, it|
423
+ case it[:type]
424
+ when :text
425
+ accum << it[:value]
426
+ when :element
427
+ accum += (extract_text it[:pcdata]) if it.key? :pcdata
428
+ end
429
+ accum
430
+ end
431
+ end
432
+
433
+ def restore_text pcdata, text_chunks
434
+ pcdata.each do |it|
435
+ case it[:type]
436
+ when :text
437
+ it[:value] = text_chunks.shift
438
+ when :element
439
+ restore_text it[:pcdata], text_chunks if it.key? :pcdata
440
+ end
441
+ end
442
+ end
412
443
  end
413
444
  end
414
445
  end
@@ -3,7 +3,7 @@
3
3
  module Asciidoctor
4
4
  module PDF
5
5
  class IndexCatalog
6
- include ::Asciidoctor::PDF::TextTransformer
6
+ include TextTransformer
7
7
 
8
8
  LeadingAlphaRx = /^\p{Alpha}/
9
9
 
@@ -64,6 +64,29 @@ module Asciidoctor
64
64
  string.tr LowerAlphaChars, SmallCapsChars
65
65
  end
66
66
  end
67
+
68
+ # Apply the text transform to the specified text.
69
+ #
70
+ # Supported transform values are "uppercase", "lowercase", or "none" (passed
71
+ # as either a String or a Symbol). When the uppercase transform is applied to
72
+ # the text, it correctly uppercases visible text while leaving markup and
73
+ # named character entities unchanged. The none transform returns the text
74
+ # unmodified.
75
+ #
76
+ def transform_text text, transform
77
+ case transform
78
+ when :uppercase, 'uppercase'
79
+ uppercase_pcdata text
80
+ when :lowercase, 'lowercase'
81
+ lowercase_pcdata text
82
+ when :capitalize, 'capitalize'
83
+ capitalize_words_pcdata text
84
+ when :smallcaps, 'smallcaps'
85
+ smallcaps_pcdata text
86
+ else
87
+ text
88
+ end
89
+ end
67
90
  end
68
91
  end
69
92
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Asciidoctor
4
4
  module PDF
5
- VERSION = '2.1.3'
5
+ VERSION = '2.1.6'
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.3
4
+ version: 2.1.6
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-23 00:00:00.000000000 Z
12
+ date: 2022-07-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: asciidoctor