diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/HtmlPlugin.java b/markwon-html/src/main/java/ru/noties/markwon/html/HtmlPlugin.java index fd9bad40..8e437ac5 100644 --- a/markwon-html/src/main/java/ru/noties/markwon/html/HtmlPlugin.java +++ b/markwon-html/src/main/java/ru/noties/markwon/html/HtmlPlugin.java @@ -27,11 +27,29 @@ import ru.noties.markwon.html.tag.UnderlineHandler; */ public class HtmlPlugin extends AbstractMarkwonPlugin { + /** + * @see #create(HtmlConfigure) + * @since 4.0.0-SNAPSHOT + */ + public interface HtmlConfigure { + void configureHtml(@NonNull HtmlPlugin plugin); + } + @NonNull public static HtmlPlugin create() { return new HtmlPlugin(); } + /** + * @since 4.0.0-SNAPSHOT + */ + @NonNull + public static HtmlPlugin create(@NonNull HtmlConfigure configure) { + final HtmlPlugin plugin = create(); + configure.configureHtml(plugin); + return plugin; + } + public static final float SCRIPT_DEF_TEXT_SIZE_RATIO = .75F; private final MarkwonHtmlRendererImpl.Builder builder; diff --git a/sample/src/main/java/ru/noties/markwon/sample/basicplugins/BasicPluginsActivity.java b/sample/src/main/java/ru/noties/markwon/sample/basicplugins/BasicPluginsActivity.java index 98596972..4d34db84 100644 --- a/sample/src/main/java/ru/noties/markwon/sample/basicplugins/BasicPluginsActivity.java +++ b/sample/src/main/java/ru/noties/markwon/sample/basicplugins/BasicPluginsActivity.java @@ -6,20 +6,33 @@ import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.text.Layout; import android.text.TextUtils; +import android.text.style.AlignmentSpan; import android.text.style.ForegroundColorSpan; import android.widget.TextView; import org.commonmark.node.Heading; import org.commonmark.node.Paragraph; +import java.util.Collection; +import java.util.Collections; + import ru.noties.markwon.AbstractMarkwonPlugin; import ru.noties.markwon.Markwon; import ru.noties.markwon.MarkwonConfiguration; import ru.noties.markwon.MarkwonPlugin; import ru.noties.markwon.MarkwonSpansFactory; import ru.noties.markwon.MarkwonVisitor; +import ru.noties.markwon.RenderProps; import ru.noties.markwon.core.MarkwonTheme; +import ru.noties.markwon.html.HtmlPlugin; +import ru.noties.markwon.html.HtmlTag; +import ru.noties.markwon.html.tag.SimpleTagHandler; +import ru.noties.markwon.image.ImageItem; +import ru.noties.markwon.image.ImagesPlugin; +import ru.noties.markwon.image.SchemeHandler; +import ru.noties.markwon.image.network.NetworkSchemeHandler; import ru.noties.markwon.movement.MovementMethodPlugin; public class BasicPluginsActivity extends Activity { @@ -42,6 +55,8 @@ public class BasicPluginsActivity extends Activity { step_4(); step_5(); + + step_6(); } /** @@ -167,30 +182,67 @@ public class BasicPluginsActivity extends Activity { final String markdown = "![image](myownscheme://en.wikipedia.org/static/images/project-logos/enwiki-2x.png)"; final Markwon markwon = Markwon.builder(this) -// .usePlugin(ImagesPlugin.create(this)) -// .usePlugin(new AbstractMarkwonPlugin() { -// @Override -// public void configureImages(@NonNull AsyncDrawableLoader.Builder builder) { -// // we can have a custom SchemeHandler -// // here we will just use networkSchemeHandler to redirect call -// builder.addSchemeHandler("myownscheme", new SchemeHandler() { -// -// final NetworkSchemeHandler networkSchemeHandler = NetworkSchemeHandler.create(); -// -// @Nullable -// @Override -// public ImageItem handle(@NonNull String raw, @NonNull Uri uri) { -// raw = raw.replace("myownscheme", "https"); -// return networkSchemeHandler.handle(raw, Uri.parse(raw)); -// } -// }); -// } -// }) + .usePlugin(ImagesPlugin.create()) + .usePlugin(new AbstractMarkwonPlugin() { + @Override + public void configure(@NonNull Registry registry) { + + // use registry.require to obtain a plugin, does also + // a runtime validation if this plugin is registered + registry.require(ImagesPlugin.class, plugin -> plugin.addSchemeHandler(new SchemeHandler() { + + // it's a sample only, most likely you won't need to + // use existing scheme-handler, this for demonstration purposes only + final NetworkSchemeHandler handler = NetworkSchemeHandler.create(); + + @NonNull + @Override + public ImageItem handle(@NonNull String raw, @NonNull Uri uri) { + final String url = raw.replace("myownscheme", "https"); + return handler.handle(url, Uri.parse(url)); + } + + @NonNull + @Override + public Collection supportedSchemes() { + return Collections.singleton("myownscheme"); + } + })); + } + }) + // or we can init plugin with this factory method +// .usePlugin(ImagesPlugin.create(plugin -> { +// plugin.addSchemeHandler(/**/) +// })) .build(); markwon.setMarkdown(textView, markdown); } + public void step_6() { + + final Markwon markwon = Markwon.builder(this) + .usePlugin(HtmlPlugin.create()) + .usePlugin(new AbstractMarkwonPlugin() { + @Override + public void configure(@NonNull Registry registry) { + registry.require(HtmlPlugin.class, plugin -> plugin.addHandler(new SimpleTagHandler() { + @Override + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps renderProps, @NonNull HtmlTag tag) { + return new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER); + } + + @NonNull + @Override + public Collection supportedTags() { + return Collections.singleton("center"); + } + })); + } + }) + .build(); + } + // text lifecycle (after/before) // rendering lifecycle (before/after) // renderProps diff --git a/sample/src/main/java/ru/noties/markwon/sample/recycler/RecyclerActivity.java b/sample/src/main/java/ru/noties/markwon/sample/recycler/RecyclerActivity.java index 72409a5f..ff911a15 100644 --- a/sample/src/main/java/ru/noties/markwon/sample/recycler/RecyclerActivity.java +++ b/sample/src/main/java/ru/noties/markwon/sample/recycler/RecyclerActivity.java @@ -86,8 +86,8 @@ public class RecyclerActivity extends Activity { // .addSchemeHandler(OkHttpNetworkSchemeHandler.create()) // .addMediaDecoder(SvgMediaDecoder.create()); // })) -// .usePlugin(PicassoImagesPlugin.create(context)) - .usePlugin(GlideImagesPlugin.create(context)) + .usePlugin(PicassoImagesPlugin.create(context)) +// .usePlugin(GlideImagesPlugin.create(context)) // important to use TableEntryPlugin instead of TablePlugin .usePlugin(TableEntryPlugin.create(context)) .usePlugin(HtmlPlugin.create())