class Asciidoctor::Extensions::Registry
stored in the registry during parsing.
methods for registering or defining a processor and looks up extensions
Registry holds the extensions which have been registered and activated, has
Public: The primary entry point into the extension system.
def activate document
document - the {Asciidoctor::Document} on which the extensions are to be used.
associated with this registry.
Public: Activates all the global extension {Group}s and the extension {Group}s
def activate document @document = document (Extensions.groups.values + @groups.values).each do |group| case group when ::Proc case group.arity when 0, -1 instance_exec(&group) when 1 group.call self end when ::Class group.new.activate self else group.activate self end end self end
def add_document_processor kind, args, &block
def add_document_processor kind, args, &block kind_name = kind.to_s.tr '_', ' ' kind_class_symbol = kind_name.split(' ').map {|word| %(#{word.chr.upcase}#{word[1..-1]}) }.join.to_sym kind_class = Extensions.const_get kind_class_symbol kind_java_class = (defined? ::AsciidoctorJ) ? (::AsciidoctorJ::Extensions.const_get kind_class_symbol) : nil kind_store = instance_variable_get(%(@#{kind}_extensions).to_sym) || instance_variable_set(%(@#{kind}_extensions).to_sym, []) # style 1: specified as block extension = if block_given? config = resolve_args args, 1 # TODO if block arity is 0, assume block is process method processor = kind_class.new config # NOTE class << processor idiom doesn't work in Opal #class << processor # include_dsl #end # NOTE kind_class.contants(false) doesn't exist in Ruby 1.8.7 processor.extend kind_class.const_get :DSL if kind_class.constants.grep :DSL processor.instance_exec(&block) processor.freeze unless processor.process_block_given? raise ::ArgumentError.new %(No block specified to process #{kind_name} extension at #{block.source_location}) end ProcessorExtension.new kind, processor else processor, config = resolve_args args, 2 # style 2: specified as class or class name if (processor.is_a? ::Class) || ((processor.is_a? ::String) && (processor = Extensions.class_for_name processor)) unless processor < kind_class || (kind_java_class && processor < kind_java_class) raise ::ArgumentError.new %(Invalid type for #{kind_name} extension: #{processor}) end processor_instance = processor.new config processor_instance.freeze ProcessorExtension.new kind, processor_instance # style 3: specified as instance elsif (processor.is_a? kind_class) || (kind_java_class && (processor.is_a? kind_java_class)) processor.update_config config processor.freeze ProcessorExtension.new kind, processor else raise ::ArgumentError.new %(Invalid arguments specified for registering #{kind_name} extension: #{args}) end end if extension.config[:position] == :>> kind_store.unshift extension else kind_store << extension end end
def add_syntax_processor kind, args, &block
def add_syntax_processor kind, args, &block kind_name = kind.to_s.tr '_', ' ' kind_class_basename = kind_name.split(' ').map {|word| %(#{word.chr.upcase}#{word[1..-1]}) }.join kind_class_symbol = %(#{kind_class_basename}Processor).to_sym kind_class = Extensions.const_get kind_class_symbol kind_java_class = (defined? ::AsciidoctorJ) ? (::AsciidoctorJ::Extensions.const_get kind_class_symbol) : nil kind_store = instance_variable_get(%(@#{kind}_extensions).to_sym) || instance_variable_set(%(@#{kind}_extensions).to_sym, {}) # style 1: specified as block if block_given? name, config = resolve_args args, 2 processor = kind_class.new as_symbol(name), config # NOTE class << processor idiom doesn't work in Opal #class << processor # include_dsl #end # NOTE kind_class.contants(false) doesn't exist in Ruby 1.8.7 processor.extend kind_class.const_get :DSL if kind_class.constants.grep :DSL if block.arity == 1 yield processor else processor.instance_exec(&block) end unless (name = as_symbol processor.name) raise ::ArgumentError.new %(No name specified for #{kind_name} extension at #{block.source_location}) end unless processor.process_block_given? raise ::NoMethodError.new %(No block specified to process #{kind_name} extension at #{block.source_location}) end processor.freeze kind_store[name] = ProcessorExtension.new kind, processor else processor, name, config = resolve_args args, 3 # style 2: specified as class or class name if (processor.is_a? ::Class) || ((processor.is_a? ::String) && (processor = Extensions.class_for_name processor)) unless processor < kind_class || (kind_java_class && processor < kind_java_class) raise ::ArgumentError.new %(Class specified for #{kind_name} extension does not inherit from #{kind_class}: #{processor}) end processor_instance = processor.new as_symbol(name), config unless (name = as_symbol processor_instance.name) raise ::ArgumentError.new %(No name specified for #{kind_name} extension: #{processor}) end processor.freeze kind_store[name] = ProcessorExtension.new kind, processor_instance # style 3: specified as instance elsif (processor.is_a? kind_class) || (kind_java_class && (processor.is_a? kind_java_class)) processor.update_config config # TODO need a test for this override! unless (name = name ? (processor.name = as_symbol name) : (as_symbol processor.name)) raise ::ArgumentError.new %(No name specified for #{kind_name} extension: #{processor}) end processor.freeze kind_store[name] = ProcessorExtension.new kind, processor else raise ::ArgumentError.new %(Invalid arguments specified for registering #{kind_name} extension: #{args}) end end end
def as_symbol name
def as_symbol name name ? ((name.is_a? ::Symbol) ? name : name.to_sym) : nil end
def block *args, &block
Returns an instance of the [Extension] proxy object that is stored in the
end
end
...
process |parent, reader, attrs|
register :shout do
# as a method block with an explicit block name
end
end
...
process |parent, reader, attrs|
named :shout
block do
# as a method block
block 'ShoutBlock', :shout
# as a name of a BlockProcessor subclass with an explicit block name
block 'ShoutBlock'
# as a name of a BlockProcessor subclass
block ShoutBlock.new, :shout
# as an instance of a BlockProcessor subclass with an explicit block name
block ShoutBlock.new
# as an instance of a BlockProcessor subclass
block ShoutBlock, :shout
# as a BlockProcessor subclass with an explicit block name
block ShoutBlock
# as a BlockProcessor subclass
Examples
is raised.
BlockProcessor instance. If a name still cannot be determined, an error
is not passed as an argument, it gets read from the name property of the
paragraph) that this processor is registered to handle. If a block name
to a Symbol) of the AsciiDoc block content (i.e., delimited block or
first argument to this method. The second argument is the name (coersed
Unless the BlockProcessor is passed as the method block, it must be the
* A method block (i.e., Proc) that conforms to the BlockProcessor contract
* The String name of a BlockProcessor subclass
* An instance of a BlockProcessor subclass
* A BlockProcessor subclass
The BlockProcessor may be one of four types:
AsciiDoc source annotated with the specified block name (i.e., style).
process the block content (i.e., delimited block or paragraph) in the
Public: Registers a {BlockProcessor} with the extension registry to
def block *args, &block add_syntax_processor :block, args, &block end
def block_macro *args, &block
Returns an instance of the [Extension] proxy object that is stored in the
end
end
...
process |parent, target, attrs|
register :gist do
# as a method block with an explicit macro name
end
end
...
process |parent, target, attrs|
named :gist
block_macro do
# as a method block
block 'GistBlockMacro', :gist
# as a name of a BlockMacroProcessor subclass with an explicit macro name
block 'GistBlockMacro'
# as a name of a BlockMacroProcessor subclass
block GistBlockMacro.new, :gist
# as an instance of a BlockMacroProcessor subclass with an explicit macro name
block GistBlockMacro.new
# as an instance of a BlockMacroProcessor subclass
block GistBlockMacro, :gist
# as a BlockMacroProcessor subclass with an explicit macro name
block GistBlockMacro
# as a BlockMacroProcessor subclass
Examples
If a name still cannot be determined, an error is raised.
it gets read from the name property of the BlockMacroProcessor instance.
registered to handle. If a block macro name is not passed as an argument,
(coersed to a Symbol) of the AsciiDoc block macro that this processor is
the first argument to this method. The second argument is the name
Unless the BlockMacroProcessor is passed as the method block, it must be
* A method block (i.e., Proc) that conforms to the BlockMacroProcessor contract
* The String name of a BlockMacroProcessor subclass
* An instance of a BlockMacroProcessor subclass
* A BlockMacroProcessor subclass
The BlockMacroProcessor may be one of four types:
process a block macro with the specified name.
Public: Registers a {BlockMacroProcessor} with the extension registry to
def block_macro *args, &block add_syntax_processor :block_macro, args, &block end
def block_macros?
Public: Checks whether any {BlockMacroProcessor} extensions have been registered.
def block_macros? !!@block_macro_extensions end
def blocks?
Public: Checks whether any {BlockProcessor} extensions have been registered.
def blocks? !!@block_extensions end
def docinfo_processor *args, &block
Returns the [Extension] stored in the registry that proxies the
end
end
'footer content'
at_location :footer
process |doc|
docinfo_processor do
# as a method block
docinfo_processor 'MetaRobotsDocinfoProcessor'
# as a name of a DocinfoProcessor subclass
docinfo_processor JQueryDocinfoProcessor.new, :location => :footer
# as an instance of a DocinfoProcessor subclass with an explicit location
docinfo_processor MetaRobotsDocinfoProcessor
# as an DocinfoProcessor subclass
Examples
first argument to this method.
Unless the DocinfoProcessor is passed as the method block, it must be the
* A method block (i.e., Proc) that conforms to the DocinfoProcessor contract
* The String name of a DocinfoProcessor subclass
* An instance of a DocinfoProcessor subclass
* A DocinfoProcessor subclass
The DocinfoProcessor may be one of four types:
add additionnal docinfo to the document.
Public: Registers an {DocinfoProcessor} with the extension registry to
def docinfo_processor *args, &block add_document_processor :docinfo_processor, args, &block end
def docinfo_processors location = nil
location - A Symbol for selecting docinfo extensions at a given location (:header or :footer) (default: nil)
DocinfoProcessor instances stored in this registry.
Public: Retrieves the {Extension} proxy objects for all the
def docinfo_processors location = nil if @docinfo_processor_extensions if location @docinfo_processor_extensions.select {|ext| ext.config[:location] == location } else @docinfo_processor_extensions end else nil end end
def docinfo_processors? location = nil
location - A Symbol for selecting docinfo extensions at a given location (:header or :footer) (default: nil)
Public: Checks whether any {DocinfoProcessor} extensions have been registered.
def docinfo_processors? location = nil if @docinfo_processor_extensions if location @docinfo_processor_extensions.find {|ext| ext.config[:location] == location } else true end else false end end
def find_block_extension name
Returns the [Extension] object stored in the registry that proxies the
name - the String or Symbol (coersed to a Symbol) macro name
to handle block content with the name.
Public: Retrieves the {Extension} proxy object for the BlockProcessor registered
def find_block_extension name @block_extensions[name.to_sym] end
def find_block_macro_extension name
Returns the [Extension] object stored in the registry that proxies the
name - the String or Symbol (coersed to a Symbol) macro name
to handle a block macro with the specified name.
Public: Retrieves the {Extension} proxy object for the BlockMacroProcessor registered
def find_block_macro_extension name @block_macro_extensions[name.to_sym] end
def find_inline_macro_extension name
Returns the [Extension] object stored in the registry that proxies the
name - the String or Symbol (coersed to a Symbol) macro name
to handle an inline macro with the specified name.
Public: Retrieves the {Extension} proxy object for the InlineMacroProcessor registered
def find_inline_macro_extension name @inline_macro_extensions[name.to_sym] end
def include_processor *args, &block
Returns the [Extension] stored in the registry that proxies the
end
end
...
process |document, output|
include_processor do
# as a method block
include_processor 'GitIncludeProcessor'
# as a name of a Postprocessor subclass
include_processor GitIncludeProcessor.new
# as an instance of a Postprocessor subclass
include_processor GitIncludeProcessor
# as an IncludeProcessor subclass
Examples
first argument to this method.
Unless the IncludeProcessor is passed as the method block, it must be the
* A method block (i.e., Proc) that conforms to the IncludeProcessor contract
* The String name of a IncludeProcessor subclass
* An instance of a IncludeProcessor subclass
* A IncludeProcessor subclass
The IncludeProcessor may be one of four types:
a shot at handling the include directive.
Public: Registers an {IncludeProcessor} with the extension registry to have
def include_processor *args, &block add_document_processor :include_processor, args, &block end
def include_processors
IncludeProcessor instances stored in this registry.
Public: Retrieves the {Extension} proxy objects for all the
def include_processors @include_processor_extensions end
def include_processors?
Public: Checks whether any {IncludeProcessor} extensions have been registered.
def include_processors? !!@include_processor_extensions end
def initialize groups = {}
def initialize groups = {} @groups = groups @preprocessor_extensions = @treeprocessor_extensions = @postprocessor_extensions = @include_processor_extensions = @docinfo_processor_extensions =nil @block_extensions = @block_macro_extensions = @inline_macro_extensions = nil @document = nil end
def inline_macro *args, &block
Returns an instance of the [Extension] proxy object that is stored in the
end
end
...
process |parent, target, attrs|
register :chrome do
# as a method block with an explicit macro name
end
end
...
process |parent, target, attrs|
named :chrome
inline_macro do
# as a method block
block 'ChromeInineMacro', :chrome
# as a name of an InlineMacroProcessor subclass with an explicit macro name
block 'ChromeInlineMacro'
# as a name of an InlineMacroProcessor subclass
block ChromeInlineMacro.new, :chrome
# as an instance of an InlineMacroProcessor subclass with an explicit macro name
block ChromeInlineMacro.new
# as an instance of an InlineMacroProcessor subclass
block ChromeInineMacro, :chrome
# as an InlineMacroProcessor subclass with an explicit macro name
block ChromeInlineMacro
# as an InlineMacroProcessor subclass
Examples
If a name still cannot be determined, an error is raised.
it gets read from the name property of the InlineMacroProcessor instance.
registered to handle. If a block macro name is not passed as an argument,
(coersed to a Symbol) of the AsciiDoc block macro that this processor is
the first argument to this method. The second argument is the name
Unless the InlineMacroProcessor is passed as the method block, it must be
* A method block (i.e., Proc) that conforms to the InlineMacroProcessor contract
* The String name of an InlineMacroProcessor subclass
* An instance of an InlineMacroProcessor subclass
* An InlineMacroProcessor subclass
The InlineMacroProcessor may be one of four types:
process an inline macro with the specified name.
Public: Registers a {InlineMacroProcessor} with the extension registry to
def inline_macro *args, &block add_syntax_processor :inline_macro, args, &block end
def inline_macros
InlineMacroProcessor instances in this registry.
Public: Retrieves the {Extension} proxy objects for all
def inline_macros @inline_macro_extensions.values end
def inline_macros?
Public: Checks whether any {InlineMacroProcessor} extensions have been registered.
def inline_macros? !!@inline_macro_extensions end
def postprocessor *args, &block
Returns the [Extension] stored in the registry that proxies the
end
end
...
process |document, output|
postprocessor do
# as a method block
postprocessor 'AnalyticsPostprocessor'
# as a name of a Postprocessor subclass
postprocessor AnalyticsPostprocessor.new
# as an instance of a Postprocessor subclass
postprocessor AnalyticsPostprocessor
# as a Postprocessor subclass
Examples
first argument to this method.
Unless the Postprocessor is passed as the method block, it must be the
* A method block (i.e., Proc) that conforms to the Postprocessor contract
* The String name of a Postprocessor subclass
* An instance of a Postprocessor subclass
* A Postprocessor subclass
The Postprocessor may be one of four types:
the output after conversion is complete.
Public: Registers a {Postprocessor} with the extension registry to process
def postprocessor *args, &block add_document_processor :postprocessor, args, &block end
def postprocessors
Postprocessor instances in this registry.
Public: Retrieves the {Extension} proxy objects for all
def postprocessors @postprocessor_extensions end
def postprocessors?
Public: Checks whether any {Postprocessor} extensions have been registered.
def postprocessors? !!@postprocessor_extensions end
def preprocessor *args, &block
Returns the [Extension] stored in the registry that proxies the
end
end
...
process |reader, lines|
preprocessor do
# as a method block
preprocessor 'FrontMatterPreprocessor'
# as a name of a Preprocessor subclass
preprocessor FrontMatterPreprocessor.new
# as an instance of a Preprocessor subclass
preprocessor FrontMatterPreprocessor
# as a Preprocessor subclass
Examples
first argument to this method.
Unless the Preprocessor is passed as the method block, it must be the
* A method block (i.e., Proc) that conforms to the Preprocessor contract
* The String name of a Preprocessor subclass
* An instance of a Preprocessor subclass
* A Preprocessor subclass
The Preprocessor may be one of four types:
the AsciiDoc source before parsing begins.
Public: Registers a {Preprocessor} with the extension registry to process
def preprocessor *args, &block add_document_processor :preprocessor, args, &block end
def preprocessors
Preprocessor instances in this registry.
Public: Retrieves the {Extension} proxy objects for all
def preprocessors @preprocessor_extensions end
def preprocessors?
Public: Checks whether any {Preprocessor} extensions have been registered.
def preprocessors? !!@preprocessor_extensions end
def registered_for_block? name, context
Returns the [Extension] proxy object for the BlockProcessor that matches
handle the specified block name appearing on the specified context.
Public: Checks whether any {BlockProcessor} extensions are registered to
def registered_for_block? name, context if (ext = @block_extensions[name.to_sym]) (ext.config[:contexts].include? context) ? ext : false else false end end
def registered_for_block_macro? name
--
the macro name or false if no match is found.
Returns the [Extension] proxy object for the BlockMacroProcessor that matches
name - the String or Symbol (coersed to a Symbol) macro name
handle the block macro with the specified name.
Public: Checks whether any {BlockMacroProcessor} extensions are registered to
def registered_for_block_macro? name (ext = @block_macro_extensions[name.to_sym]) ? ext : false end
def registered_for_inline_macro? name
Returns the [Extension] proxy object for the InlineMacroProcessor that matches
name - the String or Symbol (coersed to a Symbol) macro name
handle the inline macro with the specified name.
Public: Checks whether any {InlineMacroProcessor} extensions are registered to
def registered_for_inline_macro? name (ext = @inline_macro_extensions[name.to_sym]) ? ext : false end
def resolve_args args, expect
def resolve_args args, expect opts = (args[-1].is_a? ::Hash) ? args.pop : {} return opts if expect == 1 num_args = args.size if (missing = expect - 1 - num_args) > 0 args.fill nil, num_args, missing elsif missing < 0 args.pop(-missing) end args << opts args end
def treeprocessor *args, &block
Returns the [Extension] stored in the registry that proxies the
end
end
...
process |document|
treeprocessor do
# as a method block
treeprocessor 'ShellTreeprocessor'
# as a name of a Treeprocessor subclass
treeprocessor ShellTreeprocessor.new
# as an instance of a Treeprocessor subclass
treeprocessor ShellTreeprocessor
# as a Treeprocessor subclass
Examples
first argument to this method.
Unless the Treeprocessor is passed as the method block, it must be the
* A method block (i.e., Proc) that conforms to the Treeprocessor contract
* The String name of a Treeprocessor subclass
* An instance of a Treeprocessor subclass
* A Treeprocessor subclass
The Treeprocessor may be one of four types:
the AsciiDoc source after parsing is complete.
Public: Registers a {Treeprocessor} with the extension registry to process
def treeprocessor *args, &block add_document_processor :treeprocessor, args, &block end
def treeprocessors
Treeprocessor instances in this registry.
Public: Retrieves the {Extension} proxy objects for all
def treeprocessors @treeprocessor_extensions end
def treeprocessors?
Public: Checks whether any {Treeprocessor} extensions have been registered.
def treeprocessors? !!@treeprocessor_extensions end