asciidoctor-pdf 2.0.0.beta.2 → 2.0.0.rc.1
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 +4 -4
- data/CHANGELOG.adoc +30 -0
- data/README.adoc +79 -1103
- data/docs/theming-guide.adoc +1 -1
- data/lib/asciidoctor/pdf/converter.rb +2062 -2064
- data/lib/asciidoctor/pdf/ext/asciidoctor/abstract_block.rb +31 -0
- data/lib/asciidoctor/pdf/ext/asciidoctor.rb +1 -0
- data/lib/asciidoctor/pdf/ext/prawn/document/column_box.rb +9 -5
- data/lib/asciidoctor/pdf/ext/prawn/extensions.rb +22 -20
- data/lib/asciidoctor/pdf/version.rb +1 -1
- metadata +3 -2
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Asciidoctor::AbstractBlock.prepend (Module.new do
|
4
|
+
def empty?
|
5
|
+
blocks.empty?
|
6
|
+
end
|
7
|
+
|
8
|
+
def first_child
|
9
|
+
blocks[0]
|
10
|
+
end
|
11
|
+
|
12
|
+
def last_child
|
13
|
+
blocks[-1]
|
14
|
+
end
|
15
|
+
|
16
|
+
def last_child?
|
17
|
+
self == parent.blocks[-1]
|
18
|
+
end
|
19
|
+
|
20
|
+
def next_sibling
|
21
|
+
(siblings = parent.blocks)[(siblings.index self) + 1]
|
22
|
+
end
|
23
|
+
|
24
|
+
def previous_sibling
|
25
|
+
(self_idx = (siblings = parent.blocks).index self) > 0 ? siblings[self_idx - 1] : nil
|
26
|
+
end
|
27
|
+
|
28
|
+
def remove
|
29
|
+
parent.blocks.delete self
|
30
|
+
end
|
31
|
+
end)
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# NOTE: these are either candidates for inclusion in Asciidoctor core or backports
|
4
|
+
require_relative 'asciidoctor/abstract_block'
|
4
5
|
require_relative 'asciidoctor/document'
|
5
6
|
require_relative 'asciidoctor/section'
|
6
7
|
require_relative 'asciidoctor/list'
|
@@ -5,12 +5,16 @@ Prawn::Document::ColumnBox.prepend (Module.new do
|
|
5
5
|
stretchy? ? @parent.absolute_bottom : super
|
6
6
|
end
|
7
7
|
|
8
|
-
def move_past_bottom
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
def move_past_bottom
|
9
|
+
(doc = @document).y = @y
|
10
|
+
return if (@current_column = (@current_column + 1) % @columns) > 0
|
11
|
+
@y = (par = @parent).absolute_top if @reflow_margins
|
12
|
+
initial_margins = doc.page.margins
|
13
|
+
par.move_past_bottom
|
14
|
+
if doc.page.margins != initial_margins
|
15
|
+
doc.bounds = self.class.new doc, par, (margin_box = doc.margin_box).absolute_top_left,
|
13
16
|
columns: @columns, reflow_margins: true, spacer: @spacer, width: margin_box.width
|
14
17
|
end
|
18
|
+
nil
|
15
19
|
end
|
16
20
|
end)
|
@@ -429,14 +429,17 @@ module Asciidoctor
|
|
429
429
|
|
430
430
|
# NOTE: override built-in fill_formatted_text_box to insert leading before second line when :first_line is true
|
431
431
|
def fill_formatted_text_box text, options
|
432
|
+
if (initial_gap = options[:initial_gap]) && (first_text = text[0]) && first_text[:from_page] != page_number
|
433
|
+
self.y -= initial_gap
|
434
|
+
end
|
432
435
|
merge_text_box_positioning_options options
|
433
436
|
box = ::Prawn::Text::Formatted::Box.new text, options
|
434
437
|
remaining_text = box.render
|
435
438
|
@no_text_printed = box.nothing_printed?
|
436
439
|
@all_text_printed = box.everything_printed?
|
440
|
+
remaining_text[0][:from_page] = page_number unless remaining_text.empty?
|
437
441
|
|
438
|
-
if
|
439
|
-
(options[:first_line] && (options[:final_gap] || !(@no_text_printed || @all_text_printed)))
|
442
|
+
if @final_gap || (options[:first_line] && !(@no_text_printed || @all_text_printed))
|
440
443
|
self.y -= box.height + box.line_gap + box.leading
|
441
444
|
else
|
442
445
|
self.y -= box.height
|
@@ -455,7 +458,7 @@ module Asciidoctor
|
|
455
458
|
# remaining lines (which is the default behavior in Prawn).
|
456
459
|
def text_with_formatted_first_line string, first_line_options, options
|
457
460
|
if (first_line_font_color = first_line_options.delete :color)
|
458
|
-
|
461
|
+
remaining_lines_font_color, options[:color] = options[:color], first_line_font_color
|
459
462
|
end
|
460
463
|
fragments = parse_text string, options
|
461
464
|
# NOTE: the low-level APIs we're using don't recognize the :styles option, so we must resolve
|
@@ -468,19 +471,19 @@ module Asciidoctor
|
|
468
471
|
end
|
469
472
|
first_line_text_transform = first_line_options.delete :text_transform
|
470
473
|
options = options.merge document: self
|
474
|
+
@final_gap = final_gap = options.delete :final_gap
|
471
475
|
text_indent = options.delete :indent_paragraphs
|
472
476
|
# QUESTION: should we merge more carefully here? (hand-select keys?)
|
473
477
|
first_line_options = (options.merge first_line_options).merge single_line: true, first_line: true
|
474
478
|
box = ::Prawn::Text::Formatted::Box.new fragments, first_line_options
|
475
479
|
if text_indent
|
476
|
-
remaining_fragments = indent
|
477
|
-
box.render dry_run: true
|
478
|
-
end
|
480
|
+
remaining_fragments = indent(text_indent) { box.render dry_run: true }
|
479
481
|
else
|
480
482
|
remaining_fragments = box.render dry_run: true
|
481
483
|
end
|
484
|
+
remaining_fragments.empty? ? (remaining_fragments = nil) : (remaining_fragments[0][:from_page] = page_number)
|
482
485
|
if first_line_text_transform
|
483
|
-
# NOTE: applying text transform here could alter the wrapping, so
|
486
|
+
# NOTE: applying text transform here could alter the wrapping, so isolate first line and shrink it to fit
|
484
487
|
first_line_text = (box.instance_variable_get :@printed_lines)[0]
|
485
488
|
unless first_line_text == fragments[0][:text]
|
486
489
|
original_fragments, fragments = fragments, []
|
@@ -496,17 +499,16 @@ module Asciidoctor
|
|
496
499
|
end
|
497
500
|
fragments.each {|fragment| fragment[:text] = transform_text fragment[:text], first_line_text_transform }
|
498
501
|
first_line_options[:overflow] = :shrink_to_fit
|
499
|
-
|
502
|
+
@final_gap = first_line_options[:force_justify] = true if remaining_fragments
|
500
503
|
end
|
501
504
|
if text_indent
|
502
|
-
indent
|
503
|
-
fill_formatted_text_box fragments, first_line_options
|
504
|
-
end
|
505
|
+
indent(text_indent) { fill_formatted_text_box fragments, first_line_options }
|
505
506
|
else
|
506
507
|
fill_formatted_text_box fragments, first_line_options
|
507
508
|
end
|
508
|
-
|
509
|
-
options[:color] =
|
509
|
+
if remaining_fragments
|
510
|
+
options[:color] = remaining_lines_font_color if first_line_font_color
|
511
|
+
@final_gap = final_gap if first_line_text_transform
|
510
512
|
remaining_fragments = fill_formatted_text_box remaining_fragments, options
|
511
513
|
draw_remaining_formatted_text_on_new_pages remaining_fragments, options
|
512
514
|
end
|
@@ -589,7 +591,7 @@ module Asciidoctor
|
|
589
591
|
p_top, p_right, p_bottom, p_left = expand_padding_value padding
|
590
592
|
# logic is intentionally inlined
|
591
593
|
begin
|
592
|
-
if node && ((last_block = node).content_model != :compound || (last_block = node.
|
594
|
+
if node && ((last_block = node).content_model != :compound || (last_block = node.last_child)&.context == :paragraph)
|
593
595
|
@bottom_gutters << { last_block => p_bottom }
|
594
596
|
else
|
595
597
|
@bottom_gutters << {}
|
@@ -599,7 +601,7 @@ module Asciidoctor
|
|
599
601
|
bounds.add_right_padding p_right
|
600
602
|
yield
|
601
603
|
ensure
|
602
|
-
cursor > p_bottom ? (move_down p_bottom) :
|
604
|
+
cursor > p_bottom ? (move_down p_bottom) : bounds.move_past_bottom unless at_page_top?
|
603
605
|
@bottom_gutters.pop
|
604
606
|
bounds.subtract_left_padding p_left
|
605
607
|
bounds.subtract_right_padding p_right
|
@@ -943,7 +945,7 @@ module Asciidoctor
|
|
943
945
|
# if the current page is the last page of the document. Otherwise, it simply
|
944
946
|
# advances to the next existing page.
|
945
947
|
def advance_page options = {}
|
946
|
-
last_page? ? (start_new_page options) :
|
948
|
+
!options.empty? && last_page? ? (start_new_page options) : bounds.move_past_bottom
|
947
949
|
end
|
948
950
|
|
949
951
|
# Start a new page without triggering the on_page_create callback
|
@@ -952,14 +954,14 @@ module Asciidoctor
|
|
952
954
|
perform_discretely { start_new_page options }
|
953
955
|
end
|
954
956
|
|
955
|
-
#
|
957
|
+
# Scratch
|
956
958
|
|
957
|
-
def
|
958
|
-
@
|
959
|
+
def allocate_scratch_prototype
|
960
|
+
@scratch_prototype = create_scratch_prototype { ::Marshal.load ::Marshal.dump self }
|
959
961
|
end
|
960
962
|
|
961
963
|
def scratch
|
962
|
-
@scratch ||= ((Marshal.load Marshal.dump @
|
964
|
+
@scratch ||= ((Marshal.load Marshal.dump @scratch_prototype).send :init_scratch, self)
|
963
965
|
end
|
964
966
|
|
965
967
|
def scratch?
|
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.0.0.
|
4
|
+
version: 2.0.0.rc.1
|
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-05-
|
12
|
+
date: 2022-05-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: asciidoctor
|
@@ -246,6 +246,7 @@ files:
|
|
246
246
|
- lib/asciidoctor/pdf/converter.rb
|
247
247
|
- lib/asciidoctor/pdf/ext.rb
|
248
248
|
- lib/asciidoctor/pdf/ext/asciidoctor.rb
|
249
|
+
- lib/asciidoctor/pdf/ext/asciidoctor/abstract_block.rb
|
249
250
|
- lib/asciidoctor/pdf/ext/asciidoctor/document.rb
|
250
251
|
- lib/asciidoctor/pdf/ext/asciidoctor/image.rb
|
251
252
|
- lib/asciidoctor/pdf/ext/asciidoctor/list.rb
|