asciidoctor-multipage 0.0.6 → 0.0.11

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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/asciidoctor-multipage.rb +69 -12
  3. metadata +6 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1536862b822c7ec9f66f5f53f3b6a9bad7f6983ee5ff1f5c742e718a3cb66a76
4
- data.tar.gz: f612e848167857d28c7c42f4684355e7082a45379038a5265e472797dae99b11
3
+ metadata.gz: 37d22229b52f7ecc747f4c4f80fcfe6b3d097d49a0ba7c1e375de6f72280c950
4
+ data.tar.gz: 901b657b48543dc3466154c0ba5d00d82d639f1b72a747eae5bb5821cd287cb1
5
5
  SHA512:
6
- metadata.gz: c652de15f77d2c32e7574b7edf9351e49623170aada76a8c577b16ade65db6294660fb07dbebe27095b5500167c804a4a3ac70d82383d3d56a84ca9d4c1aeed8
7
- data.tar.gz: 8db9f9e909ae211891384483624affd6f7c78ada48d78c27b7bb1667c5da4300ab3bc257c233912c1495505d412a7402275579f569bd3524e6f7011f1debb4f2
6
+ metadata.gz: 52c37d84631c4d9bbdd02a272fd61dd5c5cf26b6a60f2e203378ca0dc669edd731284b13bf5d9fdfae601209ae38ddf9647ad8e7091e7a46b6810cb5beb7e6a6
7
+ data.tar.gz: 7bf7e7e32dac50d8619ee1ac52e9bc501c2d1cb5585e391f7501ed2b6e7bd1ab67b265c7e7d1a4e2df5cc95e0077fcdd768faaf76d1b6e886894140b85669bec
@@ -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
@@ -101,6 +109,12 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
101
109
 
102
110
  attr_accessor :pages
103
111
 
112
+ # contains the entire outline of the top-level document, used
113
+ # as a guide-rail for creating TOC elements for documents we
114
+ # split off. Only expected to be set in the top-level converter
115
+ # (see AsciiDoctor::Document::mp_root)
116
+ attr_accessor :full_outline
117
+
104
118
  def initialize(backend, opts = {})
105
119
  @xml_mode = false
106
120
  @void_element_slash = nil
@@ -118,8 +132,29 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
118
132
  page << block
119
133
  end
120
134
 
135
+ # ensures that the AsciiDoctor::Document::mp_root is correctly
136
+ # set on the document object. The variable could have already been
137
+ # set if we created the document ourselves
138
+ # (see ::MultipageHtml5Converter::convert_section), in which case it's
139
+ # not changed. If the documented is "nested", then we expect the parent
140
+ # document to already have it set. Otherwise, this is expected to be
141
+ # a top-level document, and we assign ourselves as its original converter.
142
+ def check_root(doc)
143
+ unless doc.mp_root
144
+ if doc.nested?
145
+ doc.mp_root = doc.parent_document.mp_root
146
+ else
147
+ doc.mp_root = self
148
+ end
149
+ end
150
+ end
151
+
121
152
  # Process Document (either the original full document or a processed page)
122
153
  def convert_document(node)
154
+
155
+ # make sure document has original converter reference
156
+ check_root(node)
157
+
123
158
  if node.processed
124
159
  # This node (an individual page) can now be handled by
125
160
  # Html5Converter.
@@ -166,8 +201,16 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
166
201
  # Generate navigation links for all pages
167
202
  generate_nav_links(node)
168
203
 
169
- # Create and save a skeleton document for generating the TOC lists.
170
- @@full_outline = new_outline_doc(node)
204
+ # Create and save a skeleton document for generating the TOC lists,
205
+ # but don't attempt to create outline for nested documents.
206
+ unless node.nested?
207
+ # if the original converter has the @full_outline set already, we are about
208
+ # to replace it. That's not supposed to happen, and probably means we encountered
209
+ # a document structure we aren't prepared for. Log an error and move on.
210
+ logger.error "Regenerating document outline, something wrong?" if node.mp_root.full_outline
211
+ node.mp_root.full_outline = new_outline_doc(node)
212
+ end
213
+
171
214
  # Save the document catalog to use for each part/chapter page.
172
215
  @catalog = node.catalog
173
216
 
@@ -179,7 +222,7 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
179
222
  part = block
180
223
  part.convert
181
224
  text = %(<<#{part.id},#{part.captioned_title}>>)
182
- if desc = block.attr('desc') then text << %( – #{desc}) end
225
+ if (desc = block.attr('desc')) then text << %( – #{desc}) end
183
226
  parts_list << Asciidoctor::ListItem.new(parts_list, text)
184
227
  end
185
228
  end
@@ -197,6 +240,8 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
197
240
  # Process Document in embeddable mode (either the original full document or a
198
241
  # processed page)
199
242
  def convert_embedded(node)
243
+ # make sure document has original converter reference
244
+ check_root(node)
200
245
  if node.processed
201
246
  # This node (an individual page) can now be handled by
202
247
  # Html5Converter.
@@ -244,7 +289,8 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
244
289
  # Generate the actual HTML outline for the TOC. This method is analogous to
245
290
  # Html5Converter convert_outline().
246
291
  def generate_outline(node, opts = {})
247
- return unless node.sections?
292
+ # Do the same as Html5Converter convert_outline() here
293
+ return unless node.sections? && node.sections.length > 0
248
294
  sectnumlevels = opts[:sectnumlevels] || (node.document.attributes['sectnumlevels'] || 3).to_i
249
295
  toclevels = opts[:toclevels] || (node.document.attributes['toclevels'] || 2).to_i
250
296
  sections = node.sections
@@ -254,7 +300,17 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
254
300
  if section.caption
255
301
  stitle = section.captioned_title
256
302
  elsif section.numbered && slevel <= sectnumlevels
257
- stitle = %(#{section.sectnum} #{section.title})
303
+ if slevel < 2 && node.document.doctype == 'book'
304
+ if section.sectname == 'chapter'
305
+ stitle = %(#{(signifier = node.document.attributes['chapter-signifier']) ? "#{signifier} " : ''}#{section.sectnum} #{section.title})
306
+ elsif section.sectname == 'part'
307
+ stitle = %(#{(signifier = node.document.attributes['part-signifier']) ? "#{signifier} " : ''}#{section.sectnum nil, ':'} #{section.title})
308
+ else
309
+ stitle = %(#{section.sectnum} #{section.title})
310
+ end
311
+ else
312
+ stitle = %(#{section.sectnum} #{section.title})
313
+ end
258
314
  else
259
315
  stitle = section.title
260
316
  end
@@ -339,7 +395,7 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
339
395
  end
340
396
 
341
397
  # From node, create a skeleton document that will be used to generate the
342
- # TOC. This is first used to create a full skeleton (@@full_outline) from the
398
+ # TOC. This is first used to create a full skeleton (@full_outline) from the
343
399
  # original document (for_page=nil). Then it is used for each individual page
344
400
  # to create a second skeleton from the first. In this way, TOC entries are
345
401
  # included that are not part of the current page, or excluded if not
@@ -349,8 +405,7 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
349
405
  new_document = Document.new([])
350
406
  new_document.mplevel = node.mplevel
351
407
  new_document.id = node.id
352
- new_document.set_attr('sectnumlevels', node.attr(:sectnumlevels))
353
- new_document.set_attr('toclevels', node.attr(:toclevels))
408
+ new_document.update_attributes(node.attributes)
354
409
  new_parent = new_document
355
410
  node.sections.each do |section|
356
411
  new_outline_doc(section, new_parent: new_parent,
@@ -365,7 +420,7 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
365
420
  numbered = node.numbered)
366
421
  new_section.id = node.id
367
422
  new_section.caption = node.caption
368
- new_section.title = node.title
423
+ new_section.title = node.instance_variable_get(:@title)
369
424
  new_section.mplevel = node.mplevel
370
425
  new_parent << new_section
371
426
  new_parent.sections.last.numeral = node.numeral
@@ -382,10 +437,10 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
382
437
  # outline.
383
438
  def convert_outline(node, opts = {})
384
439
  doc = node.document
385
- # Find this node in the @@full_outline skeleton document
386
- page_node = @@full_outline.find_by(id: node.id).first
440
+ # Find this node in the @full_outline skeleton document
441
+ page_node = doc.mp_root.full_outline.find_by(id: node.id).first
387
442
  # Create a skeleton document for this particular page
388
- custom_outline_doc = new_outline_doc(@@full_outline, for_page: page_node)
443
+ custom_outline_doc = new_outline_doc(doc.mp_root.full_outline, for_page: page_node)
389
444
  opts[:page_id] = node.id
390
445
  # Generate an extra TOC entry for the root page. Add additional styling if
391
446
  # the current page is the root page.
@@ -445,6 +500,8 @@ class MultipageHtml5Converter < Asciidoctor::Converter::Html5Converter
445
500
  page.sectnum = node.parent.sectnum
446
501
  end
447
502
 
503
+ page.mp_root = doc.mp_root
504
+
448
505
  # Process node according to mplevel
449
506
  if node.mplevel == :branch
450
507
  # Retain any part intro blocks, delete others, and add a list
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.6
4
+ version: 0.0.11
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-02-27 00:00:00.000000000 Z
11
+ date: 2021-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: appraisal
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1'
33
+ version: 2.2.18
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '1'
40
+ version: 2.2.18
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement