anchor.diff:  For every Processor class in {asciidoctorj}[AsciidoctorJ] there is a function offered by the DSL to simply define such an extension.
   The following sections show examples for each kind of extension.
   Basically every extension is defined by calling the correct function for the extension type, passing options and a closure that holds the extension logic.
  -Every closure has an instance of the respective Processor class as its delegate.
  +
  +Under the hood, every closure has an instance of the respective Processor class as its delegate.
   That means that all methods provided by `org.asciidoctor.extensions.Processor` and its subclasses are directly available.
   
   === BlockProcessor
  
positive.code: = Asciidoctor Groovy DSL
  Robert Panzer <https://github.com/robertpanzer[@bobbytank42]>
  :released-version: 1.5.5
  :asciidoc-url: http://asciidoc.org
  :asciidoctor-url: https://asciidoctor.org
  :groovy-url: https://www.groovy-lang.org/
  
negative.code: import org.asciidoctor.groovydsl.AsciidoctorExtensions
  import org.asciidoctor.Asciidoctor
  
  AsciidoctorExtensions.extensions {  //<2>
      block(name: 'BIG', contexts: [':paragraph']) {
          parent, reader, attributes ->
          def uppercaseLines = reader.readLines()
  