From 107246c573a4dbe24f24a8c77e8a5c02a5753f0a Mon Sep 17 00:00:00 2001 From: Dimitry Ivanov Date: Sat, 22 Dec 2018 16:20:39 +0300 Subject: [PATCH] Update HTML plugin to reflect latest API changes --- .../strikethrough/StrikethroughPlugin.java | 16 +++++++- markwon-html/build.gradle | 6 +++ .../ru/noties/markwon/html/HtmlPlugin.java | 3 +- .../markwon/html/MarkwonHtmlRenderer.java | 14 +------ .../markwon/html/MarkwonHtmlRendererImpl.java | 12 +++--- .../markwon/html/MarkwonHtmlRendererNoOp.java | 21 ---------- .../ru/noties/markwon/html/TagHandler.java | 13 +++---- .../markwon/html/tag/BlockquoteHandler.java | 25 +++++++----- .../markwon/html/tag/EmphasisHandler.java | 15 ++++++- .../markwon/html/tag/HeadingHandler.java | 20 +++++++++- .../noties/markwon/html/tag/ImageHandler.java | 31 +++++++++------ .../noties/markwon/html/tag/LinkHandler.java | 21 +++++++--- .../noties/markwon/html/tag/ListHandler.java | 39 ++++++++++++------- .../markwon/html/tag/SimpleTagHandler.java | 13 +++++-- .../markwon/html/tag/StrikeHandler.java | 38 +++++++++++++++--- .../html/tag/StrongEmphasisHandler.java | 15 ++++++- .../markwon/html/tag/SubScriptHandler.java | 3 +- .../markwon/html/tag/SuperScriptHandler.java | 3 +- .../markwon/html/tag/UnderlineHandler.java | 9 ++--- 19 files changed, 203 insertions(+), 114 deletions(-) delete mode 100644 markwon-html/src/main/java/ru/noties/markwon/html/MarkwonHtmlRendererNoOp.java diff --git a/markwon-ext-strikethrough/src/main/java/ru/noties/markwon/ext/strikethrough/StrikethroughPlugin.java b/markwon-ext-strikethrough/src/main/java/ru/noties/markwon/ext/strikethrough/StrikethroughPlugin.java index 69c55890..eb832e7e 100644 --- a/markwon-ext-strikethrough/src/main/java/ru/noties/markwon/ext/strikethrough/StrikethroughPlugin.java +++ b/markwon-ext-strikethrough/src/main/java/ru/noties/markwon/ext/strikethrough/StrikethroughPlugin.java @@ -10,7 +10,11 @@ import org.commonmark.parser.Parser; import java.util.Collections; import ru.noties.markwon.AbstractMarkwonPlugin; +import ru.noties.markwon.MarkwonConfiguration; +import ru.noties.markwon.MarkwonSpansFactory; import ru.noties.markwon.MarkwonVisitor; +import ru.noties.markwon.RenderProps; +import ru.noties.markwon.SpanFactory; public class StrikethroughPlugin extends AbstractMarkwonPlugin { @@ -24,6 +28,16 @@ public class StrikethroughPlugin extends AbstractMarkwonPlugin { builder.extensions(Collections.singleton(StrikethroughExtension.create())); } + @Override + public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) { + builder.setFactory(Strikethrough.class, new SpanFactory() { + @Override + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) { + return new StrikethroughSpan(); + } + }); + } + @Override public void configureVisitor(@NonNull MarkwonVisitor.Builder builder) { builder.on(Strikethrough.class, new MarkwonVisitor.NodeVisitor() { @@ -31,7 +45,7 @@ public class StrikethroughPlugin extends AbstractMarkwonPlugin { public void visit(@NonNull MarkwonVisitor visitor, @NonNull Strikethrough strikethrough) { final int length = visitor.length(); visitor.visitChildren(strikethrough); - visitor.setSpans(length, new StrikethroughSpan()); + visitor.setSpansForNode(strikethrough, length); } }); } diff --git a/markwon-html/build.gradle b/markwon-html/build.gradle index b61b12de..ddf6d5c9 100644 --- a/markwon-html/build.gradle +++ b/markwon-html/build.gradle @@ -20,6 +20,12 @@ dependencies { deps.with { api it['support-annotations'] api it['commonmark'] + + // add a compileOnly dependency, so if this artifact is present + // we will try to obtain a SpanFactory for a Strikethrough node and use + // it to be consistent with markdown (please note that we do not use markwon plugin + // for that in case if different implementation is used) + compileOnly it['commonmark-strikethrough'] } deps.test.with { 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 0ee64b5e..acf20c62 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 @@ -3,7 +3,6 @@ package ru.noties.markwon.html; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import org.commonmark.node.Document; import org.commonmark.node.HtmlBlock; import org.commonmark.node.HtmlInline; import org.commonmark.node.Node; @@ -43,7 +42,7 @@ public class HtmlPlugin extends AbstractMarkwonPlugin { @Override public void afterRender(@NonNull Node node, @NonNull MarkwonVisitor visitor) { - renderer.render(visitor.configuration(), visitor.builder(), parser); + renderer.render(visitor, parser); } @Override diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/MarkwonHtmlRenderer.java b/markwon-html/src/main/java/ru/noties/markwon/html/MarkwonHtmlRenderer.java index 9e9d222f..f9fed923 100644 --- a/markwon-html/src/main/java/ru/noties/markwon/html/MarkwonHtmlRenderer.java +++ b/markwon-html/src/main/java/ru/noties/markwon/html/MarkwonHtmlRenderer.java @@ -3,25 +3,15 @@ package ru.noties.markwon.html; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import ru.noties.markwon.MarkwonConfiguration; -import ru.noties.markwon.SpannableBuilder; +import ru.noties.markwon.MarkwonVisitor; /** * @since 2.0.0 */ public abstract class MarkwonHtmlRenderer { - /** - * @since 3.0.0 - */ - @NonNull - public static MarkwonHtmlRenderer noOp() { - return new MarkwonHtmlRendererNoOp(); - } - public abstract void render( - @NonNull MarkwonConfiguration configuration, - @NonNull SpannableBuilder builder, + @NonNull MarkwonVisitor visitor, @NonNull MarkwonHtmlParser parser ); 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 399d58ca..33d292c9 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,8 +9,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import ru.noties.markwon.MarkwonConfiguration; -import ru.noties.markwon.SpannableBuilder; +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; @@ -100,15 +99,14 @@ public class MarkwonHtmlRendererImpl extends MarkwonHtmlRenderer { @Override public void render( - @NonNull final MarkwonConfiguration configuration, - @NonNull final SpannableBuilder builder, + @NonNull final MarkwonVisitor visitor, @NonNull MarkwonHtmlParser parser) { final int end; if (!allowNonClosedTags) { end = HtmlTag.NO_END; } else { - end = builder.length(); + end = visitor.length(); } parser.flushInlineTags(end, new MarkwonHtmlParser.FlushAction() { @@ -126,7 +124,7 @@ public class MarkwonHtmlRendererImpl extends MarkwonHtmlRenderer { handler = tagHandler(inline.name()); if (handler != null) { - handler.handle(configuration, MarkwonHtmlRendererImpl.this, builder, inline); + handler.handle(visitor, MarkwonHtmlRendererImpl.this, inline); } } } @@ -146,7 +144,7 @@ public class MarkwonHtmlRendererImpl extends MarkwonHtmlRenderer { handler = tagHandler(block.name()); if (handler != null) { - handler.handle(configuration, MarkwonHtmlRendererImpl.this, builder, block); + handler.handle(visitor, MarkwonHtmlRendererImpl.this, block); } else { // see if any of children can be handled apply(block.children()); diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/MarkwonHtmlRendererNoOp.java b/markwon-html/src/main/java/ru/noties/markwon/html/MarkwonHtmlRendererNoOp.java deleted file mode 100644 index 7df5027c..00000000 --- a/markwon-html/src/main/java/ru/noties/markwon/html/MarkwonHtmlRendererNoOp.java +++ /dev/null @@ -1,21 +0,0 @@ -package ru.noties.markwon.html; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import ru.noties.markwon.MarkwonConfiguration; -import ru.noties.markwon.SpannableBuilder; - -class MarkwonHtmlRendererNoOp extends MarkwonHtmlRenderer { - - @Override - public void render(@NonNull MarkwonConfiguration configuration, @NonNull SpannableBuilder builder, @NonNull MarkwonHtmlParser parser) { - - } - - @Nullable - @Override - public TagHandler tagHandler(@NonNull String tagName) { - return null; - } -} diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/TagHandler.java b/markwon-html/src/main/java/ru/noties/markwon/html/TagHandler.java index 881e882f..84122946 100644 --- a/markwon-html/src/main/java/ru/noties/markwon/html/TagHandler.java +++ b/markwon-html/src/main/java/ru/noties/markwon/html/TagHandler.java @@ -2,22 +2,19 @@ package ru.noties.markwon.html; import android.support.annotation.NonNull; -import ru.noties.markwon.MarkwonConfiguration; -import ru.noties.markwon.SpannableBuilder; +import ru.noties.markwon.MarkwonVisitor; public abstract class TagHandler { public abstract void handle( - @NonNull MarkwonConfiguration configuration, + @NonNull MarkwonVisitor visitor, @NonNull MarkwonHtmlRenderer renderer, - @NonNull SpannableBuilder builder, @NonNull HtmlTag tag ); protected static void visitChildren( - @NonNull MarkwonConfiguration configuration, + @NonNull MarkwonVisitor visitor, @NonNull MarkwonHtmlRenderer renderer, - @NonNull SpannableBuilder builder, @NonNull HtmlTag.Block block) { TagHandler handler; @@ -30,9 +27,9 @@ public abstract class TagHandler { handler = renderer.tagHandler(child.name()); if (handler != null) { - handler.handle(configuration, renderer, builder, child); + handler.handle(visitor, renderer, child); } else { - visitChildren(configuration, renderer, builder, child); + visitChildren(visitor, renderer, child); } } } 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 4cd93fa0..930a8dda 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 @@ -2,7 +2,11 @@ package ru.noties.markwon.html.tag; import android.support.annotation.NonNull; +import org.commonmark.node.BlockQuote; + import ru.noties.markwon.MarkwonConfiguration; +import ru.noties.markwon.MarkwonVisitor; +import ru.noties.markwon.SpanFactory; import ru.noties.markwon.SpannableBuilder; import ru.noties.markwon.html.HtmlTag; import ru.noties.markwon.html.MarkwonHtmlRenderer; @@ -12,20 +16,23 @@ public class BlockquoteHandler extends TagHandler { @Override public void handle( - @NonNull MarkwonConfiguration configuration, + @NonNull MarkwonVisitor visitor, @NonNull MarkwonHtmlRenderer renderer, - @NonNull SpannableBuilder builder, @NonNull HtmlTag tag) { if (tag.isBlock()) { - visitChildren(configuration, renderer, builder, tag.getAsBlock()); + visitChildren(visitor, renderer, tag.getAsBlock()); } - SpannableBuilder.setSpans( - builder, - configuration.factory().blockQuote(configuration.theme()), - tag.start(), - tag.end() - ); + final MarkwonConfiguration configuration = visitor.configuration(); + final SpanFactory factory = configuration.spansFactory().get(BlockQuote.class); + if (factory != null) { + SpannableBuilder.setSpans( + visitor.builder(), + factory.getSpans(configuration, visitor.renderProps()), + tag.start(), + tag.end() + ); + } } } 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 b0809be6..fe546ee0 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 @@ -3,13 +3,24 @@ package ru.noties.markwon.html.tag; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import org.commonmark.node.Emphasis; + import ru.noties.markwon.MarkwonConfiguration; +import ru.noties.markwon.RenderProps; +import ru.noties.markwon.SpanFactory; import ru.noties.markwon.html.HtmlTag; public class EmphasisHandler extends SimpleTagHandler { @Nullable @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull HtmlTag tag) { - return configuration.factory().emphasis(); + public Object getSpans( + @NonNull MarkwonConfiguration configuration, + @NonNull RenderProps renderProps, + @NonNull HtmlTag tag) { + final SpanFactory spanFactory = configuration.spansFactory().get(Emphasis.class); + if (spanFactory == null) { + return null; + } + return spanFactory.getSpans(configuration, renderProps); } } 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 79848625..c3473483 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 @@ -3,7 +3,12 @@ package ru.noties.markwon.html.tag; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import org.commonmark.node.Heading; + import ru.noties.markwon.MarkwonConfiguration; +import ru.noties.markwon.RenderProps; +import ru.noties.markwon.SpanFactory; +import ru.noties.markwon.core.CoreProps; import ru.noties.markwon.html.HtmlTag; public class HeadingHandler extends SimpleTagHandler { @@ -16,7 +21,18 @@ public class HeadingHandler extends SimpleTagHandler { @Nullable @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull HtmlTag tag) { - return configuration.factory().heading(configuration.theme(), level); + public Object getSpans( + @NonNull MarkwonConfiguration configuration, + @NonNull RenderProps renderProps, + @NonNull HtmlTag tag) { + + final SpanFactory factory = configuration.spansFactory().get(Heading.class); + if (factory == null) { + return null; + } + + CoreProps.HEADING_LEVEL.set(renderProps, level); + + return factory.getSpans(configuration, renderProps); } } 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 8554a645..4e7ffa54 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 @@ -4,11 +4,16 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; +import org.commonmark.node.Image; + import java.util.Map; import ru.noties.markwon.MarkwonConfiguration; -import ru.noties.markwon.html.HtmlTag; +import ru.noties.markwon.RenderProps; +import ru.noties.markwon.SpanFactory; import ru.noties.markwon.html.CssInlineStyleParser; +import ru.noties.markwon.html.HtmlTag; +import ru.noties.markwon.image.ImageProps; import ru.noties.markwon.image.ImageSize; public class ImageHandler extends SimpleTagHandler { @@ -31,7 +36,10 @@ public class ImageHandler extends SimpleTagHandler { @Nullable @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull HtmlTag tag) { + public Object getSpans( + @NonNull MarkwonConfiguration configuration, + @NonNull RenderProps renderProps, + @NonNull HtmlTag tag) { final Map attributes = tag.attributes(); final String src = attributes.get("src"); @@ -39,7 +47,13 @@ public class ImageHandler extends SimpleTagHandler { return null; } + final SpanFactory spanFactory = configuration.spansFactory().get(Image.class); + if (spanFactory == null) { + return null; + } + final String destination = configuration.urlProcessor().process(src); + final ImageSize imageSize = imageSizeParser.parse(tag.attributes()); // todo: replacement text is link... as we are not at block level // and cannot inspect the parent of this node... (img and a are both inlines) @@ -47,15 +61,10 @@ public class ImageHandler extends SimpleTagHandler { // but we can look and see if we are inside a LinkSpan (will have to extend TagHandler // to obtain an instance SpannableBuilder for inspection) - return null; + ImageProps.DESTINATION.set(renderProps, destination); + ImageProps.IMAGE_SIZE.set(renderProps, imageSize); + ImageProps.REPLACEMENT_TEXT_IS_LINK.set(renderProps, false); -// return configuration.factory().image( -// configuration.theme(), -// destination, -// configuration.asyncDrawableLoader(), -// configuration.imageSizeResolver(), -// imageSizeParser.parse(tag.attributes()), -// false -// ); + return spanFactory.getSpans(configuration, renderProps); } } 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 8bf78ff0..04e768e9 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 @@ -4,20 +4,29 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; +import org.commonmark.node.Link; + import ru.noties.markwon.MarkwonConfiguration; +import ru.noties.markwon.RenderProps; +import ru.noties.markwon.SpanFactory; +import ru.noties.markwon.core.CoreProps; import ru.noties.markwon.html.HtmlTag; public class LinkHandler extends SimpleTagHandler { @Nullable @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull HtmlTag tag) { + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps renderProps, @NonNull HtmlTag tag) { final String destination = tag.attributes().get("href"); if (!TextUtils.isEmpty(destination)) { - return configuration.factory().link( - configuration.theme(), - configuration.urlProcessor().process(destination), - configuration.linkResolver() - ); + final SpanFactory spanFactory = configuration.spansFactory().get(Link.class); + if (spanFactory != null) { + + CoreProps.LINK_DESTINATION.set( + renderProps, + configuration.urlProcessor().process(destination)); + + return spanFactory.getSpans(configuration, renderProps); + } } return null; } 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 3a4dfd7c..66f76cc0 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 @@ -2,8 +2,14 @@ package ru.noties.markwon.html.tag; import android.support.annotation.NonNull; +import org.commonmark.node.ListItem; + import ru.noties.markwon.MarkwonConfiguration; +import ru.noties.markwon.MarkwonVisitor; +import ru.noties.markwon.RenderProps; +import ru.noties.markwon.SpanFactory; import ru.noties.markwon.SpannableBuilder; +import ru.noties.markwon.core.CoreProps; import ru.noties.markwon.html.HtmlTag; import ru.noties.markwon.html.MarkwonHtmlRenderer; import ru.noties.markwon.html.TagHandler; @@ -12,9 +18,8 @@ public class ListHandler extends TagHandler { @Override public void handle( - @NonNull MarkwonConfiguration configuration, + @NonNull MarkwonVisitor visitor, @NonNull MarkwonHtmlRenderer renderer, - @NonNull SpannableBuilder builder, @NonNull HtmlTag tag) { if (!tag.isBlock()) { @@ -29,29 +34,33 @@ public class ListHandler extends TagHandler { return; } + final MarkwonConfiguration configuration = visitor.configuration(); + final RenderProps renderProps = visitor.renderProps(); + final SpanFactory spanFactory = configuration.spansFactory().get(ListItem.class); + int number = 1; final int bulletLevel = currentBulletListLevel(block); - Object spans; - for (HtmlTag.Block child : block.children()) { - visitChildren(configuration, renderer, builder, child); + visitChildren(visitor, renderer, child); + + if (spanFactory != null && "li".equals(child.name())) { - if ("li".equals(child.name())) { // insert list item here if (ol) { - spans = configuration.factory().orderedListItem( - configuration.theme(), - number++ - ); + CoreProps.LIST_ITEM_TYPE.set(renderProps, CoreProps.ListItemType.ORDERED); + CoreProps.ORDERED_LIST_ITEM_NUMBER.set(renderProps, number++); } else { - spans = configuration.factory().bulletListItem( - configuration.theme(), - bulletLevel - ); + CoreProps.LIST_ITEM_TYPE.set(renderProps, CoreProps.ListItemType.BULLET); + CoreProps.BULLET_LIST_ITEM_LEVEL.set(renderProps, bulletLevel); } - SpannableBuilder.setSpans(builder, spans, child.start(), child.end()); + + SpannableBuilder.setSpans( + visitor.builder(), + spanFactory.getSpans(configuration, renderProps), + child.start(), + child.end()); } } } 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 784ef8c9..d5717c20 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 @@ -4,6 +4,8 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import ru.noties.markwon.MarkwonConfiguration; +import ru.noties.markwon.MarkwonVisitor; +import ru.noties.markwon.RenderProps; import ru.noties.markwon.SpannableBuilder; import ru.noties.markwon.html.HtmlTag; import ru.noties.markwon.html.MarkwonHtmlRenderer; @@ -12,13 +14,16 @@ import ru.noties.markwon.html.TagHandler; public abstract class SimpleTagHandler extends TagHandler { @Nullable - public abstract Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull HtmlTag tag); + public abstract Object getSpans( + @NonNull MarkwonConfiguration configuration, + @NonNull RenderProps renderProps, + @NonNull HtmlTag tag); @Override - public void handle(@NonNull MarkwonConfiguration configuration, @NonNull MarkwonHtmlRenderer renderer, @NonNull SpannableBuilder builder, @NonNull HtmlTag tag) { - final Object spans = getSpans(configuration, tag); + public void handle(@NonNull MarkwonVisitor visitor, @NonNull MarkwonHtmlRenderer renderer, @NonNull HtmlTag tag) { + final Object spans = getSpans(visitor.configuration(), visitor.renderProps(), tag); if (spans != null) { - SpannableBuilder.setSpans(builder, spans, tag.start(), tag.end()); + SpannableBuilder.setSpans(visitor.builder(), spans, tag.start(), tag.end()); } } } 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 6df59f28..2771501e 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 @@ -1,9 +1,12 @@ package ru.noties.markwon.html.tag; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.text.style.StrikethroughSpan; import ru.noties.markwon.MarkwonConfiguration; +import ru.noties.markwon.MarkwonVisitor; +import ru.noties.markwon.SpanFactory; import ru.noties.markwon.SpannableBuilder; import ru.noties.markwon.html.HtmlTag; import ru.noties.markwon.html.MarkwonHtmlRenderer; @@ -11,22 +14,47 @@ import ru.noties.markwon.html.TagHandler; public class StrikeHandler extends TagHandler { + // flag to detect if commonmark-java-strikethrough is in classpath, so we use SpanFactory + // to obtain strikethrough span + private static final boolean HAS_MARKDOWN_IMPLEMENTATION; + + static { + boolean hasMarkdownImplementation; + try { + org.commonmark.ext.gfm.strikethrough.Strikethrough.class.getName(); + hasMarkdownImplementation = true; + } catch (Throwable t) { + hasMarkdownImplementation = false; + } + HAS_MARKDOWN_IMPLEMENTATION = hasMarkdownImplementation; + } + @Override public void handle( - @NonNull MarkwonConfiguration configuration, + @NonNull MarkwonVisitor visitor, @NonNull MarkwonHtmlRenderer renderer, - @NonNull SpannableBuilder builder, @NonNull HtmlTag tag) { if (tag.isBlock()) { - visitChildren(configuration, renderer, builder, tag.getAsBlock()); + visitChildren(visitor, renderer, tag.getAsBlock()); } SpannableBuilder.setSpans( - builder, - new StrikethroughSpan(), + visitor.builder(), + HAS_MARKDOWN_IMPLEMENTATION ? getMarkdownSpans(visitor) : new StrikethroughSpan(), tag.start(), tag.end() ); } + + @Nullable + private static Object getMarkdownSpans(@NonNull MarkwonVisitor visitor) { + final MarkwonConfiguration configuration = visitor.configuration(); + final SpanFactory spanFactory = configuration.spansFactory() + .get(org.commonmark.ext.gfm.strikethrough.Strikethrough.class); + if (spanFactory == null) { + return null; + } + return spanFactory.getSpans(configuration, visitor.renderProps()); + } } 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 31f5aff8..8e604b7f 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 @@ -3,13 +3,24 @@ package ru.noties.markwon.html.tag; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import org.commonmark.node.StrongEmphasis; + import ru.noties.markwon.MarkwonConfiguration; +import ru.noties.markwon.RenderProps; +import ru.noties.markwon.SpanFactory; import ru.noties.markwon.html.HtmlTag; public class StrongEmphasisHandler extends SimpleTagHandler { @Nullable @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull HtmlTag tag) { - return configuration.factory().strongEmphasis(); + public Object getSpans( + @NonNull MarkwonConfiguration configuration, + @NonNull RenderProps renderProps, + @NonNull HtmlTag tag) { + final SpanFactory spanFactory = configuration.spansFactory().get(StrongEmphasis.class); + if (spanFactory == null) { + return null; + } + return spanFactory.getSpans(configuration, renderProps); } } 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 2dee9f7a..5ddc5697 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 @@ -4,13 +4,14 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import ru.noties.markwon.MarkwonConfiguration; +import ru.noties.markwon.RenderProps; import ru.noties.markwon.html.HtmlTag; import ru.noties.markwon.html.span.SubScriptSpan; public class SubScriptHandler extends SimpleTagHandler { @Nullable @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull HtmlTag tag) { + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps renderProps, @NonNull HtmlTag tag) { return new SubScriptSpan(); } } 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 ccc5c17a..77147c99 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 @@ -4,13 +4,14 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import ru.noties.markwon.MarkwonConfiguration; +import ru.noties.markwon.RenderProps; import ru.noties.markwon.html.HtmlTag; import ru.noties.markwon.html.span.SuperScriptSpan; public class SuperScriptHandler extends SimpleTagHandler { @Nullable @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull HtmlTag tag) { + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps renderProps, @NonNull HtmlTag tag) { return new SuperScriptSpan(); } } 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 882cae1c..eaa397a6 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,7 +3,7 @@ package ru.noties.markwon.html.tag; import android.support.annotation.NonNull; import android.text.style.UnderlineSpan; -import ru.noties.markwon.MarkwonConfiguration; +import ru.noties.markwon.MarkwonVisitor; import ru.noties.markwon.SpannableBuilder; import ru.noties.markwon.html.HtmlTag; import ru.noties.markwon.html.MarkwonHtmlRenderer; @@ -13,20 +13,19 @@ public class UnderlineHandler extends TagHandler { @Override public void handle( - @NonNull MarkwonConfiguration configuration, + @NonNull MarkwonVisitor visitor, @NonNull MarkwonHtmlRenderer renderer, - @NonNull SpannableBuilder builder, @NonNull HtmlTag tag) { // as parser doesn't treat U tag as an inline one, // thus doesn't allow children, we must visit them first if (tag.isBlock()) { - visitChildren(configuration, renderer, builder, tag.getAsBlock()); + visitChildren(visitor, renderer, tag.getAsBlock()); } SpannableBuilder.setSpans( - builder, + visitor.builder(), new UnderlineSpan(), tag.start(), tag.end()