asciidoctor-multipage 0.0.10 → 0.0.14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/asciidoctor-multipage.rb +79 -26
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ab1f550130f59f72549c38e53b85073052489f9447e9dcfd1122e3ffbc418c8e
|
4
|
+
data.tar.gz: 1984fe6907d211571d822451c90725984c14d22c993195508d6e6992d29ce333
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4566ce596a05c9a60866138d7ef8946121bef05d95648a14a304312a4a632ebcd85dbc077eeff045ef0d94d48b85064d8e15d438e9eb84d19ee4f432177f5b9c
|
7
|
+
data.tar.gz: 9652cb173af11948e16c3ed1d463922f88a233c4118c044ec2b2005095f9b3c9d0478c6f4d5967ff4f3f1b9b4149b709c68932684f21cdf3cc60e12bf68f3d6f
|
@@ -52,6 +52,14 @@ class Asciidoctor::Document
|
|
52
52
|
# nodes are no longer accessible.
|
53
53
|
attr_writer :sectnum
|
54
54
|
|
55
|
+
# A pointer to the original converter (first converter instantiated to
|
56
|
+
# convert the original document). As we create additional documents
|
57
|
+
# ourselves, AsciiDoctor will instantiate additional instances of
|
58
|
+
# MultipageHtml5Converter for each created document. These instances need
|
59
|
+
# to share state, so they can use the original converter instance
|
60
|
+
# for that purpose.
|
61
|
+
attr_accessor :mp_root
|
62
|
+
|
55
63
|
# Override the AbstractBlock sections?() check to enable the Table Of
|
56
64
|
# Contents. This extension may generate short pages that would normally have
|
57
65
|
# no need for a TOC. However, we override the Html5Converter outline() in
|
@@ -77,17 +85,11 @@ class Asciidoctor::Section
|
|
77
85
|
# Sections. The sectnum is saved in section() below.
|
78
86
|
def sectnum(delimiter = '.', append = nil)
|
79
87
|
append ||= (append == false ? '' : delimiter)
|
80
|
-
if @level ==
|
81
|
-
|
82
|
-
elsif @level > 1
|
83
|
-
if @parent.class == Asciidoctor::Section ||
|
84
|
-
(@mplevel && @parent.class == Asciidoctor::Document)
|
88
|
+
if @level > 1 and @parent.class == Asciidoctor::Section ||
|
89
|
+
(@mplevel && @parent.class == Asciidoctor::Document)
|
85
90
|
%(#{@parent.sectnum(delimiter)}#{@numeral}#{append})
|
86
|
-
|
87
|
-
|
88
|
-
end
|
89
|
-
else # @level == 0
|
90
|
-
%(#{Asciidoctor::Helpers.int_to_roman @numeral}#{append})
|
91
|
+
else
|
92
|
+
%(#{@numeral}#{append})
|
91
93
|
end
|
92
94
|
end
|
93
95
|
end
|
@@ -101,6 +103,12 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
|
|
101
103
|
|
102
104
|
attr_accessor :pages
|
103
105
|
|
106
|
+
# contains the entire outline of the top-level document, used
|
107
|
+
# as a guide-rail for creating TOC elements for documents we
|
108
|
+
# split off. Only expected to be set in the top-level converter
|
109
|
+
# (see AsciiDoctor::Document::mp_root)
|
110
|
+
attr_accessor :full_outline
|
111
|
+
|
104
112
|
def initialize(backend, opts = {})
|
105
113
|
@xml_mode = false
|
106
114
|
@void_element_slash = nil
|
@@ -118,8 +126,29 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
|
|
118
126
|
page << block
|
119
127
|
end
|
120
128
|
|
129
|
+
# ensures that the AsciiDoctor::Document::mp_root is correctly
|
130
|
+
# set on the document object. The variable could have already been
|
131
|
+
# set if we created the document ourselves
|
132
|
+
# (see ::MultipageHtml5Converter::convert_section), in which case it's
|
133
|
+
# not changed. If the documented is "nested", then we expect the parent
|
134
|
+
# document to already have it set. Otherwise, this is expected to be
|
135
|
+
# a top-level document, and we assign ourselves as its original converter.
|
136
|
+
def check_root(doc)
|
137
|
+
unless doc.mp_root
|
138
|
+
if doc.nested?
|
139
|
+
doc.mp_root = doc.parent_document.mp_root
|
140
|
+
else
|
141
|
+
doc.mp_root = self
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
121
146
|
# Process Document (either the original full document or a processed page)
|
122
147
|
def convert_document(node)
|
148
|
+
|
149
|
+
# make sure document has original converter reference
|
150
|
+
check_root(node)
|
151
|
+
|
123
152
|
if node.processed
|
124
153
|
# This node (an individual page) can now be handled by
|
125
154
|
# Html5Converter.
|
@@ -166,8 +195,16 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
|
|
166
195
|
# Generate navigation links for all pages
|
167
196
|
generate_nav_links(node)
|
168
197
|
|
169
|
-
# Create and save a skeleton document for generating the TOC lists
|
170
|
-
|
198
|
+
# Create and save a skeleton document for generating the TOC lists,
|
199
|
+
# but don't attempt to create outline for nested documents.
|
200
|
+
unless node.nested?
|
201
|
+
# if the original converter has the @full_outline set already, we are about
|
202
|
+
# to replace it. That's not supposed to happen, and probably means we encountered
|
203
|
+
# a document structure we aren't prepared for. Log an error and move on.
|
204
|
+
logger.error "Regenerating document outline, something wrong?" if node.mp_root.full_outline
|
205
|
+
node.mp_root.full_outline = new_outline_doc(node)
|
206
|
+
end
|
207
|
+
|
171
208
|
# Save the document catalog to use for each part/chapter page.
|
172
209
|
@catalog = node.catalog
|
173
210
|
|
@@ -179,7 +216,7 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
|
|
179
216
|
part = block
|
180
217
|
part.convert
|
181
218
|
text = %(<<#{part.id},#{part.captioned_title}>>)
|
182
|
-
if desc = block.attr('desc') then text << %( – #{desc}) end
|
219
|
+
if (desc = block.attr('desc')) then text << %( – #{desc}) end
|
183
220
|
parts_list << Asciidoctor::ListItem.new(parts_list, text)
|
184
221
|
end
|
185
222
|
end
|
@@ -197,6 +234,8 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
|
|
197
234
|
# Process Document in embeddable mode (either the original full document or a
|
198
235
|
# processed page)
|
199
236
|
def convert_embedded(node)
|
237
|
+
# make sure document has original converter reference
|
238
|
+
check_root(node)
|
200
239
|
if node.processed
|
201
240
|
# This node (an individual page) can now be handled by
|
202
241
|
# Html5Converter.
|
@@ -223,14 +262,14 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
|
|
223
262
|
# NOTE: There are some non-breaking spaces (U+00A0) below, in
|
224
263
|
# the "links <<" lines and "links.join" line.
|
225
264
|
if previous_page != parent_page
|
226
|
-
links << %(← Previous: <<#{previous_page.id}>>)
|
265
|
+
links << %(← #{doc.attr('multipage-nav-previous-label') || "Previous"}: <<#{previous_page.id},#{previous_page.captioned_title}>>)
|
227
266
|
end
|
228
|
-
links << %(↑ Up: <<#{parent_page.id}>>)
|
229
|
-
links << %(⌂ Home: <<#{home_page.id}>>) if home_page != parent_page
|
267
|
+
links << %(↑ #{doc.attr('multipage-nav-up-label') || "Up"}: <<#{parent_page.id},#{parent_page.captioned_title}>>)
|
268
|
+
links << %(⌂ #{doc.attr('multipage-nav-home-label') || "Home"}: <<#{home_page.id},#{home_page.captioned_title}>>) if home_page != parent_page
|
230
269
|
end
|
231
270
|
if page_index != pages.length-1
|
232
271
|
next_page = pages[page_index+1]
|
233
|
-
links << %(Next: <<#{next_page.id}>> →)
|
272
|
+
links << %(#{doc.attr('multipage-nav-next-label') || "Next"}: <<#{next_page.id},#{next_page.captioned_title}>> →)
|
234
273
|
end
|
235
274
|
block = Asciidoctor::Block.new(parent = doc,
|
236
275
|
context = :paragraph,
|
@@ -317,9 +356,17 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
|
|
317
356
|
else
|
318
357
|
attrs = node.role ? %( class="#{node.role}") : ''
|
319
358
|
unless (text = node.text)
|
320
|
-
refid = node.attributes['refid']
|
321
|
-
|
322
|
-
|
359
|
+
if AbstractNode === (ref = (@refs ||= node.document.catalog[:refs])[refid = node.attributes['refid']] || (refid.nil_or_empty? ? (top = get_root_document node) : nil))
|
360
|
+
if (@resolving_xref ||= (outer = true)) && outer
|
361
|
+
if (text = ref.xreftext node.attr 'xrefstyle', nil, true)
|
362
|
+
text = text.gsub DropAnchorRx, '' if text.include? '<a'
|
363
|
+
else
|
364
|
+
text = top ? '[^top]' : %([#{refid}])
|
365
|
+
end
|
366
|
+
@resolving_xref = nil
|
367
|
+
else
|
368
|
+
text = top ? '[^top]' : %([#{refid}])
|
369
|
+
end
|
323
370
|
else
|
324
371
|
text = %([#{refid}])
|
325
372
|
end
|
@@ -350,14 +397,14 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
|
|
350
397
|
end
|
351
398
|
|
352
399
|
# From node, create a skeleton document that will be used to generate the
|
353
|
-
# TOC. This is first used to create a full skeleton (
|
400
|
+
# TOC. This is first used to create a full skeleton (@full_outline) from the
|
354
401
|
# original document (for_page=nil). Then it is used for each individual page
|
355
402
|
# to create a second skeleton from the first. In this way, TOC entries are
|
356
403
|
# included that are not part of the current page, or excluded if not
|
357
404
|
# applicable for the current page.
|
358
405
|
def new_outline_doc(node, new_parent:nil, for_page:nil)
|
359
406
|
if node.class == Document
|
360
|
-
new_document = Document.new([])
|
407
|
+
new_document = Document.new([], {:doctype => node.doctype})
|
361
408
|
new_document.mplevel = node.mplevel
|
362
409
|
new_document.id = node.id
|
363
410
|
new_document.update_attributes(node.attributes)
|
@@ -374,6 +421,7 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
|
|
374
421
|
level = node.level,
|
375
422
|
numbered = node.numbered)
|
376
423
|
new_section.id = node.id
|
424
|
+
new_section.sectname = node.sectname
|
377
425
|
new_section.caption = node.caption
|
378
426
|
new_section.title = node.instance_variable_get(:@title)
|
379
427
|
new_section.mplevel = node.mplevel
|
@@ -392,10 +440,10 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
|
|
392
440
|
# outline.
|
393
441
|
def convert_outline(node, opts = {})
|
394
442
|
doc = node.document
|
395
|
-
# Find this node in the
|
396
|
-
page_node =
|
443
|
+
# Find this node in the @full_outline skeleton document
|
444
|
+
page_node = doc.mp_root.full_outline.find_by(id: node.id).first
|
397
445
|
# Create a skeleton document for this particular page
|
398
|
-
custom_outline_doc = new_outline_doc(
|
446
|
+
custom_outline_doc = new_outline_doc(doc.mp_root.full_outline, for_page: page_node)
|
399
447
|
opts[:page_id] = node.id
|
400
448
|
# Generate an extra TOC entry for the root page. Add additional styling if
|
401
449
|
# the current page is the root page.
|
@@ -455,6 +503,8 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
|
|
455
503
|
page.sectnum = node.parent.sectnum
|
456
504
|
end
|
457
505
|
|
506
|
+
page.mp_root = doc.mp_root
|
507
|
+
|
458
508
|
# Process node according to mplevel
|
459
509
|
if node.mplevel == :branch
|
460
510
|
# Retain any part intro blocks, delete others, and add a list
|
@@ -537,7 +587,6 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
|
|
537
587
|
# Write remaining part/chapter pages
|
538
588
|
outdir = ::File.dirname(target)
|
539
589
|
ext = ::File.extname(target)
|
540
|
-
target_name = ::File.basename(target, ext)
|
541
590
|
@pages.each do |doc|
|
542
591
|
chapter_target = doc.id + ext
|
543
592
|
outfile = ::File.join(outdir, chapter_target)
|
@@ -553,6 +602,10 @@ class MultipageHtml5CSS < Asciidoctor::Extensions::DocinfoProcessor
|
|
553
602
|
at_location :head
|
554
603
|
|
555
604
|
def process doc
|
605
|
+
# Disable this entirely if the multipage-disable-css attribute is set
|
606
|
+
if doc.attr('multipage-disable-css')
|
607
|
+
return
|
608
|
+
end
|
556
609
|
css = []
|
557
610
|
# Style Table Of Contents entry for current page
|
558
611
|
css << %(.toc-current{font-weight: bold;})
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: asciidoctor-multipage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Owen T. Heisler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: appraisal
|
@@ -116,8 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '0'
|
118
118
|
requirements: []
|
119
|
-
|
120
|
-
rubygems_version: 2.7.6.2
|
119
|
+
rubygems_version: 3.2.5
|
121
120
|
signing_key:
|
122
121
|
specification_version: 4
|
123
122
|
summary: Asciidoctor multipage HTML output extension
|