Class: Asciidoctor::ListsExtended::ListTreeprocessor

Inherits:
Extensions::Treeprocessor
  • Object
show all
Defined in:
lib/asciidoctor-lists-extended/extensions.rb

Overview

Treeprocessor that runs after the full document AST is built.

Responsibilities:

1. Auto-generate IDs for all captioned/titled elements referenced by
   list-of:: macros. This eliminates the need for manual [#anchor] on
   every block.
2. For HTML5/other backends: replace UUID placeholder paragraphs with
   xref-based content (delegated to HtmlRenderer).
3. For PDF backend: leave UUID placeholder paragraphs in place so that
   PDFConverterWithLists can locate and render them during allocate_toc /
   ink_toc.

Instance Method Summary collapse

Instance Method Details

#process(document) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/asciidoctor-lists-extended/extensions.rb', line 74

def process(document)
  return if ListMacroAttributes.empty?

  # Auto-generate IDs for all elements referenced by list-of:: macros.
  # Works for both HTML and PDF — the IDs must exist before either renderer runs.
  ListMacroAttributes.each_value do |config|
    document
      .find_by(traverse_documents: true, context: config[:element].to_sym)
      .each do |element|
        next unless element.caption || element.title
        next if element.has_role?('exclude-from-listof')
        next if element.id

        element.id = SecureRandom.uuid
        document.catalog[:refs][element.id] = element
      end
  end

  # PDF backend: UUID placeholders are handled by PDFConverterWithLists.
  # allocate_toc/ink_toc only fire when the document has a toc attribute set.
  # Warn here so the author sees a clear message instead of raw UUIDs in the PDF.
  if document.backend == 'pdf'
    unless document.attr?('toc')
      logger.warn 'asciidoctor-lists-extended: list-of:: macros in PDF output require ' \
                  'toc::[] in the document (or :toc: in the header); ' \
                  'without it the list will render as a raw UUID placeholder.'
    end
    return
  end

  # HTML5 and other backends: replace UUID placeholders with xref content.
  HtmlRenderer.new.render(document)
end