Skip to content

Commit 373b13d

Browse files
committed
Fixes #359. Explicit unregistration of extensions.
1 parent 1dd23bb commit 373b13d

File tree

10 files changed

+859
-56
lines changed

10 files changed

+859
-56
lines changed

README.adoc

+24
Original file line numberDiff line numberDiff line change
@@ -1380,6 +1380,30 @@ String content = asciidoctor.convertFile(new File(
13801380

13811381
You can unregister all extensions by calling the `org.asciidoctor.Asciidoctor.unregisterAllExtensions()` method.
13821382

1383+
Additionally, since AsciidoctorJ 1.5.6.1 it is possible to unregister specific extensions when using the ExtensionGroup API.
1384+
This allows to register and unregister a group of extensions as a whole:
1385+
1386+
[source,java]
1387+
----
1388+
BlockProcessor extension1 = ...
1389+
Treeprocessor extension2 = ...
1390+
ExtensionGroup extensionGroup =
1391+
asciidoctor.createGroup()
1392+
.block(extension1)
1393+
.treeprocessor(extension2);
1394+
1395+
asciidoctor.convert(...) // <1>
1396+
1397+
extensionGroup.register();
1398+
asciidoctor.convert(); // <2>
1399+
1400+
extensionGroup.register();
1401+
asciidoctor.convert(); // <3>
1402+
----
1403+
<1> Convert a document without the extensions active because they were not registered yet.
1404+
<2> Convert with extensions active after registration.
1405+
<3> Convert without extensions active after the extensions were unregistered.
1406+
13831407
=== Ruby extensions
13841408

13851409
You can even register extensions written in Ruby using AsciidoctorJ.

asciidoctorj-core/src/main/java/org/asciidoctor/Asciidoctor.java

+14-2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.asciidoctor.ast.DocumentRuby;
1414
import org.asciidoctor.ast.StructuredDocument;
1515
import org.asciidoctor.converter.JavaConverterRegistry;
16+
import org.asciidoctor.extension.ExtensionGroup;
1617
import org.asciidoctor.extension.JavaExtensionRegistry;
1718
import org.asciidoctor.extension.RubyExtensionRegistry;
1819
import org.asciidoctor.internal.JRubyAsciidoctor;
@@ -633,12 +634,23 @@ String[] convertFiles(Collection<File> asciidoctorFiles,
633634
* @return Converter Registry object.
634635
*/
635636
JavaConverterRegistry javaConverterRegistry();
636-
637+
638+
/**
639+
* Creates an ExtensionGroup that can be used to register and unregister a group of extensions.
640+
* @return
641+
*/
642+
ExtensionGroup createGroup();
643+
644+
/**
645+
* Creates an ExtensionGroup that can be used to register and unregister a group of extensions.
646+
* @return
647+
*/
648+
ExtensionGroup createGroup(String groupName);
637649
/**
638650
* Unregister all registered extensions.
639651
*/
640652
void unregisterAllExtensions();
641-
653+
642654
/**
643655
* This method frees all resources consumed by asciidoctorJ module. Keep in mind that if this method is called, instance becomes unusable and you should create another instance.
644656
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package org.asciidoctor.extension;
2+
3+
4+
import java.io.InputStream;
5+
6+
/**
7+
* An ExtensionGroup allows to collectively register and unregister extensions.
8+
* All extensions are registered lazily and are not effective before a call to {@link #register()}.
9+
*
10+
* <p>Example:
11+
* <code><pre>
12+
* ExtensionGroup group = asciidoctor.createGroup();
13+
* group.block(myBlock).preprocessor(mypreprocessor);
14+
*
15+
* // Convert with extensions
16+
* group.register();
17+
* asciidoctor.convert(...);
18+
* group.unregister();
19+
*
20+
* // Convert without extensions
21+
* asciidoctor.convert(...);
22+
* </pre></code></p>
23+
*/
24+
public interface ExtensionGroup {
25+
26+
public void register();
27+
28+
public void unregister();
29+
30+
public ExtensionGroup docinfoProcessor(Class<? extends DocinfoProcessor> docInfoProcessor);
31+
public ExtensionGroup docinfoProcessor(DocinfoProcessor docInfoProcessor);
32+
public ExtensionGroup docinfoProcessor(String docInfoProcessor);
33+
34+
public ExtensionGroup preprocessor(Class<? extends Preprocessor> preprocessor);
35+
public ExtensionGroup preprocessor(Preprocessor preprocessor);
36+
public ExtensionGroup preprocessor(String preprocessor);
37+
38+
public ExtensionGroup postprocessor(String postprocessor);
39+
public ExtensionGroup postprocessor(Class<? extends Postprocessor> postprocessor);
40+
public ExtensionGroup postprocessor(Postprocessor postprocesor);
41+
42+
public ExtensionGroup includeProcessor(String includeProcessor);
43+
public ExtensionGroup includeProcessor(Class<? extends IncludeProcessor> includeProcessor);
44+
public ExtensionGroup includeProcessor(IncludeProcessor includeProcessor);
45+
46+
public ExtensionGroup treeprocessor(Treeprocessor treeprocessor);
47+
public ExtensionGroup treeprocessor(Class<? extends Treeprocessor> treeProcessor);
48+
public ExtensionGroup treeprocessor(String treeProcessor);
49+
50+
public ExtensionGroup block(String blockName, String blockProcessor);
51+
public ExtensionGroup block(String blockName, Class<? extends BlockProcessor> blockProcessor);
52+
public ExtensionGroup block(BlockProcessor blockProcessor);
53+
public ExtensionGroup block(String blockName, BlockProcessor blockProcessor);
54+
55+
public ExtensionGroup blockMacro(String blockName, Class<? extends BlockMacroProcessor> blockMacroProcessor);
56+
public ExtensionGroup blockMacro(String blockName, String blockMacroProcessor);
57+
public ExtensionGroup blockMacro(BlockMacroProcessor blockMacroProcessor);
58+
59+
public ExtensionGroup inlineMacro(InlineMacroProcessor inlineMacroProcessor);
60+
public ExtensionGroup inlineMacro(String blockName, Class<? extends InlineMacroProcessor> inlineMacroProcessor);
61+
public ExtensionGroup inlineMacro(String blockName, String inlineMacroProcessor);
62+
63+
public ExtensionGroup requireRubyLibrary(String requiredLibrary);
64+
public ExtensionGroup loadRubyClass(InputStream rubyClassStream);
65+
66+
public ExtensionGroup rubyPreprocessor(String preprocessor);
67+
public ExtensionGroup rubyPostprocessor(String postprocessor);
68+
public ExtensionGroup rubyDocinfoProcessor(String docinfoProcessor);
69+
public ExtensionGroup rubyIncludeProcessor(String includeProcessor);
70+
public ExtensionGroup rubyTreeprocessor(String treeProcessor);
71+
public ExtensionGroup rubyBlock(String blockName, String blockProcessor);
72+
public ExtensionGroup rubyBlockMacro(String blockName, String blockMacroProcessor);
73+
public ExtensionGroup rubyInlineMacro(String blockName, String inlineMacroProcessor);
74+
}

asciidoctorj-core/src/main/java/org/asciidoctor/extension/RubyExtensionRegistry.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
public class RubyExtensionRegistry {
1010

1111
private AsciidoctorModule asciidoctorModule;
12+
1213
private Ruby rubyRuntime;
1314

1415
public RubyExtensionRegistry(AsciidoctorModule asciidoctorModule,
@@ -33,8 +34,8 @@ public RubyExtensionRegistry preprocessor(String preprocessor) {
3334
return this;
3435
}
3536

36-
public RubyExtensionRegistry postprocessor(String postprocesor) {
37-
this.asciidoctorModule.postprocessor(postprocesor);
37+
public RubyExtensionRegistry postprocessor(String postprocessor) {
38+
this.asciidoctorModule.postprocessor(postprocessor);
3839
return this;
3940
}
4041

@@ -72,5 +73,4 @@ public RubyExtensionRegistry inlineMacro(String blockName, String inlineMacroPro
7273
inlineMacroProcessor, RubyUtils.toSymbol(rubyRuntime, blockName));
7374
return this;
7475
}
75-
7676
}

asciidoctorj-core/src/main/java/org/asciidoctor/internal/AsciidoctorModule.java

+34-9
Original file line numberDiff line numberDiff line change
@@ -13,38 +13,63 @@
1313
public interface AsciidoctorModule {
1414

1515
void preprocessor(String preprocessorClassName);
16+
void preprocessor(String preprocessorClassName, String registrationName);
1617
void preprocessor(RubyClass preprocessorClassName);
17-
void preprocessor(Preprocessor preprocessor);
18-
18+
void preprocessor(RubyClass preprocessorClassName, String registrationName);
19+
void preprocessor(Preprocessor preprocessor);
20+
void preprocessor(Preprocessor preprocessor, String registrationName);
21+
1922
void postprocessor(String postprocessorClassName);
23+
void postprocessor(String postprocessorClassName, String registrationName);
2024
void postprocessor(RubyClass postprocessorClassName);
25+
void postprocessor(RubyClass postprocessorClassName, String registrationName);
2126
void postprocessor(Postprocessor postprocessor);
22-
27+
void postprocessor(Postprocessor postprocessor, String registrationName);
28+
2329
void treeprocessor(String treeprocessor);
30+
void treeprocessor(String treeprocessor, String registrationName);
2431
void treeprocessor(RubyClass treeprocessorClassName);
32+
void treeprocessor(RubyClass treeprocessorClassName, String registrationName);
2533
void treeprocessor(Treeprocessor treeprocessorClassName);
26-
34+
void treeprocessor(Treeprocessor treeprocessorClassName, String registrationName);
35+
2736
void include_processor(String includeProcessorClassName);
37+
void include_processor(String includeProcessorClassName, String registrationName);
2838
void include_processor(RubyClass includeProcessorClassName);
39+
void include_processor(RubyClass includeProcessorClassName, String registrationName);
2940
void include_processor(IncludeProcessor includeProcessor);
30-
41+
void include_processor(IncludeProcessor includeProcessor, String registrationName);
42+
3143
void block_processor(String blockClassName, Object blockName);
44+
void block_processor(String blockClassName, Object blockName, String registrationName);
3245
void block_processor(RubyClass blockClass, Object blockName);
46+
void block_processor(RubyClass blockClass, Object blockName, String registrationName);
3347
void block_processor(BlockProcessor blockInstance, Object blockName);
34-
48+
void block_processor(BlockProcessor blockInstance, Object blockName, String registrationName);
49+
3550
void block_macro(String blockMacroClassName, Object blockName);
51+
void block_macro(String blockMacroClassName, Object blockName, String registrationName);
3652
void block_macro(Class<BlockMacroProcessor> blockMacroClass, Object blockName);
53+
void block_macro(Class<BlockMacroProcessor> blockMacroClass, Object blockName, String registrationName);
3754
void block_macro(BlockMacroProcessor blockMacroInstance, Object blockName);
38-
55+
void block_macro(BlockMacroProcessor blockMacroInstance, Object blockName, String registrationName);
56+
3957
void inline_macro(String blockClassName, Object blockSymbol);
58+
void inline_macro(String blockClassName, Object blockSymbol, String registrationName);
4059
void inline_macro(RubyClass blockClassName, Object blockSymbol);
60+
void inline_macro(RubyClass blockClassName, Object blockSymbol, String registrationName);
4161
void inline_macro(InlineMacroProcessor blockClassName, Object blockSymbol);
42-
62+
void inline_macro(InlineMacroProcessor blockClassName, Object blockSymbol, String registrationName);
63+
4364
void docinfo_processor(String docInfoClassName);
65+
void docinfo_processor(String docInfoClassName, String registrationName);
4466
void docinfo_processor(RubyClass docInfoClassName);
67+
void docinfo_processor(RubyClass docInfoClassName, String registrationName);
4568
void docinfo_processor(DocinfoProcessor docInfoClassName);
46-
69+
void docinfo_processor(DocinfoProcessor docInfoClassName, String registrationName);
70+
4771
void unregister_all_extensions();
72+
void unregister_extension(String groupName);
4873

4974
Object convert(String content, Map<String, Object> options);
5075
Object convertFile(String filename, Map<String, Object> options);

0 commit comments

Comments
 (0)