diff options
| author | Dan Allen <dan.j.allen@gmail.com> | 2013-08-24 23:42:39 -0600 |
|---|---|---|
| committer | Dan Allen <dan.j.allen@gmail.com> | 2013-08-24 23:44:57 -0600 |
| commit | 75b162c4ffbc025ce398e6db040b90250db8d4c9 (patch) | |
| tree | 538903c2200a2217335999c96be0d4b311306e38 | |
| parent | 6cf81afe95eab848834322ccca1b23bc4ca278bf (diff) | |
allow processors to be activated by string
| -rw-r--r-- | lib/asciidoctor/extensions.rb | 31 | ||||
| -rw-r--r-- | test/extensions_test.rb | 44 |
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 |
