asciidoctor-pdf 2.0.0.alpha.2 → 2.0.0.alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.adoc +31 -2
- data/README.adoc +2 -2
- data/data/themes/base-theme.yml +2 -3
- data/data/themes/default-theme.yml +2 -2
- data/docs/theming-guide.adoc +7 -7
- data/lib/asciidoctor/pdf/converter.rb +179 -152
- data/lib/asciidoctor/pdf/ext/prawn/extensions.rb +38 -29
- data/lib/asciidoctor/pdf/theme_loader.rb +6 -0
- data/lib/asciidoctor/pdf/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7688a2448dace024b0e6057e878d556ec99ee1ac97bf4c91803d59346a136741
|
|
4
|
+
data.tar.gz: 13807213320754c03cce6304300745ec31a349a8e95441e1495ddc6e6401a99a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f3207de1db655ec85350df8b37530306e1ac13d1c1108b091886a8b45fcd5ce42fdc417fc759ef40ba77945925518e76e31341d12ec951ee648772c5b81364da
|
|
7
|
+
data.tar.gz: ab345b122e4137e33ed8ab0956270ce067f20b8b8b4f6aba3737f54f002b60b0653d5e9fbc356778d3787f9601b2f4ed9a6e0a5694bab5c9f376365297ae0626
|
data/CHANGELOG.adoc
CHANGED
|
@@ -5,6 +5,35 @@
|
|
|
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 {uri-repo}/commits/main[commit history] on GitHub.
|
|
7
7
|
|
|
8
|
+
== 2.0.0.alpha.3 (2022-05-01) - @mojavelinux
|
|
9
|
+
|
|
10
|
+
Enhancements::
|
|
11
|
+
|
|
12
|
+
* allow border width of block to be specified per edge using 4-value array (#2102)
|
|
13
|
+
* allow padding on block to be specified using 2-value array for ends and sides or 3-value array with implied left side value (#2104)
|
|
14
|
+
* allow margins in running content to be specified using 2-value array for ends and sides or 3-value array with implied left side value (#2104)
|
|
15
|
+
* allow theme to set border and padding on headings per level (#434)
|
|
16
|
+
|
|
17
|
+
Improvements::
|
|
18
|
+
|
|
19
|
+
* reduce top and bottom padding on quote and verse blocks in base theme
|
|
20
|
+
* use uniform top and bottom padding on quote blocks in default theme
|
|
21
|
+
* change `inscribe_` method prefix in converter to `ink_`
|
|
22
|
+
|
|
23
|
+
Bug Fixes::
|
|
24
|
+
|
|
25
|
+
* allow `ink_toc` method in extended converter to insert page above TOC page
|
|
26
|
+
* remap `layout_` methods contributed to converter by prepended module
|
|
27
|
+
* neutralize padding hacks in themes designed before the converter had smart margins
|
|
28
|
+
* allow smallest ends or sides border width on block to be less than 1
|
|
29
|
+
* cap border corners on block when width is defined using array (uniform or otherwise) (#2103)
|
|
30
|
+
* fix crash in certain circumstances when theme does not define value for `base-border-width` key
|
|
31
|
+
* use sensible fallbacks for table border and grid color and width (retains backwards compatibility)
|
|
32
|
+
|
|
33
|
+
=== Details
|
|
34
|
+
|
|
35
|
+
{url-repo}/releases/tag/v2.0.0.alpha.3[git tag] | {url-repo}/compare/v2.0.0.alpha.2\...v2.0.0.alpha.3[full diff]
|
|
36
|
+
|
|
8
37
|
== 2.0.0.alpha.2 (2022-04-29) - @mojavelinux
|
|
9
38
|
|
|
10
39
|
Enhancements::
|
|
@@ -12,7 +41,7 @@ Enhancements::
|
|
|
12
41
|
* separate `align` and `text-align` keys in theme schema; remap old keys for backwards compatibility (#2095)
|
|
13
42
|
* allow theme to control the border on all sides of tables independently (#902)
|
|
14
43
|
* keep section title with first block of content is `breakable` option is set on section (#2075, #38)
|
|
15
|
-
* pass `part
|
|
44
|
+
* pass the `part` and `chapterlike` options to the `arrange_section` method for convenience
|
|
16
45
|
* add support for `background-color` property on caption (#1995)
|
|
17
46
|
* add support for image-based icons, resolved from `iconsdir` and having the `icontype` file extension (#1770)
|
|
18
47
|
* add `asciidoctor/pdf/nogmagick` script to prevent Gmagick from handling PNG images (#1687)
|
|
@@ -36,7 +65,7 @@ Bug Fixes::
|
|
|
36
65
|
* delete dests on page before deleting it (keeps generated PDF clean of obsolete destinations)
|
|
37
66
|
* don't call `arrange_section` if section title is hidden
|
|
38
67
|
* remove `theme_font` enclosure around call to `start_new_chapter` and `start_new_part`
|
|
39
|
-
* change `layout_` method prefix to `inscribe_`
|
|
68
|
+
* change `layout_` method prefix in converter to `inscribe_` (#2099)
|
|
40
69
|
|
|
41
70
|
=== Details
|
|
42
71
|
|
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.0.0.alpha.
|
|
3
|
+
v2.0.0.alpha.3, 2022-05-01
|
|
4
4
|
// Settings:
|
|
5
5
|
:experimental:
|
|
6
6
|
:idprefix:
|
|
@@ -24,7 +24,7 @@ endif::[]
|
|
|
24
24
|
:project-handle: asciidoctor-pdf
|
|
25
25
|
// Variables:
|
|
26
26
|
:release-line: 2.0.x
|
|
27
|
-
:release-version: 2.0.0.alpha.
|
|
27
|
+
:release-version: 2.0.0.alpha.3
|
|
28
28
|
// URIs:
|
|
29
29
|
:url-asciidoctor: http://asciidoctor.org
|
|
30
30
|
:url-gem: http://rubygems.org/gems/asciidoctor-pdf
|
data/data/themes/base-theme.yml
CHANGED
|
@@ -76,10 +76,10 @@ admonition_label_font_style: bold
|
|
|
76
76
|
admonition_label_text_transform: uppercase
|
|
77
77
|
quote_border_color: 'EEEEEE'
|
|
78
78
|
quote_border_left_width: 4
|
|
79
|
-
quote_padding: [
|
|
79
|
+
quote_padding: [3, 12, 3, 14]
|
|
80
80
|
verse_border_color: 'EEEEEE'
|
|
81
81
|
verse_border_left_width: 4
|
|
82
|
-
verse_padding: [
|
|
82
|
+
verse_padding: [3, 12, 3, 14]
|
|
83
83
|
code_font_family: Courier
|
|
84
84
|
code_font_size: 10.8
|
|
85
85
|
code_line_height: 1.2
|
|
@@ -101,7 +101,6 @@ sidebar_title_font_style: bold
|
|
|
101
101
|
table_border_color: '000000'
|
|
102
102
|
table_border_style: solid
|
|
103
103
|
table_border_width: 0.5
|
|
104
|
-
table_grid_width: 0.5
|
|
105
104
|
table_cell_padding: 2
|
|
106
105
|
table_head_font_style: bold
|
|
107
106
|
table_head_border_bottom_width: 1.25
|
|
@@ -168,8 +168,8 @@ quote:
|
|
|
168
168
|
font_size: $base_font_size_large
|
|
169
169
|
border_color: $base_border_color
|
|
170
170
|
border_width: 0
|
|
171
|
-
border_left_width:
|
|
172
|
-
padding: [
|
|
171
|
+
border_left_width: $horizontal_rhythm / 3
|
|
172
|
+
padding: [$vertical_rhythm / 4, $horizontal_rhythm, $vertical_rhythm / 4, $horizontal_rhythm + $quote_border_left_width / 2]
|
|
173
173
|
cite:
|
|
174
174
|
font_size: $base_font_size_small
|
|
175
175
|
font_color: $role_subtitle_font_color
|
data/docs/theming-guide.adoc
CHANGED
|
@@ -5910,19 +5910,19 @@ Refer to the primary converter to discover the pseudo-HTML you can use for inlin
|
|
|
5910
5910
|
|
|
5911
5911
|
So far we've just been biting around the edges.
|
|
5912
5912
|
A more realistic use case is to customize the part title page in a multi-part book.
|
|
5913
|
-
Since this is a specialized section element, there's a dedicated method named `
|
|
5913
|
+
Since this is a specialized section element, there's a dedicated method named `ink_part_title` that you'll need to override.
|
|
5914
5914
|
|
|
5915
5915
|
Let's customize the part title page by making the background orange, making the font white, centering the title on the page, and disabling the running content.
|
|
5916
5916
|
(You don't need to start a new page before and after the part title since that's already done for you).
|
|
5917
5917
|
|
|
5918
5918
|
[source,ruby]
|
|
5919
5919
|
----
|
|
5920
|
-
|
|
5921
|
-
|
|
5922
|
-
|
|
5923
|
-
|
|
5924
|
-
|
|
5925
|
-
|
|
5920
|
+
def ink_part_title node, title, opts = {}
|
|
5921
|
+
fill_absolute_bounds 'E64C3D'
|
|
5922
|
+
move_down 20
|
|
5923
|
+
typeset_text title, (calc_line_metrics 1.5), color: 'FFFFFF', inline_format: true, align: :center, size: 42
|
|
5924
|
+
page.instance_variable_set :@imported_page, true
|
|
5925
|
+
end
|
|
5926
5926
|
----
|
|
5927
5927
|
|
|
5928
5928
|
The method `typeset_text` and `calc_line_metrics` are provided by Asciidoctor PDF to make writing text easier.
|
|
@@ -168,7 +168,7 @@ module Asciidoctor
|
|
|
168
168
|
if (bottom_gutter = @bottom_gutters[-1][node])
|
|
169
169
|
prose_opts[:bottom_gutter] = bottom_gutter
|
|
170
170
|
end
|
|
171
|
-
|
|
171
|
+
ink_prose string, prose_opts
|
|
172
172
|
end
|
|
173
173
|
ensure
|
|
174
174
|
node.document.instance_variable_set :@converter, prev_converter if prev_converter
|
|
@@ -190,22 +190,22 @@ module Asciidoctor
|
|
|
190
190
|
|
|
191
191
|
marked_page_number = page_number
|
|
192
192
|
# NOTE: a new page will already be started (page_number = 2) if the front cover image is a PDF
|
|
193
|
-
|
|
193
|
+
ink_cover_page doc, :front
|
|
194
194
|
has_front_cover = page_number > marked_page_number
|
|
195
|
-
has_title_page =
|
|
195
|
+
has_title_page = ink_title_page doc if (title_page_on = doc.doctype == 'book' || (doc.attr? 'title-page'))
|
|
196
196
|
|
|
197
197
|
@page_margin_by_side[:cover] = @page_margin_by_side[:recto] if @media == 'prepress' && page_number == 0
|
|
198
198
|
|
|
199
199
|
start_new_page unless page&.empty? # rubocop:disable Lint/SafeNavigationWithEmpty
|
|
200
200
|
|
|
201
201
|
# NOTE: the base font must be set before any content is written to the main or scratch document
|
|
202
|
-
# this method is called inside
|
|
202
|
+
# this method is called inside ink_title_page if the title page is active
|
|
203
203
|
font @theme.base_font_family, size: @root_font_size, style: @theme.base_font_style unless has_title_page
|
|
204
204
|
|
|
205
205
|
unless title_page_on
|
|
206
206
|
body_start_page_number = page_number
|
|
207
207
|
theme_font :heading, level: 1 do
|
|
208
|
-
|
|
208
|
+
ink_general_heading doc, doc.doctitle, align: (@theme.heading_h1_text_align&.to_sym || :center), level: 1, role: :doctitle
|
|
209
209
|
end if doc.header? && !doc.notitle
|
|
210
210
|
end
|
|
211
211
|
|
|
@@ -301,14 +301,14 @@ module Asciidoctor
|
|
|
301
301
|
traverse doc
|
|
302
302
|
|
|
303
303
|
# NOTE: for a book, these are leftover footnotes; for an article this is everything
|
|
304
|
-
outdent_section {
|
|
304
|
+
outdent_section { ink_footnotes doc }
|
|
305
305
|
|
|
306
306
|
if @toc_extent
|
|
307
307
|
if title_page_on && !insert_toc
|
|
308
308
|
num_front_matter_pages[0] = @toc_extent.to.page if @theme.running_content_start_at == 'after-toc'
|
|
309
309
|
num_front_matter_pages[1] = @toc_extent.to.page if @theme.page_numbering_start_at == 'after-toc'
|
|
310
310
|
end
|
|
311
|
-
toc_page_nums =
|
|
311
|
+
toc_page_nums = ink_toc doc, toc_num_levels, @toc_extent.from.page, @toc_extent.from.cursor, num_front_matter_pages[1]
|
|
312
312
|
else
|
|
313
313
|
toc_page_nums = []
|
|
314
314
|
end
|
|
@@ -319,8 +319,8 @@ module Asciidoctor
|
|
|
319
319
|
end
|
|
320
320
|
|
|
321
321
|
unless page_count < body_start_page_number
|
|
322
|
-
|
|
323
|
-
|
|
322
|
+
ink_running_content :header, doc, num_front_matter_pages, body_start_page_number unless doc.noheader || @theme.header_height.to_f == 0 # rubocop:disable Lint/FloatComparison
|
|
323
|
+
ink_running_content :footer, doc, num_front_matter_pages, body_start_page_number unless doc.nofooter || @theme.footer_height.to_f == 0 # rubocop:disable Lint/FloatComparison
|
|
324
324
|
end
|
|
325
325
|
|
|
326
326
|
add_outline doc, (doc.attr 'outlinelevels', toc_num_levels), toc_page_nums, num_front_matter_pages[1], has_front_cover
|
|
@@ -337,7 +337,7 @@ module Asciidoctor
|
|
|
337
337
|
catalog.data[:ViewerPreferences] = { DisplayDocTitle: true }
|
|
338
338
|
|
|
339
339
|
stamp_foreground_image doc, has_front_cover
|
|
340
|
-
|
|
340
|
+
ink_cover_page doc, :back
|
|
341
341
|
add_dest_for_top doc
|
|
342
342
|
nil
|
|
343
343
|
end
|
|
@@ -461,7 +461,8 @@ module Asciidoctor
|
|
|
461
461
|
end
|
|
462
462
|
|
|
463
463
|
def prepare_theme theme
|
|
464
|
-
theme.
|
|
464
|
+
theme.base_border_color ||= '000000'
|
|
465
|
+
theme.base_border_width ||= 0
|
|
465
466
|
theme.base_font_color ||= '000000'
|
|
466
467
|
theme.base_font_size ||= 12
|
|
467
468
|
theme.base_font_style = theme.base_font_style&.to_sym || :normal
|
|
@@ -478,6 +479,7 @@ module Asciidoctor
|
|
|
478
479
|
theme.list_item_spacing ||= 0
|
|
479
480
|
theme.description_list_term_spacing ||= 0
|
|
480
481
|
theme.description_list_description_indent ||= 0
|
|
482
|
+
theme.table_border_width ||= 0.5
|
|
481
483
|
theme.image_border_width ||= 0
|
|
482
484
|
theme.code_linenum_font_color ||= '999999'
|
|
483
485
|
theme.callout_list_margin_top_after_code ||= 0
|
|
@@ -687,11 +689,11 @@ module Asciidoctor
|
|
|
687
689
|
add_dest_for_block sect, id: sect_anchor, y: (at_page_top? ? page_height : nil)
|
|
688
690
|
theme_font :heading, level: hlevel do
|
|
689
691
|
if part
|
|
690
|
-
|
|
692
|
+
ink_part_title sect, title, hopts
|
|
691
693
|
elsif chapterlike
|
|
692
|
-
|
|
694
|
+
ink_chapter_title sect, title, hopts
|
|
693
695
|
else
|
|
694
|
-
|
|
696
|
+
ink_general_heading sect, title, hopts
|
|
695
697
|
end
|
|
696
698
|
end unless hidden
|
|
697
699
|
|
|
@@ -700,7 +702,7 @@ module Asciidoctor
|
|
|
700
702
|
else
|
|
701
703
|
traverse sect
|
|
702
704
|
end
|
|
703
|
-
outdent_section {
|
|
705
|
+
outdent_section { ink_footnotes sect } if chapterlike
|
|
704
706
|
sect.set_attr 'pdf-page-end', page_number
|
|
705
707
|
end
|
|
706
708
|
|
|
@@ -721,7 +723,7 @@ module Asciidoctor
|
|
|
721
723
|
end
|
|
722
724
|
|
|
723
725
|
# QUESTION: if a footnote ref appears in a separate chapter, should the footnote def be duplicated?
|
|
724
|
-
def
|
|
726
|
+
def ink_footnotes node
|
|
725
727
|
return if (fns = (doc = node.document).footnotes - @rendered_footnotes).empty?
|
|
726
728
|
theme_margin :block, :bottom if node.context == :document || node == node.document.blocks[-1]
|
|
727
729
|
theme_margin :footnotes, :top
|
|
@@ -730,7 +732,7 @@ module Asciidoctor
|
|
|
730
732
|
move_down delta
|
|
731
733
|
end
|
|
732
734
|
theme_font :footnotes do
|
|
733
|
-
(title = doc.attr 'footnotes-title') && (
|
|
735
|
+
(title = doc.attr 'footnotes-title') && (ink_caption title, category: :footnotes)
|
|
734
736
|
item_spacing = @theme.footnotes_item_spacing
|
|
735
737
|
index_offset = @rendered_footnotes.length
|
|
736
738
|
sect_xreftext = node.context == :section && (node.xreftext node.document.attr 'xrefstyle')
|
|
@@ -740,7 +742,7 @@ module Asciidoctor
|
|
|
740
742
|
fn.singleton_class.send :attr_accessor, :label unless fn.respond_to? :label=
|
|
741
743
|
fn.label = %(#{label} - #{sect_xreftext})
|
|
742
744
|
end
|
|
743
|
-
|
|
745
|
+
ink_prose %(<a id="_footnotedef_#{index}">#{DummyText}</a>[<a anchor="_footnoteref_#{index}">#{label}</a>] #{fn.text}), margin_bottom: item_spacing, hyphenate: true
|
|
744
746
|
end
|
|
745
747
|
@rendered_footnotes += fns if extent
|
|
746
748
|
end
|
|
@@ -756,7 +758,7 @@ module Asciidoctor
|
|
|
756
758
|
end
|
|
757
759
|
# QUESTION: should we decouple styles from section titles?
|
|
758
760
|
theme_font :heading, level: hlevel do
|
|
759
|
-
|
|
761
|
+
ink_general_heading node, node.title, align: align, level: hlevel, outdent: (node.parent.context == :section)
|
|
760
762
|
end
|
|
761
763
|
end
|
|
762
764
|
|
|
@@ -765,7 +767,7 @@ module Asciidoctor
|
|
|
765
767
|
outdent_section do
|
|
766
768
|
pad_box @theme.abstract_padding do
|
|
767
769
|
theme_font :abstract_title do
|
|
768
|
-
|
|
770
|
+
ink_prose node.title, align: (@theme.abstract_title_text_align || @base_text_align).to_sym, margin_top: @theme.heading_margin_top, margin_bottom: @theme.heading_margin_bottom, line_height: (@theme.heading_line_height || @theme.base_line_height)
|
|
769
771
|
end if node.title?
|
|
770
772
|
theme_font :abstract do
|
|
771
773
|
prose_opts = { align: (@theme.abstract_text_align || @base_text_align).to_sym, hyphenate: true }
|
|
@@ -787,7 +789,7 @@ module Asciidoctor
|
|
|
787
789
|
if child.context == :paragraph
|
|
788
790
|
child.document.playback_attributes child.attributes
|
|
789
791
|
prose_opts[:margin_bottom] = 0 if child == last_block
|
|
790
|
-
|
|
792
|
+
ink_prose child.content, ((align = resolve_alignment_from_role child.roles) ? (prose_opts.merge align: align) : prose_opts.dup)
|
|
791
793
|
prose_opts.delete :first_line_options
|
|
792
794
|
prose_opts.delete :margin_bottom
|
|
793
795
|
else
|
|
@@ -799,7 +801,7 @@ module Asciidoctor
|
|
|
799
801
|
if (align = resolve_alignment_from_role node.roles)
|
|
800
802
|
prose_opts[:align] = align
|
|
801
803
|
end
|
|
802
|
-
|
|
804
|
+
ink_prose string, (prose_opts.merge margin_bottom: 0)
|
|
803
805
|
end
|
|
804
806
|
end
|
|
805
807
|
end
|
|
@@ -834,17 +836,17 @@ module Asciidoctor
|
|
|
834
836
|
|
|
835
837
|
# TODO: check if we're within one line of the bottom of the page
|
|
836
838
|
# and advance to the next page if so (similar to logic for section titles)
|
|
837
|
-
|
|
839
|
+
ink_caption node, labeled: false if node.title?
|
|
838
840
|
|
|
839
841
|
if (bottom_gutter = @bottom_gutters[-1][node])
|
|
840
842
|
prose_opts[:bottom_gutter] = bottom_gutter
|
|
841
843
|
end
|
|
842
844
|
|
|
843
845
|
if roles.empty?
|
|
844
|
-
|
|
846
|
+
ink_prose node.content, prose_opts
|
|
845
847
|
else
|
|
846
848
|
theme_font_cascade (roles.map {|role| %(role_#{role}).to_sym }) do
|
|
847
|
-
|
|
849
|
+
ink_prose node.content, prose_opts
|
|
848
850
|
end
|
|
849
851
|
end
|
|
850
852
|
|
|
@@ -892,12 +894,8 @@ module Asciidoctor
|
|
|
892
894
|
label_width = label_min_width if label_min_width && label_min_width > label_width
|
|
893
895
|
end
|
|
894
896
|
end
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
end
|
|
898
|
-
unless ::Array === (lpad = @theme.admonition_label_padding || cpad)
|
|
899
|
-
lpad = ::Array.new 4, lpad
|
|
900
|
-
end
|
|
897
|
+
cpad = expand_padding_value @theme.admonition_padding
|
|
898
|
+
lpad = (lpad = @theme.admonition_label_padding) ? (expand_padding_value lpad) : cpad
|
|
901
899
|
arrange_block node do |extent|
|
|
902
900
|
add_dest_for_block node if node.id
|
|
903
901
|
theme_fill_and_stroke_block :admonition, extent if extent
|
|
@@ -905,7 +903,7 @@ module Asciidoctor
|
|
|
905
903
|
if extent
|
|
906
904
|
label_height = extent.single_page_height || cursor
|
|
907
905
|
if (rule_color = @theme.admonition_column_rule_color) &&
|
|
908
|
-
(rule_width = @theme.admonition_column_rule_width || @theme.base_border_width)
|
|
906
|
+
(rule_width = @theme.admonition_column_rule_width || @theme.base_border_width) > 0
|
|
909
907
|
rule_style = @theme.admonition_column_rule_style&.to_sym || :solid
|
|
910
908
|
float do
|
|
911
909
|
extent.each_page do |first_page, last_page|
|
|
@@ -996,7 +994,7 @@ module Asciidoctor
|
|
|
996
994
|
end
|
|
997
995
|
end
|
|
998
996
|
@text_transform = nil # already applied to label
|
|
999
|
-
|
|
997
|
+
ink_prose label_text,
|
|
1000
998
|
align: label_align,
|
|
1001
999
|
valign: label_valign,
|
|
1002
1000
|
line_height: 1,
|
|
@@ -1010,7 +1008,7 @@ module Asciidoctor
|
|
|
1010
1008
|
end
|
|
1011
1009
|
end
|
|
1012
1010
|
pad_box [cpad[0], 0, cpad[2], label_width + lpad[1] + cpad[3]], node do
|
|
1013
|
-
|
|
1011
|
+
ink_caption node, category: :admonition, labeled: false if node.title?
|
|
1014
1012
|
theme_font :admonition do
|
|
1015
1013
|
traverse node
|
|
1016
1014
|
end
|
|
@@ -1044,13 +1042,13 @@ module Asciidoctor
|
|
|
1044
1042
|
arrange_block node do
|
|
1045
1043
|
add_dest_for_block node if id
|
|
1046
1044
|
tare_first_page_content_stream do
|
|
1047
|
-
node.context == :example ? (
|
|
1045
|
+
node.context == :example ? (ink_caption %(\u25bc #{node.title})) : (ink_caption node, labeled: false)
|
|
1048
1046
|
end if has_title
|
|
1049
1047
|
traverse node
|
|
1050
1048
|
end
|
|
1051
1049
|
else
|
|
1052
1050
|
add_dest_for_block node if id
|
|
1053
|
-
node.context == :example ? (
|
|
1051
|
+
node.context == :example ? (ink_caption %(\u25bc #{node.title})) : (ink_caption node, labeled: false) if has_title
|
|
1054
1052
|
traverse node
|
|
1055
1053
|
end
|
|
1056
1054
|
end
|
|
@@ -1094,7 +1092,7 @@ module Asciidoctor
|
|
|
1094
1092
|
traverse node
|
|
1095
1093
|
else # :verse
|
|
1096
1094
|
content = guard_indentation node.content
|
|
1097
|
-
|
|
1095
|
+
ink_prose content,
|
|
1098
1096
|
normalize: false,
|
|
1099
1097
|
align: :left,
|
|
1100
1098
|
hyphenate: true,
|
|
@@ -1106,7 +1104,7 @@ module Asciidoctor
|
|
|
1106
1104
|
margin_bottom @theme.block_margin_bottom
|
|
1107
1105
|
theme_font %(#{category}_cite) do
|
|
1108
1106
|
attribution_parts = citetitle ? [attribution, citetitle] : [attribution]
|
|
1109
|
-
|
|
1107
|
+
ink_prose %(#{EmDash} #{attribution_parts.join ', '}), align: :left, normalize: false, margin_bottom: 0
|
|
1110
1108
|
end
|
|
1111
1109
|
end
|
|
1112
1110
|
end
|
|
@@ -1124,7 +1122,7 @@ module Asciidoctor
|
|
|
1124
1122
|
pad_box @theme.sidebar_padding, node do
|
|
1125
1123
|
theme_font :sidebar_title do
|
|
1126
1124
|
# QUESTION: should we allow margins of sidebar title to be customized?
|
|
1127
|
-
|
|
1125
|
+
ink_prose node.title, align: (@theme.sidebar_title_text_align || @theme.heading_text_align || @base_text_align).to_sym, margin_bottom: @theme.heading_margin_bottom, line_height: (@theme.heading_line_height || @theme.base_line_height)
|
|
1128
1126
|
end if node.title?
|
|
1129
1127
|
theme_font :sidebar do
|
|
1130
1128
|
traverse node
|
|
@@ -1163,7 +1161,7 @@ module Asciidoctor
|
|
|
1163
1161
|
marker_width = rendered_width_of_string %(#{marker = conum_glyph index}x)
|
|
1164
1162
|
float do
|
|
1165
1163
|
bounding_box [0, cursor], width: marker_width do
|
|
1166
|
-
|
|
1164
|
+
ink_prose marker, align: :center, inline_format: false, margin: 0
|
|
1167
1165
|
end
|
|
1168
1166
|
end
|
|
1169
1167
|
end
|
|
@@ -1247,7 +1245,7 @@ module Asciidoctor
|
|
|
1247
1245
|
max_term_width += (term_padding[1] + term_padding[3])
|
|
1248
1246
|
term_column_width = [max_term_width, bounds.width * 0.5].min
|
|
1249
1247
|
table table_data, position: :left, cell_style: { border_width: 0 }, column_widths: [term_column_width] do
|
|
1250
|
-
@pdf.
|
|
1248
|
+
@pdf.ink_table_caption node if node.title?
|
|
1251
1249
|
end
|
|
1252
1250
|
theme_margin :prose, :bottom, (next_enclosed_block actual_node) #unless actual_node.nested?
|
|
1253
1251
|
when 'qanda'
|
|
@@ -1257,7 +1255,7 @@ module Asciidoctor
|
|
|
1257
1255
|
else
|
|
1258
1256
|
# TODO: check if we're within one line of the bottom of the page
|
|
1259
1257
|
# and advance to the next page if so (similar to logic for section titles)
|
|
1260
|
-
|
|
1258
|
+
ink_caption node, category: :description_list, labeled: false if node.title?
|
|
1261
1259
|
|
|
1262
1260
|
term_spacing = @theme.description_list_term_spacing
|
|
1263
1261
|
term_height = theme_font(:description_list_term) { height_of_typeset_text 'A' }
|
|
@@ -1269,8 +1267,8 @@ module Asciidoctor
|
|
|
1269
1267
|
term_font_styles = nil
|
|
1270
1268
|
end
|
|
1271
1269
|
terms.each_with_index do |term, idx|
|
|
1272
|
-
# QUESTION: should we pass down styles in other calls to
|
|
1273
|
-
|
|
1270
|
+
# QUESTION: should we pass down styles in other calls to ink_prose
|
|
1271
|
+
ink_prose term.text, margin_top: (idx > 0 ? term_spacing : 0), margin_bottom: 0, align: :left, normalize_line_height: true, styles: term_font_styles
|
|
1274
1272
|
end
|
|
1275
1273
|
end
|
|
1276
1274
|
indent @theme.description_list_description_indent do
|
|
@@ -1357,7 +1355,7 @@ module Asciidoctor
|
|
|
1357
1355
|
def convert_list node
|
|
1358
1356
|
# TODO: check if we're within one line of the bottom of the page
|
|
1359
1357
|
# and advance to the next page if so (similar to logic for section titles)
|
|
1360
|
-
|
|
1358
|
+
ink_caption node, category: :list, labeled: false if node.title?
|
|
1361
1359
|
|
|
1362
1360
|
opts = {}
|
|
1363
1361
|
if (align = resolve_alignment_from_role node.roles)
|
|
@@ -1454,7 +1452,7 @@ module Asciidoctor
|
|
|
1454
1452
|
float do
|
|
1455
1453
|
advance_page if @media == 'prepress' && cursor < marker_height
|
|
1456
1454
|
flow_bounding_box position: start_position, width: marker_width do
|
|
1457
|
-
|
|
1455
|
+
ink_prose marker,
|
|
1458
1456
|
align: :right,
|
|
1459
1457
|
character_spacing: -0.5,
|
|
1460
1458
|
color: marker_style[:font_color],
|
|
@@ -1482,16 +1480,16 @@ module Asciidoctor
|
|
|
1482
1480
|
def traverse_list_item node, list_type, opts = {}
|
|
1483
1481
|
if list_type == :dlist # qanda
|
|
1484
1482
|
terms, desc = node
|
|
1485
|
-
terms.each {|term|
|
|
1483
|
+
terms.each {|term| ink_prose %(<em>#{term.text}</em>), (opts.merge margin_bottom: @theme.description_list_term_spacing) }
|
|
1486
1484
|
if desc
|
|
1487
|
-
|
|
1485
|
+
ink_prose desc.text, (opts.merge hyphenate: true) if desc.text?
|
|
1488
1486
|
traverse desc
|
|
1489
1487
|
end
|
|
1490
1488
|
else
|
|
1491
1489
|
if (primary_text = node.text).nil_or_empty?
|
|
1492
|
-
|
|
1490
|
+
ink_prose DummyText, opts unless node.blocks?
|
|
1493
1491
|
else
|
|
1494
|
-
|
|
1492
|
+
ink_prose primary_text, (opts.merge hyphenate: true)
|
|
1495
1493
|
end
|
|
1496
1494
|
traverse node
|
|
1497
1495
|
end
|
|
@@ -1562,7 +1560,7 @@ module Asciidoctor
|
|
|
1562
1560
|
width = (width.to_f / 100) * page_width if ViewportWidth === width
|
|
1563
1561
|
|
|
1564
1562
|
# NOTE: if width is not set explicitly and max-width is fit-content, caption height may not be accurate
|
|
1565
|
-
caption_h = node.title? ? (
|
|
1563
|
+
caption_h = node.title? ? (ink_caption node, category: :image, side: :bottom, block_align: alignment, block_width: width, max_width: @theme.image_caption_max_width, dry_run: true, force_top_margin: true) : 0
|
|
1566
1564
|
|
|
1567
1565
|
align_to_page = node.option? 'align-to-page'
|
|
1568
1566
|
pinned = opts[:pinned]
|
|
@@ -1645,7 +1643,7 @@ module Asciidoctor
|
|
|
1645
1643
|
move_down rendered_h if y == image_y
|
|
1646
1644
|
end
|
|
1647
1645
|
end
|
|
1648
|
-
|
|
1646
|
+
ink_caption node, category: :image, side: :bottom, block_align: alignment, block_width: rendered_w, max_width: @theme.image_caption_max_width if node.title?
|
|
1649
1647
|
theme_margin :block, :bottom, (next_enclosed_block node) unless pinned
|
|
1650
1648
|
rescue => e
|
|
1651
1649
|
raise if ::StopIteration === e
|
|
@@ -1685,9 +1683,9 @@ module Asciidoctor
|
|
|
1685
1683
|
alignment = (alignment = node.attr 'align') ?
|
|
1686
1684
|
((BlockAlignmentNames.include? alignment) ? alignment.to_sym : :left) :
|
|
1687
1685
|
(resolve_alignment_from_role node.roles) || (@theme.image_align&.to_sym || :left)
|
|
1688
|
-
|
|
1686
|
+
ink_prose alt_text_template % alt_text_vars, align: alignment, margin: 0, normalize: false, single_line: true
|
|
1689
1687
|
end
|
|
1690
|
-
|
|
1688
|
+
ink_caption node, category: :image, side: :bottom if node.title?
|
|
1691
1689
|
theme_margin :block, :bottom, (next_enclosed_block node) unless opts[:pinned]
|
|
1692
1690
|
nil
|
|
1693
1691
|
end
|
|
@@ -1696,8 +1694,8 @@ module Asciidoctor
|
|
|
1696
1694
|
add_dest_for_block node if node.id
|
|
1697
1695
|
audio_path = node.media_uri node.attr 'target'
|
|
1698
1696
|
play_symbol = (node.document.attr? 'icons', 'font') ? %(<font name="fas">#{(icon_font_data 'fas').unicode 'play'}</font>) : RightPointer
|
|
1699
|
-
|
|
1700
|
-
|
|
1697
|
+
ink_prose %(#{play_symbol}#{NoBreakSpace}<a href="#{audio_path}">#{audio_path}</a> <em>(audio)</em>), normalize: false, margin: 0, single_line: true
|
|
1698
|
+
ink_caption node, labeled: false, side: :bottom if node.title?
|
|
1701
1699
|
theme_margin :block, :bottom, (next_enclosed_block node)
|
|
1702
1700
|
end
|
|
1703
1701
|
|
|
@@ -1724,8 +1722,8 @@ module Asciidoctor
|
|
|
1724
1722
|
if poster.nil_or_empty?
|
|
1725
1723
|
add_dest_for_block node if node.id
|
|
1726
1724
|
play_symbol = (node.document.attr? 'icons', 'font') ? %(<font name="fas">#{(icon_font_data 'fas').unicode 'play'}</font>) : RightPointer
|
|
1727
|
-
|
|
1728
|
-
|
|
1725
|
+
ink_prose %(#{play_symbol}#{NoBreakSpace}<a href="#{video_path}">#{video_path}</a> <em>(#{type})</em>), normalize: false, margin: 0, single_line: true
|
|
1726
|
+
ink_caption node, labeled: false, side: :bottom if node.title?
|
|
1729
1727
|
theme_margin :block, :bottom, (next_enclosed_block node)
|
|
1730
1728
|
else
|
|
1731
1729
|
original_attributes = node.attributes.dup
|
|
@@ -2024,6 +2022,7 @@ module Asciidoctor
|
|
|
2024
2022
|
|
|
2025
2023
|
base_header_cell_data = nil
|
|
2026
2024
|
header_cell_line_metrics = nil
|
|
2025
|
+
body_cell_padding = expand_padding_value theme.table_cell_padding
|
|
2027
2026
|
|
|
2028
2027
|
table_data = []
|
|
2029
2028
|
theme_font :table do
|
|
@@ -2038,7 +2037,7 @@ module Asciidoctor
|
|
|
2038
2037
|
table_header_size = head_rows.size
|
|
2039
2038
|
head_font_info = font_info
|
|
2040
2039
|
head_line_metrics = calc_line_metrics theme.table_head_line_height || theme.table_cell_line_height || @base_line_height
|
|
2041
|
-
head_cell_padding =
|
|
2040
|
+
head_cell_padding = ((head_cell_padding = theme.table_head_cell_padding) ? (expand_padding_value head_cell_padding) : body_cell_padding).dup
|
|
2042
2041
|
head_cell_padding[0] += head_line_metrics.padding_top
|
|
2043
2042
|
head_cell_padding[2] += head_line_metrics.padding_bottom
|
|
2044
2043
|
# QUESTION: why doesn't text transform inherit from table?
|
|
@@ -2077,7 +2076,6 @@ module Asciidoctor
|
|
|
2077
2076
|
text_color: @font_color,
|
|
2078
2077
|
}
|
|
2079
2078
|
body_cell_line_metrics = calc_line_metrics (theme.table_cell_line_height || @base_line_height)
|
|
2080
|
-
body_cell_padding = expand_padding_value theme.table_cell_padding
|
|
2081
2079
|
(body_rows + node.rows[:foot]).each do |row|
|
|
2082
2080
|
table_data << (row.map do |cell|
|
|
2083
2081
|
cell_data = base_cell_data.merge \
|
|
@@ -2144,7 +2142,7 @@ module Asciidoctor
|
|
|
2144
2142
|
end
|
|
2145
2143
|
# NOTE: line metrics get applied when AsciiDoc content is converted
|
|
2146
2144
|
cell_line_metrics = nil
|
|
2147
|
-
asciidoc_cell = ::Prawn::Table::Cell::AsciiDoc.new self, (cell_data.merge content: cell.inner_document, padding: body_cell_padding
|
|
2145
|
+
asciidoc_cell = ::Prawn::Table::Cell::AsciiDoc.new self, (cell_data.merge content: cell.inner_document, padding: body_cell_padding)
|
|
2148
2146
|
cell_data = { content: asciidoc_cell }
|
|
2149
2147
|
end
|
|
2150
2148
|
if cell_line_metrics
|
|
@@ -2190,17 +2188,17 @@ module Asciidoctor
|
|
|
2190
2188
|
|
|
2191
2189
|
rect_side_names = [:top, :right, :bottom, :left]
|
|
2192
2190
|
grid_axis_names = [:rows, :cols]
|
|
2193
|
-
border_color = (rect_side_names.zip expand_rect_values theme.table_border_color,
|
|
2191
|
+
border_color = (rect_side_names.zip expand_rect_values theme.table_border_color, theme.base_border_color).to_h
|
|
2194
2192
|
border_style = (rect_side_names.zip (expand_rect_values theme.table_border_style, :solid).map(&:to_sym)).to_h
|
|
2195
|
-
border_width = (rect_side_names.zip expand_rect_values theme.table_border_width,
|
|
2196
|
-
grid_color = (grid_axis_names.zip expand_grid_values (theme.table_grid_color || [border_color[:top], border_color[:left]]),
|
|
2193
|
+
border_width = (rect_side_names.zip expand_rect_values theme.table_border_width, theme.base_border_width).to_h
|
|
2194
|
+
grid_color = (grid_axis_names.zip expand_grid_values (theme.table_grid_color || [border_color[:top], border_color[:left]]), theme.base_border_color).to_h
|
|
2197
2195
|
grid_style = (grid_axis_names.zip (expand_grid_values (theme.table_grid_style || [border_style[:top], border_style[:left]]), :solid).map(&:to_sym)).to_h
|
|
2198
|
-
grid_width = (grid_axis_names.zip expand_grid_values theme.table_grid_width,
|
|
2196
|
+
grid_width = (grid_axis_names.zip expand_grid_values (theme.table_grid_width || [border_width[:top], border_width[:left]]), theme.base_border_width).to_h
|
|
2199
2197
|
|
|
2200
2198
|
if table_header_size
|
|
2201
2199
|
head_border_bottom_color = theme.table_head_border_bottom_color || grid_color[:rows]
|
|
2202
2200
|
head_border_bottom_style = theme.table_head_border_bottom_style&.to_sym || grid_style[:rows]
|
|
2203
|
-
head_border_bottom_width = theme.table_head_border_bottom_width || grid_width[:rows]
|
|
2201
|
+
head_border_bottom_width = theme.table_head_border_bottom_width || (grid_width[:rows] * 2.5)
|
|
2204
2202
|
end
|
|
2205
2203
|
|
|
2206
2204
|
case (grid = node.attr 'grid', 'all', 'table-grid')
|
|
@@ -2270,7 +2268,7 @@ module Asciidoctor
|
|
|
2270
2268
|
table table_data, table_settings do
|
|
2271
2269
|
# NOTE: call width to capture resolved table width
|
|
2272
2270
|
table_width = width
|
|
2273
|
-
@pdf.
|
|
2271
|
+
@pdf.ink_table_caption node, alignment, table_width, caption_max_width if node.title? && caption_side == :top
|
|
2274
2272
|
# NOTE: align using padding instead of bounding_box as prawn-table does
|
|
2275
2273
|
# using a bounding_box across pages mangles the margin box of subsequent pages
|
|
2276
2274
|
if alignment != :left && table_width != (this_bounds = @pdf.bounds).width
|
|
@@ -2343,7 +2341,7 @@ module Asciidoctor
|
|
|
2343
2341
|
bounds.subtract_left_padding left_padding
|
|
2344
2342
|
bounds.subtract_right_padding right_padding if right_padding
|
|
2345
2343
|
end
|
|
2346
|
-
|
|
2344
|
+
ink_table_caption node, alignment, table_width, caption_max_width, caption_side if node.title? && caption_side == :bottom
|
|
2347
2345
|
theme_margin :block, :bottom, (next_enclosed_block node)
|
|
2348
2346
|
rescue ::Prawn::Errors::CannotFit
|
|
2349
2347
|
log :error, (message_with_context 'cannot fit contents of table cell into specified column width', source_location: node.source_location)
|
|
@@ -2407,7 +2405,7 @@ module Asciidoctor
|
|
|
2407
2405
|
@index.categories.each do |category|
|
|
2408
2406
|
# NOTE: cursor method always returns 0 inside column_box; breaks reference_bounds.move_past_bottom
|
|
2409
2407
|
bounds.move_past_bottom if space_needed_for_category > y - reference_bounds.absolute_bottom
|
|
2410
|
-
|
|
2408
|
+
ink_prose category.name,
|
|
2411
2409
|
align: :left,
|
|
2412
2410
|
inline_format: false,
|
|
2413
2411
|
margin_bottom: @theme.description_list_term_spacing,
|
|
@@ -2435,7 +2433,7 @@ module Asciidoctor
|
|
|
2435
2433
|
text = %(#{text}, #{pagenums.join ', '})
|
|
2436
2434
|
end
|
|
2437
2435
|
subterm_indent = @theme.description_list_description_indent
|
|
2438
|
-
|
|
2436
|
+
ink_prose text, align: :left, margin: 0, hanging_indent: subterm_indent * 2
|
|
2439
2437
|
indent subterm_indent do
|
|
2440
2438
|
term.subterms.each do |subterm|
|
|
2441
2439
|
convert_index_list_item subterm
|
|
@@ -2723,7 +2721,7 @@ module Asciidoctor
|
|
|
2723
2721
|
end
|
|
2724
2722
|
|
|
2725
2723
|
# Returns a Boolean indicating whether the title page was created
|
|
2726
|
-
def
|
|
2724
|
+
def ink_title_page doc
|
|
2727
2725
|
return unless doc.header? && !doc.notitle && @theme.title_page != false
|
|
2728
2726
|
|
|
2729
2727
|
# NOTE: a new page may have already been started at this point, so decide what to do with it
|
|
@@ -2799,7 +2797,7 @@ module Asciidoctor
|
|
|
2799
2797
|
move_down @theme.title_page_title_margin_top || 0
|
|
2800
2798
|
indent (@theme.title_page_title_margin_left || 0), (@theme.title_page_title_margin_right || 0) do
|
|
2801
2799
|
theme_font :title_page_title do
|
|
2802
|
-
|
|
2800
|
+
ink_prose doctitle.main, align: title_align, margin: 0
|
|
2803
2801
|
end
|
|
2804
2802
|
end
|
|
2805
2803
|
move_down @theme.title_page_title_margin_bottom || 0
|
|
@@ -2808,7 +2806,7 @@ module Asciidoctor
|
|
|
2808
2806
|
move_down @theme.title_page_subtitle_margin_top || 0
|
|
2809
2807
|
indent (@theme.title_page_subtitle_margin_left || 0), (@theme.title_page_subtitle_margin_right || 0) do
|
|
2810
2808
|
theme_font :title_page_subtitle do
|
|
2811
|
-
|
|
2809
|
+
ink_prose subtitle, align: title_align, margin: 0
|
|
2812
2810
|
end
|
|
2813
2811
|
end
|
|
2814
2812
|
move_down @theme.title_page_subtitle_margin_bottom || 0
|
|
@@ -2833,7 +2831,7 @@ module Asciidoctor
|
|
|
2833
2831
|
end
|
|
2834
2832
|
end.join @theme.title_page_authors_delimiter
|
|
2835
2833
|
theme_font :title_page_authors do
|
|
2836
|
-
|
|
2834
|
+
ink_prose authors, align: title_align, margin: 0, normalize: true
|
|
2837
2835
|
end
|
|
2838
2836
|
end
|
|
2839
2837
|
move_down @theme.title_page_authors_margin_bottom || 0
|
|
@@ -2846,18 +2844,18 @@ module Asciidoctor
|
|
|
2846
2844
|
end
|
|
2847
2845
|
indent (@theme.title_page_revision_margin_left || 0), (@theme.title_page_revision_margin_right || 0) do
|
|
2848
2846
|
theme_font :title_page_revision do
|
|
2849
|
-
|
|
2847
|
+
ink_prose revision_text, align: title_align, margin: 0, normalize: false
|
|
2850
2848
|
end
|
|
2851
2849
|
end
|
|
2852
2850
|
move_down @theme.title_page_revision_margin_bottom || 0
|
|
2853
2851
|
end
|
|
2854
2852
|
end
|
|
2855
2853
|
|
|
2856
|
-
|
|
2854
|
+
ink_prose DummyText, margin: 0, line_height: 1, normalize: false if page.empty?
|
|
2857
2855
|
true
|
|
2858
2856
|
end
|
|
2859
2857
|
|
|
2860
|
-
def
|
|
2858
|
+
def ink_cover_page doc, face
|
|
2861
2859
|
image_path, image_opts = resolve_background_image doc, @theme, %(#{face}-cover-image), theme_key: %(cover_#{face}_image).to_sym, symbolic_paths: ['', '~']
|
|
2862
2860
|
if image_path
|
|
2863
2861
|
if image_path.empty?
|
|
@@ -2903,7 +2901,7 @@ module Asciidoctor
|
|
|
2903
2901
|
|
|
2904
2902
|
def start_new_chapter chapter
|
|
2905
2903
|
start_new_page unless at_page_top?
|
|
2906
|
-
# TODO: must call update_colors before advancing to next page if start_new_page is called in
|
|
2904
|
+
# TODO: must call update_colors before advancing to next page if start_new_page is called in ink_chapter_title
|
|
2907
2905
|
start_new_page if @ppbook && verso_page? && !(chapter.option? 'nonfacing')
|
|
2908
2906
|
end
|
|
2909
2907
|
|
|
@@ -2916,11 +2914,11 @@ module Asciidoctor
|
|
|
2916
2914
|
start_page = page
|
|
2917
2915
|
theme_font :heading, level: opts[:level] do
|
|
2918
2916
|
if opts[:part]
|
|
2919
|
-
|
|
2917
|
+
ink_part_title sect, title, opts
|
|
2920
2918
|
elsif opts[:chapterlike]
|
|
2921
|
-
|
|
2919
|
+
ink_chapter_title sect, title, opts
|
|
2922
2920
|
else
|
|
2923
|
-
|
|
2921
|
+
ink_general_heading sect, title, opts
|
|
2924
2922
|
end
|
|
2925
2923
|
end
|
|
2926
2924
|
if page == start_page
|
|
@@ -2931,64 +2929,81 @@ module Asciidoctor
|
|
|
2931
2929
|
start_new_page if orphaned
|
|
2932
2930
|
else
|
|
2933
2931
|
theme_font :heading, level: (hlevel = opts[:level]) do
|
|
2934
|
-
|
|
2935
|
-
|
|
2936
|
-
|
|
2937
|
-
|
|
2938
|
-
|
|
2939
|
-
|
|
2940
|
-
|
|
2932
|
+
h_padding_t, h_padding_r, h_padding_b, h_padding_l = expand_padding_value @theme[%(heading_h#{hlevel}_padding)]
|
|
2933
|
+
h_fits = indent h_padding_l, h_padding_r do
|
|
2934
|
+
# FIXME: this height doesn't account for impact of text transform or inline formatting
|
|
2935
|
+
heading_h = (height_of_typeset_text title) +
|
|
2936
|
+
(@theme[%(heading_h#{hlevel}_margin_top)] || @theme.heading_margin_top) +
|
|
2937
|
+
(@theme[%(heading_h#{hlevel}_margin_bottom)] || @theme.heading_margin_bottom) + h_padding_t + h_padding_b
|
|
2938
|
+
heading_h += @theme.heading_min_height_after if @theme.heading_min_height_after && sect.blocks?
|
|
2939
|
+
cursor >= heading_h
|
|
2940
|
+
end
|
|
2941
|
+
start_new_page unless h_fits
|
|
2941
2942
|
end
|
|
2942
2943
|
end
|
|
2943
2944
|
nil
|
|
2944
2945
|
end
|
|
2945
2946
|
|
|
2946
|
-
def
|
|
2947
|
-
|
|
2947
|
+
def ink_chapter_title node, title, opts = {}
|
|
2948
|
+
ink_general_heading node, title, (opts.merge outdent: true)
|
|
2948
2949
|
end
|
|
2949
2950
|
|
|
2950
|
-
alias
|
|
2951
|
+
alias ink_part_title ink_chapter_title
|
|
2951
2952
|
|
|
2952
|
-
def
|
|
2953
|
-
|
|
2953
|
+
def ink_general_heading _node, title, opts = {}
|
|
2954
|
+
ink_heading title, opts
|
|
2954
2955
|
end
|
|
2955
2956
|
|
|
2956
|
-
# NOTE:
|
|
2957
|
-
def
|
|
2958
|
-
|
|
2957
|
+
# NOTE: ink_heading doesn't set the theme font because it's used for various types of headings
|
|
2958
|
+
def ink_heading string, opts = {}
|
|
2959
|
+
if (h_level = opts[:level])
|
|
2960
|
+
h_category = %(heading_h#{h_level})
|
|
2961
|
+
end
|
|
2959
2962
|
unless (top_margin = (margin = (opts.delete :margin)) || (opts.delete :margin_top))
|
|
2960
2963
|
if at_page_top?
|
|
2961
|
-
if
|
|
2964
|
+
if h_category && (top_margin = @theme[%(#{h_category}_margin_page_top)] || @theme.heading_margin_page_top) > 0
|
|
2962
2965
|
move_down top_margin
|
|
2963
2966
|
end
|
|
2964
2967
|
top_margin = 0
|
|
2965
2968
|
else
|
|
2966
|
-
top_margin = (
|
|
2969
|
+
top_margin = (h_category ? @theme[%(#{h_category}_margin_top)] : nil) || @theme.heading_margin_top
|
|
2967
2970
|
end
|
|
2968
2971
|
end
|
|
2969
|
-
bot_margin = margin || (opts.delete :margin_bottom) || (
|
|
2972
|
+
bot_margin = margin || (opts.delete :margin_bottom) || (h_category ? @theme[%(#{h_category}_margin_bottom)] : nil) || @theme.heading_margin_bottom
|
|
2970
2973
|
if (transform = resolve_text_transform opts)
|
|
2971
2974
|
string = transform_text string, transform
|
|
2972
2975
|
end
|
|
2973
2976
|
outdent_section opts.delete :outdent do
|
|
2974
2977
|
margin_top top_margin
|
|
2975
|
-
|
|
2976
|
-
|
|
2977
|
-
|
|
2978
|
-
|
|
2979
|
-
|
|
2978
|
+
start_cursor = cursor
|
|
2979
|
+
start_page_number = page_number
|
|
2980
|
+
pad_box h_category ? @theme[%(#{h_category}_padding)] : nil do
|
|
2981
|
+
# QUESTION: should we move inherited styles to typeset_text?
|
|
2982
|
+
if (inherited = apply_text_decoration font_styles, :heading, h_level).empty?
|
|
2983
|
+
inline_format_opts = true
|
|
2984
|
+
else
|
|
2985
|
+
inline_format_opts = [{ inherited: inherited }]
|
|
2986
|
+
end
|
|
2987
|
+
typeset_text string, (calc_line_metrics (opts.delete :line_height) || @base_line_height), {
|
|
2988
|
+
color: @font_color,
|
|
2989
|
+
inline_format: inline_format_opts,
|
|
2990
|
+
align: @base_text_align.to_sym,
|
|
2991
|
+
}.merge(opts)
|
|
2992
|
+
end
|
|
2993
|
+
if h_category && @theme[%(#{h_category}_border_width)] &&
|
|
2994
|
+
@theme[%(#{h_category}_border_color)] && page_number == start_page_number
|
|
2995
|
+
float do
|
|
2996
|
+
bounding_box [bounds.left, start_cursor], width: bounds.width, height: start_cursor - cursor do
|
|
2997
|
+
theme_fill_and_stroke_bounds h_category
|
|
2998
|
+
end
|
|
2999
|
+
end
|
|
2980
3000
|
end
|
|
2981
|
-
typeset_text string, (calc_line_metrics (opts.delete :line_height) || @base_line_height), {
|
|
2982
|
-
color: @font_color,
|
|
2983
|
-
inline_format: inline_format_opts,
|
|
2984
|
-
align: @base_text_align.to_sym,
|
|
2985
|
-
}.merge(opts)
|
|
2986
3001
|
margin_bottom bot_margin
|
|
2987
3002
|
end
|
|
2988
3003
|
end
|
|
2989
3004
|
|
|
2990
3005
|
# NOTE: inline_format is true by default
|
|
2991
|
-
def
|
|
3006
|
+
def ink_prose string, opts = {}
|
|
2992
3007
|
top_margin = (margin = (opts.delete :margin)) || (opts.delete :margin_top) || 0
|
|
2993
3008
|
bot_margin = margin || (opts.delete :margin_bottom) || @theme.prose_margin_bottom
|
|
2994
3009
|
if (transform = resolve_text_transform opts)
|
|
@@ -3035,13 +3050,13 @@ module Asciidoctor
|
|
|
3035
3050
|
# The subject argument can either be a String or an AbstractNode. If
|
|
3036
3051
|
# subject is an AbstractNode, only call this method if the node has a
|
|
3037
3052
|
# title (i.e., subject.title? returns true).
|
|
3038
|
-
def
|
|
3053
|
+
def ink_caption subject, opts = {}
|
|
3039
3054
|
if opts.delete :dry_run
|
|
3040
3055
|
force_top_margin = !at_page_top? if (force_top_margin = opts.delete :force_top_margin).nil?
|
|
3041
3056
|
return (dry_run keep_together: true, single_page: :enforce do
|
|
3042
3057
|
# TODO: encapsulate this logic to force top margin to be applied
|
|
3043
3058
|
margin_box.instance_variable_set :@y, margin_box.absolute_top + 0.0001 if force_top_margin
|
|
3044
|
-
|
|
3059
|
+
ink_caption subject, opts
|
|
3045
3060
|
end).single_page_height
|
|
3046
3061
|
end
|
|
3047
3062
|
if ::Asciidoctor::AbstractBlock === subject
|
|
@@ -3111,7 +3126,7 @@ module Asciidoctor
|
|
|
3111
3126
|
float { bounding_box(fill_at, width: container_width, height: caption_height) { fill_bounds bg_color } }
|
|
3112
3127
|
end
|
|
3113
3128
|
indent(*indent_by) do
|
|
3114
|
-
|
|
3129
|
+
ink_prose string, ({
|
|
3115
3130
|
margin_top: margin[:top],
|
|
3116
3131
|
margin_bottom: margin[:bottom],
|
|
3117
3132
|
align: text_align,
|
|
@@ -3125,16 +3140,22 @@ module Asciidoctor
|
|
|
3125
3140
|
end
|
|
3126
3141
|
|
|
3127
3142
|
# Render the caption for a table and return the height of the rendered content
|
|
3128
|
-
def
|
|
3129
|
-
|
|
3143
|
+
def ink_table_caption node, table_alignment = :left, table_width = nil, max_width = nil, side = :top
|
|
3144
|
+
ink_caption node, category: :table, side: side, block_align: table_alignment, block_width: table_width, max_width: max_width
|
|
3130
3145
|
end
|
|
3131
3146
|
|
|
3132
3147
|
def allocate_toc doc, toc_num_levels, toc_start_cursor, title_page_on
|
|
3133
|
-
|
|
3148
|
+
toc_start_page_number = page_number
|
|
3149
|
+
to_page = nil
|
|
3134
3150
|
extent = dry_run onto: self do
|
|
3135
|
-
|
|
3151
|
+
to_page = (ink_toc doc, toc_num_levels, toc_start_page_number, toc_start_cursor).end
|
|
3136
3152
|
margin_bottom @theme.block_margin_bottom unless title_page_on
|
|
3137
3153
|
end
|
|
3154
|
+
# NOTE: patch for custom converters that allocate extra TOC pages without actually creating them
|
|
3155
|
+
if to_page > extent.to.page
|
|
3156
|
+
extent.to.page = to_page
|
|
3157
|
+
extent.to.cursor = bounds.height
|
|
3158
|
+
end
|
|
3138
3159
|
# NOTE: reserve pages for the toc; leaves cursor on page after last page in toc
|
|
3139
3160
|
if title_page_on
|
|
3140
3161
|
extent.each_page { start_new_page }
|
|
@@ -3146,14 +3167,14 @@ module Asciidoctor
|
|
|
3146
3167
|
end
|
|
3147
3168
|
|
|
3148
3169
|
# NOTE: num_front_matter_pages not used during a dry run
|
|
3149
|
-
def
|
|
3170
|
+
def ink_toc doc, num_levels, toc_page_number, start_cursor, num_front_matter_pages = 0
|
|
3150
3171
|
go_to_page toc_page_number unless (page_number == toc_page_number) || scratch?
|
|
3151
3172
|
start_page_number = page_number
|
|
3152
3173
|
move_cursor_to start_cursor
|
|
3153
3174
|
unless (toc_title = doc.attr 'toc-title').nil_or_empty?
|
|
3154
3175
|
theme_font_cascade [[:heading, level: 2], :toc_title] do
|
|
3155
3176
|
toc_title_align = (@theme.toc_title_text_align || @theme.heading_h2_text_align || @theme.heading_text_align || @base_text_align).to_sym
|
|
3156
|
-
|
|
3177
|
+
ink_general_heading doc, toc_title, align: toc_title_align, level: 2, outdent: true, role: :toctitle
|
|
3157
3178
|
end
|
|
3158
3179
|
end
|
|
3159
3180
|
# QUESTION: should we skip this whole method if num_levels < 0?
|
|
@@ -3178,7 +3199,7 @@ module Asciidoctor
|
|
|
3178
3199
|
}
|
|
3179
3200
|
end
|
|
3180
3201
|
theme_margin :toc, :top
|
|
3181
|
-
|
|
3202
|
+
ink_toc_level doc.sections, num_levels, dot_leader, num_front_matter_pages
|
|
3182
3203
|
end
|
|
3183
3204
|
# NOTE: range must be calculated relative to toc_page_number; absolute page number in scratch document is arbitrary
|
|
3184
3205
|
toc_page_numbers = (toc_page_number..(toc_page_number + (page_number - start_page_number)))
|
|
@@ -3186,7 +3207,7 @@ module Asciidoctor
|
|
|
3186
3207
|
toc_page_numbers
|
|
3187
3208
|
end
|
|
3188
3209
|
|
|
3189
|
-
def
|
|
3210
|
+
def ink_toc_level sections, num_levels, dot_leader, num_front_matter_pages
|
|
3190
3211
|
# NOTE: font options aren't always reliable, so store size separately
|
|
3191
3212
|
toc_font_info = theme_font :toc do
|
|
3192
3213
|
{ font: font, size: @font_size }
|
|
@@ -3202,7 +3223,7 @@ module Asciidoctor
|
|
|
3202
3223
|
if scratch?
|
|
3203
3224
|
indent 0, pgnum_label_placeholder_width do
|
|
3204
3225
|
# NOTE: must wrap title in empty anchor element in case links are styled with different font family / size
|
|
3205
|
-
|
|
3226
|
+
ink_prose sect_title, anchor: true, normalize: false, hanging_indent: hanging_indent, normalize_line_height: true, margin: 0
|
|
3206
3227
|
end
|
|
3207
3228
|
else
|
|
3208
3229
|
physical_pgnum = sect.attr 'pdf-page-start'
|
|
@@ -3247,7 +3268,7 @@ module Asciidoctor
|
|
|
3247
3268
|
end
|
|
3248
3269
|
end
|
|
3249
3270
|
indent @theme.toc_indent do
|
|
3250
|
-
|
|
3271
|
+
ink_toc_level sect.sections, num_levels_for_sect, dot_leader, num_front_matter_pages
|
|
3251
3272
|
end if num_levels_for_sect > sect.level
|
|
3252
3273
|
end
|
|
3253
3274
|
end
|
|
@@ -3275,15 +3296,15 @@ module Asciidoctor
|
|
|
3275
3296
|
icon_data
|
|
3276
3297
|
end
|
|
3277
3298
|
|
|
3278
|
-
# TODO: delegate to
|
|
3279
|
-
def
|
|
3299
|
+
# TODO: delegate to ink_page_header and ink_page_footer per page
|
|
3300
|
+
def ink_running_content periphery, doc, skip = [1, 1], body_start_page_number = 1
|
|
3280
3301
|
skip_pages, skip_pagenums = skip
|
|
3281
3302
|
# NOTE: find and advance to first non-imported content page to use as model page
|
|
3282
|
-
return unless (
|
|
3283
|
-
|
|
3303
|
+
return unless (content_start_page_number = state.pages[skip_pages..-1].index {|it| !it.imported_page? })
|
|
3304
|
+
content_start_page_number += (skip_pages + 1)
|
|
3284
3305
|
num_pages = page_count
|
|
3285
3306
|
prev_page_number = page_number
|
|
3286
|
-
go_to_page
|
|
3307
|
+
go_to_page content_start_page_number
|
|
3287
3308
|
|
|
3288
3309
|
# FIXME: probably need to treat doctypes differently
|
|
3289
3310
|
is_book = doc.doctype == 'book'
|
|
@@ -3379,7 +3400,7 @@ module Asciidoctor
|
|
|
3379
3400
|
pagenums_enabled = doc.attr? 'pagenums'
|
|
3380
3401
|
periphery_layout_cache = {}
|
|
3381
3402
|
# NOTE: this block is invoked during PDF generation, after #write -> #render_file and thus after #convert_document
|
|
3382
|
-
repeat (
|
|
3403
|
+
repeat (content_start_page_number..num_pages), dynamic: true do
|
|
3383
3404
|
pgnum = page_number
|
|
3384
3405
|
# NOTE: don't write on pages which are imported / inserts (otherwise we can get a corrupt PDF)
|
|
3385
3406
|
next if page.imported_page? || (disable_on_pages.include? pgnum)
|
|
@@ -3501,7 +3522,7 @@ module Asciidoctor
|
|
|
3501
3522
|
trim_content_margin_recto = @theme[%(#{periphery}_recto_content_margin)] || @theme[%(#{periphery}_content_margin)] || [0, 'inherit', 0, 'inherit']
|
|
3502
3523
|
trim_content_margin_recto = (expand_margin_value trim_content_margin_recto).map.with_index {|v, i| i.odd? && v == 'inherit' ? page_margin_recto[i] - trim_margin_recto[i] : v.to_f }
|
|
3503
3524
|
if (trim_padding_recto = @theme[%(#{periphery}_recto_padding)] || @theme[%(#{periphery}_padding)])
|
|
3504
|
-
trim_padding_recto = (
|
|
3525
|
+
trim_padding_recto = (expand_padding_value trim_padding_recto).map.with_index {|v, i| v + trim_content_margin_recto[i] }
|
|
3505
3526
|
else
|
|
3506
3527
|
trim_padding_recto = trim_content_margin_recto
|
|
3507
3528
|
end
|
|
@@ -3511,7 +3532,7 @@ module Asciidoctor
|
|
|
3511
3532
|
trim_content_margin_verso = @theme[%(#{periphery}_verso_content_margin)] || @theme[%(#{periphery}_content_margin)] || [0, 'inherit', 0, 'inherit']
|
|
3512
3533
|
trim_content_margin_verso = (expand_margin_value trim_content_margin_verso).map.with_index {|v, i| i.odd? && v == 'inherit' ? page_margin_verso[i] - trim_margin_verso[i] : v.to_f }
|
|
3513
3534
|
if (trim_padding_verso = @theme[%(#{periphery}_verso_padding)] || @theme[%(#{periphery}_padding)])
|
|
3514
|
-
trim_padding_verso = (
|
|
3535
|
+
trim_padding_verso = (expand_padding_value trim_padding_verso).map.with_index {|v, i| v + trim_content_margin_verso[i] }
|
|
3515
3536
|
else
|
|
3516
3537
|
trim_padding_verso = trim_content_margin_verso
|
|
3517
3538
|
end
|
|
@@ -3843,7 +3864,7 @@ module Asciidoctor
|
|
|
3843
3864
|
def theme_fill_and_stroke_block category, extent, opts = {}
|
|
3844
3865
|
node_with_caption = nil unless (node_with_caption = opts[:caption_node])&.title?
|
|
3845
3866
|
unless extent
|
|
3846
|
-
|
|
3867
|
+
ink_caption node_with_caption, category: category if node_with_caption
|
|
3847
3868
|
return
|
|
3848
3869
|
end
|
|
3849
3870
|
if (b_width = (opts.key? :border_width) ? opts[:border_width] : @theme[%(#{category}_border_width)])
|
|
@@ -3857,7 +3878,7 @@ module Asciidoctor
|
|
|
3857
3878
|
bg_color = nil
|
|
3858
3879
|
end
|
|
3859
3880
|
unless b_width || bg_color
|
|
3860
|
-
|
|
3881
|
+
ink_caption node_with_caption, category: category if node_with_caption
|
|
3861
3882
|
return
|
|
3862
3883
|
end
|
|
3863
3884
|
if (b_color = @theme[%(#{category}_border_color)]) == 'transparent'
|
|
@@ -3875,7 +3896,7 @@ module Asciidoctor
|
|
|
3875
3896
|
else # let page background cut into block background; guarantees b_width is set
|
|
3876
3897
|
b_shift, b_gap_color = (b_width ||= 0.5) * 0.5, @page_bg_color
|
|
3877
3898
|
end
|
|
3878
|
-
|
|
3899
|
+
ink_caption node_with_caption, category: category if node_with_caption
|
|
3879
3900
|
extent.from.page += 1 unless extent.from.page == page_number # sanity check
|
|
3880
3901
|
float do
|
|
3881
3902
|
extent.each_page do |first_page, last_page|
|
|
@@ -4012,9 +4033,7 @@ module Asciidoctor
|
|
|
4012
4033
|
# NOTE: it also removes zero-width spaces
|
|
4013
4034
|
arranger.finalize_line
|
|
4014
4035
|
actual_width = width_of_fragments arranger.fragments
|
|
4015
|
-
|
|
4016
|
-
padding = ::Array.new 4, padding
|
|
4017
|
-
end
|
|
4036
|
+
padding = expand_padding_value @theme[%(#{category}_padding)]
|
|
4018
4037
|
if actual_width > (available_width = bounds.width - padding[3].to_f - padding[1].to_f)
|
|
4019
4038
|
adjusted_font_size = ((available_width * font_size).to_f / actual_width).truncate 4
|
|
4020
4039
|
if (min = @theme[%(#{category}_font_size_min)] || @theme.base_font_size_min) && adjusted_font_size < min
|
|
@@ -4596,26 +4615,34 @@ module Asciidoctor
|
|
|
4596
4615
|
end
|
|
4597
4616
|
|
|
4598
4617
|
# Deprecated method names
|
|
4599
|
-
alias layout_footnotes
|
|
4600
|
-
alias layout_title_page
|
|
4601
|
-
alias layout_cover_page
|
|
4602
|
-
alias layout_chapter_title
|
|
4603
|
-
alias layout_part_title
|
|
4604
|
-
alias layout_general_heading
|
|
4605
|
-
alias layout_heading
|
|
4606
|
-
alias layout_prose
|
|
4607
|
-
alias layout_caption
|
|
4608
|
-
alias layout_table_caption
|
|
4609
|
-
alias layout_toc
|
|
4610
|
-
alias layout_toc_level
|
|
4611
|
-
alias layout_running_content
|
|
4612
|
-
|
|
4618
|
+
alias layout_footnotes ink_footnotes
|
|
4619
|
+
alias layout_title_page ink_title_page
|
|
4620
|
+
alias layout_cover_page ink_cover_page
|
|
4621
|
+
alias layout_chapter_title ink_chapter_title
|
|
4622
|
+
alias layout_part_title ink_part_title
|
|
4623
|
+
alias layout_general_heading ink_general_heading
|
|
4624
|
+
alias layout_heading ink_heading
|
|
4625
|
+
alias layout_prose ink_prose
|
|
4626
|
+
alias layout_caption ink_caption
|
|
4627
|
+
alias layout_table_caption ink_table_caption
|
|
4628
|
+
alias layout_toc ink_toc
|
|
4629
|
+
alias layout_toc_level ink_toc_level
|
|
4630
|
+
alias layout_running_content ink_running_content
|
|
4631
|
+
|
|
4632
|
+
# intercepts "class CustomPDFConverter < (Asciidoctor::Converter.for 'pdf')"
|
|
4613
4633
|
def self.method_added method
|
|
4614
4634
|
if (method_name = method.to_s).start_with? 'layout_'
|
|
4615
|
-
alias_method %(
|
|
4635
|
+
alias_method %(ink_#{method_name.slice 7, method_name.length}).to_sym, method
|
|
4616
4636
|
end
|
|
4617
4637
|
end
|
|
4618
4638
|
|
|
4639
|
+
# intercepts "(Asciidoctor::Converter.for 'pdf').prepend CustomConverterExtensions"
|
|
4640
|
+
def self.prepend *mods
|
|
4641
|
+
super
|
|
4642
|
+
mods.each {|mod| (mod.instance_methods false).each {|method| method_added method } }
|
|
4643
|
+
self
|
|
4644
|
+
end
|
|
4645
|
+
|
|
4619
4646
|
private
|
|
4620
4647
|
|
|
4621
4648
|
def add_link_to_image uri, image_info, image_opts
|
|
@@ -538,17 +538,20 @@ module Asciidoctor
|
|
|
538
538
|
# Example:
|
|
539
539
|
#
|
|
540
540
|
# pad_box 20 do
|
|
541
|
-
# text 'A paragraph inside a blox with even padding
|
|
541
|
+
# text 'A paragraph inside a blox with even padding from all edges.'
|
|
542
542
|
# end
|
|
543
543
|
#
|
|
544
|
-
# pad_box [10,
|
|
545
|
-
# text '
|
|
544
|
+
# pad_box [10, 5] do
|
|
545
|
+
# text 'A paragraph inside a box with different padding from ends and sides.'
|
|
546
|
+
# end
|
|
547
|
+
#
|
|
548
|
+
# pad_box [5, 10, 15, 20] do
|
|
549
|
+
# text 'A paragraph inside a box with different padding from each edge.'
|
|
546
550
|
# end
|
|
547
551
|
#
|
|
548
552
|
def pad_box padding, node = nil
|
|
549
553
|
if padding
|
|
550
|
-
|
|
551
|
-
p_top, p_right, p_bottom, p_left = ::Array === padding ? padding : (::Array.new 4, padding)
|
|
554
|
+
p_top, p_right, p_bottom, p_left = expand_padding_value padding
|
|
552
555
|
# logic is intentionally inlined
|
|
553
556
|
begin
|
|
554
557
|
if node && ((last_block = node).content_model != :compound || (last_block = node.blocks[-1])&.context == :paragraph)
|
|
@@ -560,8 +563,8 @@ module Asciidoctor
|
|
|
560
563
|
bounds.add_left_padding p_left
|
|
561
564
|
bounds.add_right_padding p_right
|
|
562
565
|
yield
|
|
563
|
-
cursor > p_bottom ? (move_down p_bottom) : reference_bounds.move_past_bottom unless at_page_top?
|
|
564
566
|
ensure
|
|
567
|
+
cursor > p_bottom ? (move_down p_bottom) : reference_bounds.move_past_bottom unless at_page_top?
|
|
565
568
|
@bottom_gutters.pop
|
|
566
569
|
bounds.subtract_left_padding p_left
|
|
567
570
|
bounds.subtract_right_padding p_right
|
|
@@ -576,26 +579,25 @@ module Asciidoctor
|
|
|
576
579
|
end
|
|
577
580
|
|
|
578
581
|
def expand_padding_value shorthand
|
|
579
|
-
|
|
580
|
-
if ::Array ===
|
|
581
|
-
case
|
|
582
|
+
(@edge_shorthand_cache ||= ::Hash.new do |store, key|
|
|
583
|
+
if ::Array === key
|
|
584
|
+
case key.size
|
|
582
585
|
when 1
|
|
583
|
-
|
|
586
|
+
value = [(value0 = key[0] || 0), value0, value0, value0]
|
|
584
587
|
when 2
|
|
585
|
-
|
|
588
|
+
value = [(value0 = key[0] || 0), (value1 = key[1] || 0), value0, value1]
|
|
586
589
|
when 3
|
|
587
|
-
|
|
590
|
+
value = [key[0] || 0, (value1 = key[1] || 0), key[2] || 0, value1]
|
|
588
591
|
when 4
|
|
589
|
-
|
|
592
|
+
value = key.map {|it| it || 0 }
|
|
590
593
|
else
|
|
591
|
-
|
|
594
|
+
value = (key.slice 0, 4).map {|it| it || 0 }
|
|
592
595
|
end
|
|
593
596
|
else
|
|
594
|
-
|
|
597
|
+
value = [(value0 = key || 0), value0, value0, value0]
|
|
595
598
|
end
|
|
596
|
-
|
|
597
|
-
end
|
|
598
|
-
padding.dup
|
|
599
|
+
store[key] = value
|
|
600
|
+
end)[shorthand]
|
|
599
601
|
end
|
|
600
602
|
|
|
601
603
|
alias expand_margin_value expand_padding_value
|
|
@@ -700,7 +702,8 @@ module Asciidoctor
|
|
|
700
702
|
def fill_and_stroke_bounds f_color = fill_color, s_color = stroke_color, options = {}
|
|
701
703
|
no_fill = !f_color || f_color == 'transparent'
|
|
702
704
|
if ::Array === (s_width = options[:line_width] || 0)
|
|
703
|
-
|
|
705
|
+
s_width = [s_width[0], s_width[1], s_width[0], s_width[1]] if s_width.size == 2
|
|
706
|
+
s_width_max = (s_width = s_width.map {|it| it || 0 }).max
|
|
704
707
|
radius = 0
|
|
705
708
|
else
|
|
706
709
|
radius = options[:radius] || 0
|
|
@@ -718,13 +721,19 @@ module Asciidoctor
|
|
|
718
721
|
|
|
719
722
|
# stroke
|
|
720
723
|
if s_width_max
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
+
s_width_top, s_width_right, s_width_bottom, s_width_left = s_width
|
|
725
|
+
projection_top, projection_right, projection_bottom, projection_left = s_width.map {|it| it * 0.5 }
|
|
726
|
+
if s_width_top > 0
|
|
727
|
+
stroke_horizontal_rule s_color, line_width: s_width_top, line_style: options[:line_style], left_projection: projection_left, right_projection: projection_right
|
|
728
|
+
end
|
|
729
|
+
if s_width_right > 0
|
|
730
|
+
stroke_vertical_rule s_color, line_width: s_width_right, line_style: options[:line_style], at: bounds.width, top_projection: projection_top, bottom_projection: projection_bottom
|
|
731
|
+
end
|
|
732
|
+
if s_width_bottom > 0
|
|
733
|
+
stroke_horizontal_rule s_color, line_width: s_width_bottom, line_style: options[:line_style], at: bounds.height, left_projection: projection_left, right_projection: projection_right
|
|
724
734
|
end
|
|
725
|
-
if
|
|
726
|
-
stroke_vertical_rule s_color, line_width:
|
|
727
|
-
stroke_vertical_rule s_color, line_width: s_width_side, line_style: options[:line_style], at: bounds.width
|
|
735
|
+
if s_width_left > 0
|
|
736
|
+
stroke_vertical_rule s_color, line_width: s_width_left, line_style: options[:line_style], top_projection: projection_top, bottom_projection: projection_bottom
|
|
728
737
|
end
|
|
729
738
|
else
|
|
730
739
|
stroke_color s_color
|
|
@@ -759,8 +768,8 @@ module Asciidoctor
|
|
|
759
768
|
rule_y = cursor - (options[:at] || 0)
|
|
760
769
|
rule_style = options[:line_style]
|
|
761
770
|
rule_width = options[:line_width] || 0.5
|
|
762
|
-
rule_x_start = bounds.left
|
|
763
|
-
rule_x_end = bounds.right
|
|
771
|
+
rule_x_start = bounds.left - (options[:left_projection] || 0)
|
|
772
|
+
rule_x_end = bounds.right - (options[:right_projection] || 0)
|
|
764
773
|
save_graphics_state do
|
|
765
774
|
stroke_color rule_color
|
|
766
775
|
case rule_style
|
|
@@ -790,8 +799,8 @@ module Asciidoctor
|
|
|
790
799
|
#
|
|
791
800
|
def stroke_vertical_rule rule_color = stroke_color, options = {}
|
|
792
801
|
rule_x = options[:at] || 0
|
|
793
|
-
rule_y_from = bounds.top
|
|
794
|
-
rule_y_to = bounds.bottom
|
|
802
|
+
rule_y_from = bounds.top + (options[:top_projection] || 0)
|
|
803
|
+
rule_y_to = bounds.bottom - (options[:bottom_projection] || 0)
|
|
795
804
|
rule_style = options[:line_style]
|
|
796
805
|
rule_width = options[:line_width] || 0.5
|
|
797
806
|
save_graphics_state do
|
|
@@ -18,6 +18,7 @@ module Asciidoctor
|
|
|
18
18
|
AmbiguousAlignKeys = %w(base heading heading_h1 heading_h2 heading_h3 heading_h4 heading_h5 heading_h6 title_page abstract abstract_title admonition_label sidebar_title toc_title).each_with_object({}) do |prefix, accum|
|
|
19
19
|
accum[%(#{prefix}_align)] = %(#{prefix}_text_align)
|
|
20
20
|
end
|
|
21
|
+
PaddingBottomHackKeys = %w(example_padding quote_padding sidebar_padding verse_padding)
|
|
21
22
|
|
|
22
23
|
VariableRx = /\$([a-z0-9_-]+)/
|
|
23
24
|
LoneVariableRx = /^\$([a-z0-9_-]+)$/
|
|
@@ -173,6 +174,11 @@ module Asciidoctor
|
|
|
173
174
|
elsif (rekey = AmbiguousAlignKeys[key]) ||
|
|
174
175
|
((key.start_with? 'role_') && (key.end_with? '_align') && (rekey = key.sub RoleAlignKeyRx, '_text_align'))
|
|
175
176
|
data[rekey] = evaluate val, data
|
|
177
|
+
elsif PaddingBottomHackKeys.include? key
|
|
178
|
+
val = evaluate val, data
|
|
179
|
+
# normalize padding hacks for themes designed before the converter had smart margins
|
|
180
|
+
val[2] = val[0] if ::Array === val && val[0].to_f >= 0 && val[2].to_f <= 0
|
|
181
|
+
data[key] = val
|
|
176
182
|
# QUESTION: do we really need to evaluate_math in this case?
|
|
177
183
|
elsif key.end_with? '_color'
|
|
178
184
|
if key == 'table_border_color'
|
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.alpha.
|
|
4
|
+
version: 2.0.0.alpha.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Dan Allen
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2022-
|
|
12
|
+
date: 2022-05-01 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: asciidoctor
|