diff --git a/gradle.properties b/gradle.properties index abdc2b60..e3eb78c6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ org.gradle.configureondemand=true android.enableBuildCache=true android.buildCacheDir=build/pre-dex-cache -VERSION_NAME=3.1.0-SNAPSHOT +VERSION_NAME=4.0.0-SNAPSHOT GROUP=ru.noties.markwon POM_DESCRIPTION=Markwon markdown for Android 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 4fa633f4..fd9bad40 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 @@ -10,6 +10,17 @@ import org.commonmark.node.Node; import ru.noties.markwon.AbstractMarkwonPlugin; import ru.noties.markwon.MarkwonConfiguration; import ru.noties.markwon.MarkwonVisitor; +import ru.noties.markwon.html.tag.BlockquoteHandler; +import ru.noties.markwon.html.tag.EmphasisHandler; +import ru.noties.markwon.html.tag.HeadingHandler; +import ru.noties.markwon.html.tag.ImageHandler; +import ru.noties.markwon.html.tag.LinkHandler; +import ru.noties.markwon.html.tag.ListHandler; +import ru.noties.markwon.html.tag.StrikeHandler; +import ru.noties.markwon.html.tag.StrongEmphasisHandler; +import ru.noties.markwon.html.tag.SubScriptHandler; +import ru.noties.markwon.html.tag.SuperScriptHandler; +import ru.noties.markwon.html.tag.UnderlineHandler; /** * @since 3.0.0 @@ -73,9 +84,29 @@ public class HtmlPlugin extends AbstractMarkwonPlugin { } @Override - public void configureConfiguration(@NonNull MarkwonConfiguration.Builder builder) { - builder - .htmlRenderer(this.builder.build()) + public void configureConfiguration(@NonNull MarkwonConfiguration.Builder configurationBuilder) { + + final MarkwonHtmlRendererImpl.Builder builder = this.builder; + + if (!builder.excludeDefaults()) { + // please note that it's better to not checkState for + // this method call (minor optimization), final `build` method call + // will check for the state and throw an exception if applicable + builder.addDefaultTagHandler(ImageHandler.create()); + builder.addDefaultTagHandler(new LinkHandler()); + builder.addDefaultTagHandler(new BlockquoteHandler()); + builder.addDefaultTagHandler(new SubScriptHandler()); + builder.addDefaultTagHandler(new SuperScriptHandler()); + builder.addDefaultTagHandler(new StrongEmphasisHandler()); + builder.addDefaultTagHandler(new StrikeHandler()); + builder.addDefaultTagHandler(new UnderlineHandler()); + builder.addDefaultTagHandler(new ListHandler()); + builder.addDefaultTagHandler(new EmphasisHandler()); + builder.addDefaultTagHandler(new HeadingHandler()); + } + + configurationBuilder + .htmlRenderer(builder.build()) .htmlParser(MarkwonHtmlParserImpl.create()); } diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/MarkwonHtmlRendererImpl.java b/markwon-html/src/main/java/ru/noties/markwon/html/MarkwonHtmlRendererImpl.java index 3699f5f5..dbde9035 100644 --- a/markwon-html/src/main/java/ru/noties/markwon/html/MarkwonHtmlRendererImpl.java +++ b/markwon-html/src/main/java/ru/noties/markwon/html/MarkwonHtmlRendererImpl.java @@ -9,17 +9,6 @@ import java.util.List; import java.util.Map; import ru.noties.markwon.MarkwonVisitor; -import ru.noties.markwon.html.tag.BlockquoteHandler; -import ru.noties.markwon.html.tag.EmphasisHandler; -import ru.noties.markwon.html.tag.HeadingHandler; -import ru.noties.markwon.html.tag.ImageHandler; -import ru.noties.markwon.html.tag.LinkHandler; -import ru.noties.markwon.html.tag.ListHandler; -import ru.noties.markwon.html.tag.StrikeHandler; -import ru.noties.markwon.html.tag.StrongEmphasisHandler; -import ru.noties.markwon.html.tag.SubScriptHandler; -import ru.noties.markwon.html.tag.SuperScriptHandler; -import ru.noties.markwon.html.tag.UnderlineHandler; class MarkwonHtmlRendererImpl extends MarkwonHtmlRenderer { @@ -127,6 +116,10 @@ class MarkwonHtmlRendererImpl extends MarkwonHtmlRenderer { checkState(); this.excludeDefaults = excludeDefaults; } + + boolean excludeDefaults() { + return excludeDefaults; + } @NonNull public MarkwonHtmlRenderer build() { @@ -135,11 +128,6 @@ class MarkwonHtmlRendererImpl extends MarkwonHtmlRenderer { isBuilt = true; - if (!excludeDefaults) { - // register default handlers, check if a handler is present already for specified tag - registerDefaultHandlers(); - } - // okay, let's validate that we have at least one tagHandler registered // if we have none -> return no-op implementation return tagHandlers.size() > 0 @@ -153,21 +141,7 @@ class MarkwonHtmlRendererImpl extends MarkwonHtmlRenderer { } } - private void registerDefaultHandlers() { - add(ImageHandler.create()); - add(new LinkHandler()); - add(new BlockquoteHandler()); - add(new SubScriptHandler()); - add(new SuperScriptHandler()); - add(new StrongEmphasisHandler()); - add(new StrikeHandler()); - add(new UnderlineHandler()); - add(new ListHandler()); - add(new EmphasisHandler()); - add(new HeadingHandler()); - } - - private void add(@NonNull TagHandler tagHandler) { + void addDefaultTagHandler(@NonNull TagHandler tagHandler) { for (String tag : tagHandler.supportedTags()) { if (!tagHandlers.containsKey(tag)) { tagHandlers.put(tag, tagHandler); diff --git a/markwon-image/src/main/java/ru/noties/markwon/image/AsyncDrawableLoaderBuilder.java b/markwon-image/src/main/java/ru/noties/markwon/image/AsyncDrawableLoaderBuilder.java index a57ca99b..59de548f 100644 --- a/markwon-image/src/main/java/ru/noties/markwon/image/AsyncDrawableLoaderBuilder.java +++ b/markwon-image/src/main/java/ru/noties/markwon/image/AsyncDrawableLoaderBuilder.java @@ -34,30 +34,36 @@ class AsyncDrawableLoaderBuilder { } void executorService(@NonNull ExecutorService executorService) { + checkState(); this.executorService = executorService; } void addSchemeHandler(@NonNull SchemeHandler schemeHandler) { + checkState(); for (String scheme : schemeHandler.supportedSchemes()) { schemeHandlers.put(scheme, schemeHandler); } } void addMediaDecoder(@NonNull MediaDecoder mediaDecoder) { + checkState(); for (String type : mediaDecoder.supportedTypes()) { mediaDecoders.put(type, mediaDecoder); } } void defaultMediaDecoder(@Nullable MediaDecoder mediaDecoder) { + checkState(); this.defaultMediaDecoder = mediaDecoder; } void removeSchemeHandler(@NonNull String scheme) { + checkState(); schemeHandlers.remove(scheme); } void removeMediaDecoder(@NonNull String contentType) { + checkState(); mediaDecoders.remove(contentType); } @@ -65,6 +71,7 @@ class AsyncDrawableLoaderBuilder { * @since 3.0.0 */ void placeholderProvider(@NonNull ImagesPlugin.PlaceholderProvider placeholderDrawableProvider) { + checkState(); this.placeholderProvider = placeholderDrawableProvider; } @@ -72,12 +79,15 @@ class AsyncDrawableLoaderBuilder { * @since 3.0.0 */ void errorHandler(@NonNull ImagesPlugin.ErrorHandler errorHandler) { + checkState(); this.errorHandler = errorHandler; } @NonNull AsyncDrawableLoader build() { + checkState(); + isBuilt = true; if (executorService == null) { @@ -86,4 +96,11 @@ class AsyncDrawableLoaderBuilder { return new AsyncDrawableLoaderImpl(this); } + + private void checkState() { + if (isBuilt) { + throw new IllegalStateException("ImagesPlugin has already been configured " + + "and cannot be modified any further"); + } + } } diff --git a/markwon-image/src/main/java/ru/noties/markwon/image/ImagesPlugin.java b/markwon-image/src/main/java/ru/noties/markwon/image/ImagesPlugin.java index ee5d3cc9..ebb4cea0 100644 --- a/markwon-image/src/main/java/ru/noties/markwon/image/ImagesPlugin.java +++ b/markwon-image/src/main/java/ru/noties/markwon/image/ImagesPlugin.java @@ -72,7 +72,6 @@ public class ImagesPlugin extends AbstractMarkwonPlugin { */ @NonNull public ImagesPlugin executorService(@NonNull ExecutorService executorService) { - checkBuilderState(); builder.executorService(executorService); return this; } @@ -87,7 +86,6 @@ public class ImagesPlugin extends AbstractMarkwonPlugin { */ @NonNull public ImagesPlugin addSchemeHandler(@NonNull SchemeHandler schemeHandler) { - checkBuilderState(); builder.addSchemeHandler(schemeHandler); return this; } @@ -100,7 +98,6 @@ public class ImagesPlugin extends AbstractMarkwonPlugin { */ @NonNull public ImagesPlugin addMediaDecoder(@NonNull MediaDecoder mediaDecoder) { - checkBuilderState(); builder.addMediaDecoder(mediaDecoder); return this; } @@ -114,7 +111,6 @@ public class ImagesPlugin extends AbstractMarkwonPlugin { */ @NonNull public ImagesPlugin defaultMediaDecoder(@Nullable MediaDecoder mediaDecoder) { - checkBuilderState(); builder.defaultMediaDecoder(mediaDecoder); return this; } @@ -124,7 +120,6 @@ public class ImagesPlugin extends AbstractMarkwonPlugin { */ @NonNull public ImagesPlugin removeSchemeHandler(@NonNull String scheme) { - checkBuilderState(); builder.removeSchemeHandler(scheme); return this; } @@ -134,7 +129,6 @@ public class ImagesPlugin extends AbstractMarkwonPlugin { */ @NonNull public ImagesPlugin removeMediaDecoder(@NonNull String contentType) { - checkBuilderState(); builder.removeMediaDecoder(contentType); return this; } @@ -144,7 +138,6 @@ public class ImagesPlugin extends AbstractMarkwonPlugin { */ @NonNull public ImagesPlugin placeholderProvider(@NonNull PlaceholderProvider placeholderProvider) { - checkBuilderState(); builder.placeholderProvider(placeholderProvider); return this; } @@ -155,14 +148,12 @@ public class ImagesPlugin extends AbstractMarkwonPlugin { */ @NonNull public ImagesPlugin errorHandler(@NonNull ErrorHandler errorHandler) { - checkBuilderState(); builder.errorHandler(errorHandler); return this; } @Override public void configureConfiguration(@NonNull MarkwonConfiguration.Builder builder) { - checkBuilderState(); builder.asyncDrawableLoader(this.builder.build()); } @@ -180,11 +171,4 @@ public class ImagesPlugin extends AbstractMarkwonPlugin { public void afterSetText(@NonNull TextView textView) { AsyncDrawableScheduler.schedule(textView); } - - private void checkBuilderState() { - if (builder.isBuilt) { - throw new IllegalStateException("ImagesPlugin has already been configured " + - "and cannot be modified any further"); - } - } } diff --git a/markwon-linkify/README.md b/markwon-linkify/README.md index 12d90c14..ccc0c08e 100644 --- a/markwon-linkify/README.md +++ b/markwon-linkify/README.md @@ -4,6 +4,6 @@ Use this module (or take a hint from it) if you would need _linkify_ capabilitie use `TextView.setAutolinkMask` (or specify `autolink` in XML) because it will remove all existing links and keep only the ones it creates. -Please note that usage of this plugin introduces significant performance drop due not +Please note that usage of this plugin introduces significant performance drop due to not optimal implementation of underlying `android.text.util.Linkify`. If you have any ideas of how to improve this - PR are welcome! \ No newline at end of file