From df0177af95ba962311179aa0de793526070fced8 Mon Sep 17 00:00:00 2001 From: Dimitry Ivanov Date: Tue, 4 Jun 2019 16:32:35 +0300 Subject: [PATCH] Move HTML specifics to html module --- _CHANGES.md | 4 +- .../noties/markwon/AbstractMarkwonPlugin.java | 5 - .../ru/noties/markwon/MarkwonBuilderImpl.java | 4 - .../noties/markwon/MarkwonConfiguration.java | 16 ++- .../java/ru/noties/markwon/MarkwonPlugin.java | 20 ++-- .../markwon/html/MarkwonHtmlRenderer.java | 38 +------ .../ru/noties/markwon/html/TagHandler.java | 9 ++ .../ru/noties/markwon/html/HtmlPlugin.java | 101 +++++++++--------- .../markwon/html/MarkwonHtmlParserImpl.java | 1 - .../markwon/html/MarkwonHtmlRendererImpl.java | 99 +++++++++++------ .../noties/markwon/html/TagHandlerNoOp.java | 43 ++++++++ .../markwon/html/tag/BlockquoteHandler.java | 9 ++ .../markwon/html/tag/EmphasisHandler.java | 9 ++ .../markwon/html/tag/HeadingHandler.java | 9 ++ .../noties/markwon/html/tag/ImageHandler.java | 9 ++ .../noties/markwon/html/tag/LinkHandler.java | 9 ++ .../noties/markwon/html/tag/ListHandler.java | 9 ++ .../markwon/html/tag/SimpleTagHandler.java | 7 ++ .../markwon/html/tag/StrikeHandler.java | 9 ++ .../html/tag/StrongEmphasisHandler.java | 9 ++ .../markwon/html/tag/SubScriptHandler.java | 9 ++ .../markwon/html/tag/SuperScriptHandler.java | 9 ++ .../markwon/html/tag/UnderlineHandler.java | 9 ++ 23 files changed, 307 insertions(+), 139 deletions(-) rename {markwon-core => markwon-html}/src/main/java/ru/noties/markwon/html/MarkwonHtmlRendererImpl.java (58%) create mode 100644 markwon-html/src/main/java/ru/noties/markwon/html/TagHandlerNoOp.java diff --git a/_CHANGES.md b/_CHANGES.md index 4695759f..28856328 100644 --- a/_CHANGES.md +++ b/_CHANGES.md @@ -6,4 +6,6 @@ internally caches latest state and skips scheduling if drawables are already processed * configure with registry * removed priority -* images-plugin moved to standalone again \ No newline at end of file +* images-plugin moved to standalone again +* removed MarkwonPlugin#configureHtmlRenderer -> now part of HtmlPlugin +* TagHandler now has `supportedTags()` method \ No newline at end of file diff --git a/markwon-core/src/main/java/ru/noties/markwon/AbstractMarkwonPlugin.java b/markwon-core/src/main/java/ru/noties/markwon/AbstractMarkwonPlugin.java index ae05550a..4fb39da0 100644 --- a/markwon-core/src/main/java/ru/noties/markwon/AbstractMarkwonPlugin.java +++ b/markwon-core/src/main/java/ru/noties/markwon/AbstractMarkwonPlugin.java @@ -49,11 +49,6 @@ public abstract class AbstractMarkwonPlugin implements MarkwonPlugin { } - @Override - public void configureHtmlRenderer(@NonNull MarkwonHtmlRenderer.Builder builder) { - - } - @NonNull @Override public String processMarkdown(@NonNull String markdown) { diff --git a/markwon-core/src/main/java/ru/noties/markwon/MarkwonBuilderImpl.java b/markwon-core/src/main/java/ru/noties/markwon/MarkwonBuilderImpl.java index b650ff1b..863cfe30 100644 --- a/markwon-core/src/main/java/ru/noties/markwon/MarkwonBuilderImpl.java +++ b/markwon-core/src/main/java/ru/noties/markwon/MarkwonBuilderImpl.java @@ -16,7 +16,6 @@ import java.util.List; import java.util.Set; import ru.noties.markwon.core.MarkwonTheme; -import ru.noties.markwon.html.MarkwonHtmlRenderer; /** * @since 3.0.0 @@ -84,7 +83,6 @@ class MarkwonBuilderImpl implements Markwon.Builder { final MarkwonConfiguration.Builder configurationBuilder = new MarkwonConfiguration.Builder(); final MarkwonVisitor.Builder visitorBuilder = new MarkwonVisitorImpl.BuilderImpl(); final MarkwonSpansFactory.Builder spanFactoryBuilder = new MarkwonSpansFactoryImpl.BuilderImpl(); - final MarkwonHtmlRenderer.Builder htmlRendererBuilder = MarkwonHtmlRenderer.builder(); for (MarkwonPlugin plugin : plugins) { plugin.configureParser(parserBuilder); @@ -92,12 +90,10 @@ class MarkwonBuilderImpl implements Markwon.Builder { plugin.configureConfiguration(configurationBuilder); plugin.configureVisitor(visitorBuilder); plugin.configureSpansFactory(spanFactoryBuilder); - plugin.configureHtmlRenderer(htmlRendererBuilder); } final MarkwonConfiguration configuration = configurationBuilder.build( themeBuilder.build(), - htmlRendererBuilder.build(), spanFactoryBuilder.build()); final RenderProps renderProps = new RenderPropsImpl(); diff --git a/markwon-core/src/main/java/ru/noties/markwon/MarkwonConfiguration.java b/markwon-core/src/main/java/ru/noties/markwon/MarkwonConfiguration.java index af65fdb4..66159da4 100644 --- a/markwon-core/src/main/java/ru/noties/markwon/MarkwonConfiguration.java +++ b/markwon-core/src/main/java/ru/noties/markwon/MarkwonConfiguration.java @@ -122,6 +122,15 @@ public class MarkwonConfiguration { return this; } + /** + * @since 4.0.0-SNAPSHOT + */ + @NonNull + public Builder htmlRenderer(@NonNull MarkwonHtmlRenderer htmlRenderer) { + this.htmlRenderer = htmlRenderer; + return this; + } + @NonNull public Builder syntaxHighlight(@NonNull SyntaxHighlight syntaxHighlight) { this.syntaxHighlight = syntaxHighlight; @@ -158,11 +167,9 @@ public class MarkwonConfiguration { @NonNull public MarkwonConfiguration build( @NonNull MarkwonTheme theme, - @NonNull MarkwonHtmlRenderer htmlRenderer, @NonNull MarkwonSpansFactory spansFactory) { this.theme = theme; - this.htmlRenderer = htmlRenderer; this.spansFactory = spansFactory; // @since 4.0.0-SNAPSHOT @@ -170,6 +177,11 @@ public class MarkwonConfiguration { asyncDrawableLoader = AsyncDrawableLoader.noOp(); } + // @since 4.0.0-SNAPSHOT + if (htmlRenderer == null) { + htmlRenderer = MarkwonHtmlRenderer.noOp(); + } + if (syntaxHighlight == null) { syntaxHighlight = new SyntaxHighlightNoOp(); } diff --git a/markwon-core/src/main/java/ru/noties/markwon/MarkwonPlugin.java b/markwon-core/src/main/java/ru/noties/markwon/MarkwonPlugin.java index 8bc4dc8d..fb7f1022 100644 --- a/markwon-core/src/main/java/ru/noties/markwon/MarkwonPlugin.java +++ b/markwon-core/src/main/java/ru/noties/markwon/MarkwonPlugin.java @@ -16,7 +16,7 @@ import ru.noties.markwon.html.MarkwonHtmlRenderer; * * @see AbstractMarkwonPlugin * @see ru.noties.markwon.core.CorePlugin - * @see ru.noties.markwon.image.ImagesPlugin + * @see ru.noties.markwon.movement.MovementMethodPlugin * @since 3.0.0 */ public interface MarkwonPlugin { @@ -88,13 +88,13 @@ public interface MarkwonPlugin { */ void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder); - /** - * Configure {@link MarkwonHtmlRenderer} to add or remove HTML {@link ru.noties.markwon.html.TagHandler}s - * - * @see MarkwonHtmlRenderer - * @see MarkwonHtmlRenderer.Builder - */ - void configureHtmlRenderer(@NonNull MarkwonHtmlRenderer.Builder builder); +// /** +// * Configure {@link MarkwonHtmlRenderer} to add or remove HTML {@link ru.noties.markwon.html.TagHandler}s +// * +// * @see MarkwonHtmlRenderer +// * @see MarkwonHtmlRenderer.Builder +// */ +// void configureHtmlRenderer(@NonNull MarkwonHtmlRenderer.Builder builder); /** * Process input markdown and return new string to be used in parsing stage further. @@ -128,7 +128,7 @@ public interface MarkwonPlugin { /** * This method will be called before calling TextView#setText. *

- * It can be useful to prepare a TextView for markdown. For example {@link ru.noties.markwon.image.ImagesPlugin} + * It can be useful to prepare a TextView for markdown. For example {@code ru.noties.markwon.image.ImagesPlugin} * uses this method to unregister previously registered {@link ru.noties.markwon.image.AsyncDrawableSpan} * (if there are such spans in this TextView at this point). Or {@link ru.noties.markwon.core.CorePlugin} * which measures ordered list numbers @@ -141,7 +141,7 @@ public interface MarkwonPlugin { /** * This method will be called after markdown was applied. *

- * It can be useful to trigger certain action on spans/textView. For example {@link ru.noties.markwon.image.ImagesPlugin} + * It can be useful to trigger certain action on spans/textView. For example {@code ru.noties.markwon.image.ImagesPlugin} * uses this method to register {@link ru.noties.markwon.image.AsyncDrawableSpan} and start * asynchronously loading images. *

diff --git a/markwon-core/src/main/java/ru/noties/markwon/html/MarkwonHtmlRenderer.java b/markwon-core/src/main/java/ru/noties/markwon/html/MarkwonHtmlRenderer.java index 93d0411d..88bf8709 100644 --- a/markwon-core/src/main/java/ru/noties/markwon/html/MarkwonHtmlRenderer.java +++ b/markwon-core/src/main/java/ru/noties/markwon/html/MarkwonHtmlRenderer.java @@ -3,8 +3,6 @@ package ru.noties.markwon.html; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import java.util.Collection; - import ru.noties.markwon.MarkwonVisitor; /** @@ -12,9 +10,12 @@ import ru.noties.markwon.MarkwonVisitor; */ public abstract class MarkwonHtmlRenderer { + /** + * @since 4.0.0-SNAPSHOT + */ @NonNull - public static Builder builder() { - return new MarkwonHtmlRendererImpl.BuilderImpl(); + public static MarkwonHtmlRenderer noOp() { + return new MarkwonHtmlRendererNoOp(); } public abstract void render( @@ -24,33 +25,4 @@ public abstract class MarkwonHtmlRenderer { @Nullable public abstract TagHandler tagHandler(@NonNull String tagName); - - - /** - * @since 3.0.0 - */ - public interface Builder { - - /** - * @param allowNonClosedTags parameter to indicate that all non-closed HTML tags should be - * closed at the end of a document. if {@code true} all non-closed - * tags will be force-closed at the end. Otherwise these tags will be - * ignored and thus not rendered. - * @return self - */ - @NonNull - Builder allowNonClosedTags(boolean allowNonClosedTags); - - @NonNull - Builder setHandler(@NonNull String tagName, @Nullable TagHandler tagHandler); - - @NonNull - Builder setHandler(@NonNull Collection tagNames, @Nullable TagHandler tagHandler); - - @Nullable - TagHandler getHandler(@NonNull String tagName); - - @NonNull - MarkwonHtmlRenderer build(); - } } diff --git a/markwon-core/src/main/java/ru/noties/markwon/html/TagHandler.java b/markwon-core/src/main/java/ru/noties/markwon/html/TagHandler.java index 84122946..28c2c068 100644 --- a/markwon-core/src/main/java/ru/noties/markwon/html/TagHandler.java +++ b/markwon-core/src/main/java/ru/noties/markwon/html/TagHandler.java @@ -2,6 +2,8 @@ package ru.noties.markwon.html; import android.support.annotation.NonNull; +import java.util.Collection; + import ru.noties.markwon.MarkwonVisitor; public abstract class TagHandler { @@ -12,6 +14,13 @@ public abstract class TagHandler { @NonNull HtmlTag tag ); + /** + * @since 4.0.0-SNAPSHOT + */ + @NonNull + public abstract Collection supportedTags(); + + protected static void visitChildren( @NonNull MarkwonVisitor visitor, @NonNull MarkwonHtmlRenderer renderer, 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 d087058e..4fa633f4 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,19 +10,6 @@ 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; - -import static java.util.Arrays.asList; /** * @since 3.0.0 @@ -36,48 +23,60 @@ public class HtmlPlugin extends AbstractMarkwonPlugin { public static final float SCRIPT_DEF_TEXT_SIZE_RATIO = .75F; - @Override - public void configureConfiguration(@NonNull MarkwonConfiguration.Builder builder) { - builder.htmlParser(MarkwonHtmlParserImpl.create()); + private final MarkwonHtmlRendererImpl.Builder builder; + + @SuppressWarnings("WeakerAccess") + HtmlPlugin() { + this.builder = new MarkwonHtmlRendererImpl.Builder(); + } + + /** + * @param allowNonClosedTags whether or not non-closed tags should be closed + * at the document end. By default `false` + * @since 4.0.0-SNAPSHOT + */ + @NonNull + public HtmlPlugin allowNonClosedTags(boolean allowNonClosedTags) { + builder.allowNonClosedTags(allowNonClosedTags); + return this; + } + + /** + * @since 4.0.0-SNAPSHOT + */ + @NonNull + public HtmlPlugin addHandler(@NonNull TagHandler tagHandler) { + builder.addHandler(tagHandler); + return this; + } + + /** + * @since 4.0.0-SNAPSHOT + */ + @Nullable + public TagHandler getHandler(@NonNull String tagName) { + return builder.getHandler(tagName); + } + + /** + * Indicate if HtmlPlugin should register default HTML tag handlers. Pass `true` to not + * include default handlers. By default default handlers are included. You can use + * {@link TagHandlerNoOp} to no-op certain default tags. + * + * @see TagHandlerNoOp + * @since 4.0.0-SNAPSHOT + */ + @NonNull + public HtmlPlugin excludeDefaults(boolean excludeDefaults) { + builder.excludeDefaults(excludeDefaults); + return this; } @Override - public void configureHtmlRenderer(@NonNull MarkwonHtmlRenderer.Builder builder) { - + public void configureConfiguration(@NonNull MarkwonConfiguration.Builder builder) { builder - .setHandler( - "img", - ImageHandler.create()) - .setHandler( - "a", - new LinkHandler()) - .setHandler( - "blockquote", - new BlockquoteHandler()) - .setHandler( - "sub", - new SubScriptHandler()) - .setHandler( - "sup", - new SuperScriptHandler()) - .setHandler( - asList("b", "strong"), - new StrongEmphasisHandler()) - .setHandler( - asList("s", "del"), - new StrikeHandler()) - .setHandler( - asList("u", "ins"), - new UnderlineHandler()) - .setHandler( - asList("ul", "ol"), - new ListHandler()) - .setHandler( - asList("i", "em", "cite", "dfn"), - new EmphasisHandler()) - .setHandler( - asList("h1", "h2", "h3", "h4", "h5", "h6"), - new HeadingHandler()); + .htmlRenderer(this.builder.build()) + .htmlParser(MarkwonHtmlParserImpl.create()); } @Override diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/MarkwonHtmlParserImpl.java b/markwon-html/src/main/java/ru/noties/markwon/html/MarkwonHtmlParserImpl.java index 6d715510..e0f4a9e3 100644 --- a/markwon-html/src/main/java/ru/noties/markwon/html/MarkwonHtmlParserImpl.java +++ b/markwon-html/src/main/java/ru/noties/markwon/html/MarkwonHtmlParserImpl.java @@ -195,7 +195,6 @@ public class MarkwonHtmlParserImpl extends MarkwonHtmlParser { } } - //noinspection unchecked action.apply(Collections.unmodifiableList((List) inlineTags)); inlineTags.clear(); } else { diff --git a/markwon-core/src/main/java/ru/noties/markwon/html/MarkwonHtmlRendererImpl.java b/markwon-html/src/main/java/ru/noties/markwon/html/MarkwonHtmlRendererImpl.java similarity index 58% rename from markwon-core/src/main/java/ru/noties/markwon/html/MarkwonHtmlRendererImpl.java rename to markwon-html/src/main/java/ru/noties/markwon/html/MarkwonHtmlRendererImpl.java index 0f4c97e6..3699f5f5 100644 --- a/markwon-core/src/main/java/ru/noties/markwon/html/MarkwonHtmlRendererImpl.java +++ b/markwon-html/src/main/java/ru/noties/markwon/html/MarkwonHtmlRendererImpl.java @@ -3,19 +3,30 @@ package ru.noties.markwon.html; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; 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 { private final boolean allowNonClosedTags; private final Map tagHandlers; + @SuppressWarnings("WeakerAccess") MarkwonHtmlRendererImpl(boolean allowNonClosedTags, @NonNull Map tagHandlers) { this.allowNonClosedTags = allowNonClosedTags; this.tagHandlers = tagHandlers; @@ -86,58 +97,82 @@ class MarkwonHtmlRendererImpl extends MarkwonHtmlRenderer { return tagHandlers.get(tagName); } - static class BuilderImpl implements Builder { + static class Builder { private final Map tagHandlers = new HashMap<>(2); private boolean allowNonClosedTags; + private boolean excludeDefaults; - @NonNull - @Override - public Builder allowNonClosedTags(boolean allowNonClosedTags) { + private boolean isBuilt; + + void allowNonClosedTags(boolean allowNonClosedTags) { + checkState(); this.allowNonClosedTags = allowNonClosedTags; - return this; } - @NonNull - @Override - public Builder setHandler(@NonNull String tagName, @Nullable TagHandler tagHandler) { - if (tagHandler == null) { - tagHandlers.remove(tagName); - } else { - tagHandlers.put(tagName, tagHandler); + void addHandler(@NonNull TagHandler tagHandler) { + checkState(); + for (String tag : tagHandler.supportedTags()) { + tagHandlers.put(tag, tagHandler); } - return this; - } - - @NonNull - @Override - public Builder setHandler(@NonNull Collection tagNames, @Nullable TagHandler tagHandler) { - if (tagHandler == null) { - for (String tagName : tagNames) { - tagHandlers.remove(tagName); - } - } else { - for (String tagName : tagNames) { - tagHandlers.put(tagName, tagHandler); - } - } - return this; } @Nullable - @Override - public TagHandler getHandler(@NonNull String tagName) { + TagHandler getHandler(@NonNull String tagName) { + checkState(); return tagHandlers.get(tagName); } + public void excludeDefaults(boolean excludeDefaults) { + checkState(); + this.excludeDefaults = excludeDefaults; + } + @NonNull - @Override public MarkwonHtmlRenderer build() { + + checkState(); + + 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 ? new MarkwonHtmlRendererImpl(allowNonClosedTags, Collections.unmodifiableMap(tagHandlers)) : new MarkwonHtmlRendererNoOp(); } + + private void checkState() { + if (isBuilt) { + throw new IllegalStateException("Builder has been already built"); + } + } + + 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) { + for (String tag : tagHandler.supportedTags()) { + if (!tagHandlers.containsKey(tag)) { + tagHandlers.put(tag, tagHandler); + } + } + } } } diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/TagHandlerNoOp.java b/markwon-html/src/main/java/ru/noties/markwon/html/TagHandlerNoOp.java new file mode 100644 index 00000000..c96d6867 --- /dev/null +++ b/markwon-html/src/main/java/ru/noties/markwon/html/TagHandlerNoOp.java @@ -0,0 +1,43 @@ +package ru.noties.markwon.html; + +import android.support.annotation.NonNull; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; + +import ru.noties.markwon.MarkwonVisitor; + +/** + * @since 4.0.0-SNAPSHOT + */ +public class TagHandlerNoOp extends TagHandler { + + @NonNull + public static TagHandlerNoOp create(@NonNull String tag) { + return new TagHandlerNoOp(Collections.singleton(tag)); + } + + @NonNull + public static TagHandlerNoOp create(@NonNull String... tags) { + return new TagHandlerNoOp(Arrays.asList(tags)); + } + + private final Collection tags; + + @SuppressWarnings("WeakerAccess") + TagHandlerNoOp(Collection tags) { + this.tags = tags; + } + + @Override + public void handle(@NonNull MarkwonVisitor visitor, @NonNull MarkwonHtmlRenderer renderer, @NonNull HtmlTag tag) { + // no op + } + + @NonNull + @Override + public Collection supportedTags() { + return tags; + } +} diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/tag/BlockquoteHandler.java b/markwon-html/src/main/java/ru/noties/markwon/html/tag/BlockquoteHandler.java index 930a8dda..31ed4916 100644 --- a/markwon-html/src/main/java/ru/noties/markwon/html/tag/BlockquoteHandler.java +++ b/markwon-html/src/main/java/ru/noties/markwon/html/tag/BlockquoteHandler.java @@ -4,6 +4,9 @@ import android.support.annotation.NonNull; import org.commonmark.node.BlockQuote; +import java.util.Collection; +import java.util.Collections; + import ru.noties.markwon.MarkwonConfiguration; import ru.noties.markwon.MarkwonVisitor; import ru.noties.markwon.SpanFactory; @@ -35,4 +38,10 @@ public class BlockquoteHandler extends TagHandler { ); } } + + @NonNull + @Override + public Collection supportedTags() { + return Collections.singleton("blockquote"); + } } diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/tag/EmphasisHandler.java b/markwon-html/src/main/java/ru/noties/markwon/html/tag/EmphasisHandler.java index fe546ee0..a5e62c40 100644 --- a/markwon-html/src/main/java/ru/noties/markwon/html/tag/EmphasisHandler.java +++ b/markwon-html/src/main/java/ru/noties/markwon/html/tag/EmphasisHandler.java @@ -5,6 +5,9 @@ import android.support.annotation.Nullable; import org.commonmark.node.Emphasis; +import java.util.Arrays; +import java.util.Collection; + import ru.noties.markwon.MarkwonConfiguration; import ru.noties.markwon.RenderProps; import ru.noties.markwon.SpanFactory; @@ -23,4 +26,10 @@ public class EmphasisHandler extends SimpleTagHandler { } return spanFactory.getSpans(configuration, renderProps); } + + @NonNull + @Override + public Collection supportedTags() { + return Arrays.asList("i", "em", "cite", "dfn"); + } } diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/tag/HeadingHandler.java b/markwon-html/src/main/java/ru/noties/markwon/html/tag/HeadingHandler.java index a7de3a47..8c778f94 100644 --- a/markwon-html/src/main/java/ru/noties/markwon/html/tag/HeadingHandler.java +++ b/markwon-html/src/main/java/ru/noties/markwon/html/tag/HeadingHandler.java @@ -5,6 +5,9 @@ import android.support.annotation.Nullable; import org.commonmark.node.Heading; +import java.util.Arrays; +import java.util.Collection; + import ru.noties.markwon.MarkwonConfiguration; import ru.noties.markwon.RenderProps; import ru.noties.markwon.SpanFactory; @@ -41,4 +44,10 @@ public class HeadingHandler extends SimpleTagHandler { return factory.getSpans(configuration, renderProps); } + + @NonNull + @Override + public Collection supportedTags() { + return Arrays.asList("h1", "h2", "h3", "h4", "h5", "h6"); + } } diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/tag/ImageHandler.java b/markwon-html/src/main/java/ru/noties/markwon/html/tag/ImageHandler.java index 4e7ffa54..04cbe46e 100644 --- a/markwon-html/src/main/java/ru/noties/markwon/html/tag/ImageHandler.java +++ b/markwon-html/src/main/java/ru/noties/markwon/html/tag/ImageHandler.java @@ -6,6 +6,8 @@ import android.text.TextUtils; import org.commonmark.node.Image; +import java.util.Collection; +import java.util.Collections; import java.util.Map; import ru.noties.markwon.MarkwonConfiguration; @@ -18,6 +20,12 @@ import ru.noties.markwon.image.ImageSize; public class ImageHandler extends SimpleTagHandler { + @NonNull + @Override + public Collection supportedTags() { + return Collections.singleton("img"); + } + interface ImageSizeParser { @Nullable ImageSize parse(@NonNull Map attributes); @@ -30,6 +38,7 @@ public class ImageHandler extends SimpleTagHandler { private final ImageSizeParser imageSizeParser; + @SuppressWarnings("WeakerAccess") ImageHandler(@NonNull ImageSizeParser imageSizeParser) { this.imageSizeParser = imageSizeParser; } diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/tag/LinkHandler.java b/markwon-html/src/main/java/ru/noties/markwon/html/tag/LinkHandler.java index 04e768e9..a1687dd8 100644 --- a/markwon-html/src/main/java/ru/noties/markwon/html/tag/LinkHandler.java +++ b/markwon-html/src/main/java/ru/noties/markwon/html/tag/LinkHandler.java @@ -6,6 +6,9 @@ import android.text.TextUtils; import org.commonmark.node.Link; +import java.util.Collection; +import java.util.Collections; + import ru.noties.markwon.MarkwonConfiguration; import ru.noties.markwon.RenderProps; import ru.noties.markwon.SpanFactory; @@ -30,4 +33,10 @@ public class LinkHandler extends SimpleTagHandler { } return null; } + + @NonNull + @Override + public Collection supportedTags() { + return Collections.singleton("a"); + } } diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/tag/ListHandler.java b/markwon-html/src/main/java/ru/noties/markwon/html/tag/ListHandler.java index 66f76cc0..a8f8df9d 100644 --- a/markwon-html/src/main/java/ru/noties/markwon/html/tag/ListHandler.java +++ b/markwon-html/src/main/java/ru/noties/markwon/html/tag/ListHandler.java @@ -4,6 +4,9 @@ import android.support.annotation.NonNull; import org.commonmark.node.ListItem; +import java.util.Arrays; +import java.util.Collection; + import ru.noties.markwon.MarkwonConfiguration; import ru.noties.markwon.MarkwonVisitor; import ru.noties.markwon.RenderProps; @@ -65,6 +68,12 @@ public class ListHandler extends TagHandler { } } + @NonNull + @Override + public Collection supportedTags() { + return Arrays.asList("ol", "ul"); + } + private static int currentBulletListLevel(@NonNull HtmlTag.Block block) { int level = 0; while ((block = block.parent()) != null) { diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/tag/SimpleTagHandler.java b/markwon-html/src/main/java/ru/noties/markwon/html/tag/SimpleTagHandler.java index d5717c20..94341b2f 100644 --- a/markwon-html/src/main/java/ru/noties/markwon/html/tag/SimpleTagHandler.java +++ b/markwon-html/src/main/java/ru/noties/markwon/html/tag/SimpleTagHandler.java @@ -3,6 +3,8 @@ package ru.noties.markwon.html.tag; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import java.util.Collection; + import ru.noties.markwon.MarkwonConfiguration; import ru.noties.markwon.MarkwonVisitor; import ru.noties.markwon.RenderProps; @@ -19,6 +21,11 @@ public abstract class SimpleTagHandler extends TagHandler { @NonNull RenderProps renderProps, @NonNull HtmlTag tag); + @NonNull + @Override + public abstract Collection supportedTags(); + + @Override public void handle(@NonNull MarkwonVisitor visitor, @NonNull MarkwonHtmlRenderer renderer, @NonNull HtmlTag tag) { final Object spans = getSpans(visitor.configuration(), visitor.renderProps(), tag); diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/tag/StrikeHandler.java b/markwon-html/src/main/java/ru/noties/markwon/html/tag/StrikeHandler.java index 2771501e..02dedc8a 100644 --- a/markwon-html/src/main/java/ru/noties/markwon/html/tag/StrikeHandler.java +++ b/markwon-html/src/main/java/ru/noties/markwon/html/tag/StrikeHandler.java @@ -4,6 +4,9 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.style.StrikethroughSpan; +import java.util.Arrays; +import java.util.Collection; + import ru.noties.markwon.MarkwonConfiguration; import ru.noties.markwon.MarkwonVisitor; import ru.noties.markwon.SpanFactory; @@ -47,6 +50,12 @@ public class StrikeHandler extends TagHandler { ); } + @NonNull + @Override + public Collection supportedTags() { + return Arrays.asList("s", "del"); + } + @Nullable private static Object getMarkdownSpans(@NonNull MarkwonVisitor visitor) { final MarkwonConfiguration configuration = visitor.configuration(); diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/tag/StrongEmphasisHandler.java b/markwon-html/src/main/java/ru/noties/markwon/html/tag/StrongEmphasisHandler.java index 8e604b7f..486e43c4 100644 --- a/markwon-html/src/main/java/ru/noties/markwon/html/tag/StrongEmphasisHandler.java +++ b/markwon-html/src/main/java/ru/noties/markwon/html/tag/StrongEmphasisHandler.java @@ -5,6 +5,9 @@ import android.support.annotation.Nullable; import org.commonmark.node.StrongEmphasis; +import java.util.Arrays; +import java.util.Collection; + import ru.noties.markwon.MarkwonConfiguration; import ru.noties.markwon.RenderProps; import ru.noties.markwon.SpanFactory; @@ -23,4 +26,10 @@ public class StrongEmphasisHandler extends SimpleTagHandler { } return spanFactory.getSpans(configuration, renderProps); } + + @NonNull + @Override + public Collection supportedTags() { + return Arrays.asList("b", "strong"); + } } diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/tag/SubScriptHandler.java b/markwon-html/src/main/java/ru/noties/markwon/html/tag/SubScriptHandler.java index 5ddc5697..5c99d963 100644 --- a/markwon-html/src/main/java/ru/noties/markwon/html/tag/SubScriptHandler.java +++ b/markwon-html/src/main/java/ru/noties/markwon/html/tag/SubScriptHandler.java @@ -3,6 +3,9 @@ package ru.noties.markwon.html.tag; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import java.util.Collection; +import java.util.Collections; + import ru.noties.markwon.MarkwonConfiguration; import ru.noties.markwon.RenderProps; import ru.noties.markwon.html.HtmlTag; @@ -14,4 +17,10 @@ public class SubScriptHandler extends SimpleTagHandler { public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps renderProps, @NonNull HtmlTag tag) { return new SubScriptSpan(); } + + @NonNull + @Override + public Collection supportedTags() { + return Collections.singleton("sub"); + } } diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/tag/SuperScriptHandler.java b/markwon-html/src/main/java/ru/noties/markwon/html/tag/SuperScriptHandler.java index 77147c99..163a1735 100644 --- a/markwon-html/src/main/java/ru/noties/markwon/html/tag/SuperScriptHandler.java +++ b/markwon-html/src/main/java/ru/noties/markwon/html/tag/SuperScriptHandler.java @@ -3,6 +3,9 @@ package ru.noties.markwon.html.tag; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import java.util.Collection; +import java.util.Collections; + import ru.noties.markwon.MarkwonConfiguration; import ru.noties.markwon.RenderProps; import ru.noties.markwon.html.HtmlTag; @@ -14,4 +17,10 @@ public class SuperScriptHandler extends SimpleTagHandler { public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps renderProps, @NonNull HtmlTag tag) { return new SuperScriptSpan(); } + + @NonNull + @Override + public Collection supportedTags() { + return Collections.singleton("sup"); + } } diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/tag/UnderlineHandler.java b/markwon-html/src/main/java/ru/noties/markwon/html/tag/UnderlineHandler.java index eaa397a6..bc2be951 100644 --- a/markwon-html/src/main/java/ru/noties/markwon/html/tag/UnderlineHandler.java +++ b/markwon-html/src/main/java/ru/noties/markwon/html/tag/UnderlineHandler.java @@ -3,6 +3,9 @@ package ru.noties.markwon.html.tag; import android.support.annotation.NonNull; import android.text.style.UnderlineSpan; +import java.util.Arrays; +import java.util.Collection; + import ru.noties.markwon.MarkwonVisitor; import ru.noties.markwon.SpannableBuilder; import ru.noties.markwon.html.HtmlTag; @@ -31,4 +34,10 @@ public class UnderlineHandler extends TagHandler { tag.end() ); } + + @NonNull + @Override + public Collection supportedTags() { + return Arrays.asList("u", "ins"); + } }