Markwon/docs/docs/v4/core/registry.md
2019-06-12 18:45:28 +03:00

2.6 KiB

Registry

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();