summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Allen <dan.j.allen@gmail.com>2013-08-24 23:42:39 -0600
committerDan Allen <dan.j.allen@gmail.com>2013-08-24 23:44:57 -0600
commit75b162c4ffbc025ce398e6db040b90250db8d4c9 (patch)
tree538903c2200a2217335999c96be0d4b311306e38
parent6cf81afe95eab848834322ccca1b23bc4ca278bf (diff)
allow processors to be activated by string
-rw-r--r--lib/asciidoctor/extensions.rb31
-rw-r--r--test/extensions_test.rb44
2 files changed, 67 insertions, 8 deletions
diff --git a/lib/asciidoctor/extensions.rb b/lib/asciidoctor/extensions.rb
index fe0cbaf7..e5f7173e 100644
--- a/lib/asciidoctor/extensions.rb
+++ b/lib/asciidoctor/extensions.rb
@@ -27,18 +27,24 @@ module Extensions
def register extension = nil, &block
if block_given?
registered << block
- elsif !extension.nil?
- if extension.is_a? Class
- registered << extension
- else
- registered << class_for_name(extension)
- end
+ elsif extension
+ registered << resolve_class(extension)
end
end
+ def resolve_class(object)
+ object.is_a?(Class) ? object : class_for_name(object.to_s)
+ end
+
def class_for_name(qualified_name)
qualified_name.split('::').inject(Object) do |module_, name|
- module_.const_get(name)
+ if name.empty?
+ module_
+ elsif module_.const_defined? name
+ module_.const_get(name)
+ else
+ raise "Could not resolve class for name: #{qualified_name}"
+ end
end
end
@@ -80,6 +86,7 @@ module Extensions
end
def preprocessor processor, position = :<<
+ processor = resolve_processor_class processor
if position == :<< || @preprocessors.empty?
@preprocessors.push processor
elsif position == :>>
@@ -100,6 +107,7 @@ module Extensions
end
def treeprocessor processor, position = :<<
+ processor = resolve_processor_class processor
if position == :<< || @treeprocessors.empty?
@treeprocessors.push processor
elsif position == :>>
@@ -120,6 +128,7 @@ module Extensions
end
def postprocessor processor, position = :<<
+ processor = resolve_processor_class processor
if position == :<< || @postprocessors.empty?
@postprocessors.push processor
elsif position == :>>
@@ -140,6 +149,7 @@ module Extensions
end
def include_processor processor, position = :<<
+ processor = resolve_processor_class processor
if position == :<< || @include_processors.empty?
@include_processors.push processor
elsif position == :>>
@@ -165,6 +175,7 @@ module Extensions
# TODO allow contexts to be specified here, perhaps as [:upper, [:paragraph, :sidebar]]
def block name, processor, delimiter = nil, &block
+ processor = resolve_processor_class processor
@blocks[name] = processor
if block_given?
@block_delimiters[block] = name
@@ -210,6 +221,7 @@ module Extensions
end
def block_macro name, processor
+ processor = resolve_processor_class processor
@block_macros[name.to_s] = processor
end
@@ -227,6 +239,7 @@ module Extensions
# TODO probably need ordering control before/after other inline macros
def inline_macro name, processor
+ processor = resolve_processor_class processor
@inline_macros[name.to_s] = processor
end
@@ -252,6 +265,10 @@ module Extensions
instance_exec document, &block
end
+ def resolve_processor_class object
+ ::Asciidoctor::Extensions.resolve_class object
+ end
+
def reset
@block_processor_cache = {}
@block_macro_processor_cache = {}
diff --git a/test/extensions_test.rb b/test/extensions_test.rb
index d6a59d58..4140ed6c 100644
--- a/test/extensions_test.rb
+++ b/test/extensions_test.rb
@@ -145,11 +145,44 @@ context 'Extensions' do
end
end
- test 'should get class for name' do
+ test 'should get class for top-level class name' do
+ clazz = Asciidoctor::Extensions.class_for_name('Asciidoctor')
+ assert_not_nil clazz
+ assert_equal Asciidoctor, clazz
+ end
+
+ test 'should get class for class name in module' do
clazz = Asciidoctor::Extensions.class_for_name('Asciidoctor::Extensions')
assert_not_nil clazz
assert_equal Asciidoctor::Extensions, clazz
end
+
+ test 'should get class for class name resolved from root' do
+ clazz = Asciidoctor::Extensions.class_for_name('::Asciidoctor::Extensions')
+ assert_not_nil clazz
+ assert_equal Asciidoctor::Extensions, clazz
+ end
+
+ test 'should raise exception if cannot find class for name' do
+ begin
+ clazz = Asciidoctor::Extensions.class_for_name('InvalidModule::InvalidClass')
+ flunk 'Expecting RuntimeError to be raised'
+ rescue RuntimeError => e
+ assert_equal 'Could not resolve class for name: InvalidModule::InvalidClass', e.message
+ end
+ end
+
+ test 'should resolve class if class is given' do
+ clazz = Asciidoctor::Extensions.resolve_class(Asciidoctor::Extensions)
+ assert_not_nil clazz
+ assert_equal Asciidoctor::Extensions, clazz
+ end
+
+ test 'should resolve class if class from string' do
+ clazz = Asciidoctor::Extensions.resolve_class('Asciidoctor::Extensions')
+ assert_not_nil clazz
+ assert_equal Asciidoctor::Extensions, clazz
+ end
end
context 'Activate' do
@@ -262,6 +295,15 @@ context 'Extensions' do
processor = registry.load_inline_macro_processor 'sample', Asciidoctor::Document.new
assert processor.is_a? SampleInlineMacro
end
+
+ test 'should allow processors to be registered by a string name' do
+ registry = Asciidoctor::Extensions::Registry.new
+ registry.preprocessor 'SamplePreprocessor'
+ assert registry.preprocessors?
+ processors = registry.load_preprocessors Asciidoctor::Document.new
+ assert_equal 1, processors.size
+ assert processors.first.is_a? SamplePreprocessor
+ end
end
context 'Integration' do