resources/asciidoctor/lib/scaffold.rb (29 lines of code) (raw):
# frozen_string_literal: true
require 'asciidoctor/extensions'
##
# Scaffolding for TreeProcessor extensions to automatically iterate.
#
class TreeProcessorScaffold < Asciidoctor::Extensions::TreeProcessor
def process_block(_document)
raise ::NotImplementedError,
%(#{self.class} subclass must implement ##{__method__} method)
end
def process(document)
backup = document.attributes.dup
process_blocks document
document.attributes.replace backup
nil
end
def process_blocks(block)
unless block.document == block
block.document.playback_attributes block.attributes
end
process_block block
sub_blocks(block).each do |sub_block|
# sub_block can be nil for definition lists without a definition.
# this is weird, but it is safe to skip nil here because subclasses
# can't change it anyway.
process_blocks sub_block if sub_block
end
end
def sub_blocks(block)
if block.context == :dlist
# If there isn't a definition then the list can have a nil. So we compact.
block.blocks.flatten.compact
else
# Dup so modifications to the list don't cause us to reprocess
block.blocks.dup
end
end
end