Registry 4.0.0

Registry allows to pre-configure other plugins and/or declare a dependency on a plugin, which also will modify internal order of plugins inside a Markwon instance.

For example, you have a configurable plugin:

public class MyPlugin extends AbstractMarkwonPlugin {
    
    private boolean enabled;

    public boolean enabled() {
        return enabled;
    }

    @NonNull
    public MyPlugin enabled(boolean enabled) {
        this.enabled = enabled;
        return this;
    }
    
    {...}
}

and other plugin that needs to access MyPlugin or modify/configure it:

public class MyOtherPlugin extends AbstractMarkwonPlugin {
    @Override
    public void configure(@NonNull Registry registry) {
        registry.require(MyPlugin.class, new Action<MyPlugin>() {
            @Override
            public void apply(@NonNull MyPlugin myPlugin) {
                myPlugin.enabled(false);
            }
        });
    }
}
final Markwon markwon = Markwon.builder(context)
        .usePlugin(new MyOtherPlugin())
        .usePlugin(new MyPlugin())
        .build();

Internal plugins order (in this case) will be:

  • CorePlugin (added automatically and always the first one)
  • MyPlugin (was required by MyOtherPlugin)
  • MyOtherPlugin

TIP

There is no need to require CorePlugin as it will be the first one inside Markwon instance.

The order matters if you want to override some plugin. For example, CoolPlugin adds a SpanFactory for a Cool markdown node. Other NotCoolPlugin wants to use a different SpanFactory, then:

final Markwon markwon = Markwon.builder(context)
        .usePlugin(CoolPlugin.create())
        .usePlugin(new NotCoolPlugin() {
            
            @Override
            public void configure(@NonNull MarkwonPlugin.Registry registry) {
                registry.require(CoolPlugin.class);
            }

            @Override
            public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) {
                builder.setFactory(Cool.class, new NotCoolSpanFactory());
            }
        })
        .build();

All require calls to the Registry will also validate at runtime that required plugins are registered.

final Markwon markwon = Markwon.builder(context)
        .usePlugin(new AbstractMarkwonPlugin() {
            @Override
            public void configure(@NonNull Registry registry) {
                // will throw an exception if `NotPresentPlugin` is not present
                registry.require(NotPresentPlugin.class);
            }
        })
        .build();
Last Updated: 6/12/2019, 6:45:28 PM