From 4f02a793e7beb2eb8f5373bc3e855d2c8d60bd98 Mon Sep 17 00:00:00 2001 From: Dimitry Ivanov Date: Sat, 22 Dec 2018 17:16:46 +0300 Subject: [PATCH] Fix markwon main artifact tests --- .../ru/noties/markwon/gif/GifAwarePlugin.java | 8 +- .../strikethrough/StrikethroughPlugin.java | 2 +- .../ext/tasklist/TaskListSpanFactory.java | 6 +- .../java/ru/noties/markwon/SpanFactory.java | 2 +- .../ru/noties/markwon/core/CorePlugin.java | 19 ++- .../markwon/core/MarkwonSpannableFactory.java | 51 -------- .../core/MarkwonSpannableFactoryDef.java | 90 ------------- .../core/factory/BlockQuoteSpanFactory.java | 2 +- .../core/factory/CodeBlockSpanFactory.java | 2 +- .../markwon/core/factory/CodeSpanFactory.java | 2 +- .../core/factory/EmphasisSpanFactory.java | 2 +- .../core/factory/HeadingSpanFactory.java | 4 +- .../markwon/core/factory/LinkSpanFactory.java | 4 +- .../core/factory/ListItemSpanFactory.java | 8 +- .../factory/StrongEmphasisSpanFactory.java | 2 +- .../factory/ThematicBreakSpanFactory.java | 2 +- .../markwon/image/ImageSpanFactory.java | 8 +- .../markwon/AbstractMarkwonVisitorImpl.java | 3 +- .../noties/markwon/core/CorePluginBridge.java | 22 ++++ .../java/ru/noties/markwon/core/CoreTest.java | 34 +++-- .../markwon/core/suite/BaseSuiteTest.java | 122 +++++++++++++++++- .../markwon/core/suite/BlockquoteTest.java | 1 - .../markwon/core/suite/BoldItalicTest.java | 2 - .../noties/markwon/core/suite/CodeTest.java | 1 - .../markwon/core/suite/DeeplyNestedTest.java | 3 - .../markwon/core/suite/EmphasisTest.java | 1 - .../noties/markwon/core/suite/FirstTest.java | 3 - .../markwon/core/suite/HeadingTest.java | 1 - .../noties/markwon/core/suite/LinkTest.java | 1 - .../markwon/core/suite/OrderedListTest.java | 1 - .../markwon/core/suite/ParagraphTest.java | 1 - .../noties/markwon/core/suite/SecondTest.java | 5 - .../core/suite/StrongEmphasisTest.java | 1 - .../markwon/core/suite/TestFactory.java | 93 ------------- .../markwon/core/suite/ThematicBreakTest.java | 1 - .../markwon/core/suite/UnOrderedListTest.java | 1 - .../visitor/BlockQuoteNodeVisitorTest.java | 18 --- .../ru/noties/markwon/image/ImageTest.java | 19 ++- .../markwon/syntax/SyntaxHighlightTest.java | 37 +++--- .../markwon/sample/extension/IconPlugin.java | 1 - .../sample/extension/MainActivity.java | 2 + 41 files changed, 246 insertions(+), 342 deletions(-) delete mode 100644 markwon/src/main/java/ru/noties/markwon/core/MarkwonSpannableFactory.java delete mode 100644 markwon/src/main/java/ru/noties/markwon/core/MarkwonSpannableFactoryDef.java create mode 100644 markwon/src/test/java/ru/noties/markwon/core/CorePluginBridge.java delete mode 100644 markwon/src/test/java/ru/noties/markwon/core/suite/TestFactory.java delete mode 100644 markwon/src/test/java/ru/noties/markwon/core/visitor/BlockQuoteNodeVisitorTest.java diff --git a/app/src/main/java/ru/noties/markwon/gif/GifAwarePlugin.java b/app/src/main/java/ru/noties/markwon/gif/GifAwarePlugin.java index ab69ceb7..95509525 100644 --- a/app/src/main/java/ru/noties/markwon/gif/GifAwarePlugin.java +++ b/app/src/main/java/ru/noties/markwon/gif/GifAwarePlugin.java @@ -40,18 +40,18 @@ public class GifAwarePlugin extends AbstractMarkwonPlugin { builder.setFactory(Image.class, new SpanFactory() { @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) { + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { return new AsyncDrawableSpan( configuration.theme(), new GifAwareAsyncDrawable( gifPlaceholder, - ImageProps.DESTINATION.require(context), + ImageProps.DESTINATION.require(props), configuration.asyncDrawableLoader(), configuration.imageSizeResolver(), - ImageProps.IMAGE_SIZE.get(context) + ImageProps.IMAGE_SIZE.get(props) ), AsyncDrawableSpan.ALIGN_BOTTOM, - ImageProps.REPLACEMENT_TEXT_IS_LINK.get(context, false) + ImageProps.REPLACEMENT_TEXT_IS_LINK.get(props, false) ); } }); 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 eb832e7e..96b76672 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 @@ -32,7 +32,7 @@ public class StrikethroughPlugin extends AbstractMarkwonPlugin { public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) { builder.setFactory(Strikethrough.class, new SpanFactory() { @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) { + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { return new StrikethroughSpan(); } }); diff --git a/markwon-ext-tasklist/src/main/java/ru/noties/markwon/ext/tasklist/TaskListSpanFactory.java b/markwon-ext-tasklist/src/main/java/ru/noties/markwon/ext/tasklist/TaskListSpanFactory.java index b0f4fb20..bd68ede3 100644 --- a/markwon-ext-tasklist/src/main/java/ru/noties/markwon/ext/tasklist/TaskListSpanFactory.java +++ b/markwon-ext-tasklist/src/main/java/ru/noties/markwon/ext/tasklist/TaskListSpanFactory.java @@ -18,12 +18,12 @@ public class TaskListSpanFactory implements SpanFactory { @Nullable @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) { + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { return new TaskListSpan( configuration.theme(), drawable, - TaskListProps.BLOCK_INDENT.get(context, 0), - TaskListProps.DONE.get(context, false) + TaskListProps.BLOCK_INDENT.get(props, 0), + TaskListProps.DONE.get(props, false) ); } } diff --git a/markwon/src/main/java/ru/noties/markwon/SpanFactory.java b/markwon/src/main/java/ru/noties/markwon/SpanFactory.java index 62780776..76e251e7 100644 --- a/markwon/src/main/java/ru/noties/markwon/SpanFactory.java +++ b/markwon/src/main/java/ru/noties/markwon/SpanFactory.java @@ -11,5 +11,5 @@ public interface SpanFactory { @Nullable Object getSpans( @NonNull MarkwonConfiguration configuration, - @NonNull RenderProps context); + @NonNull RenderProps props); } diff --git a/markwon/src/main/java/ru/noties/markwon/core/CorePlugin.java b/markwon/src/main/java/ru/noties/markwon/core/CorePlugin.java index 4d1ff29b..47024866 100644 --- a/markwon/src/main/java/ru/noties/markwon/core/CorePlugin.java +++ b/markwon/src/main/java/ru/noties/markwon/core/CorePlugin.java @@ -2,6 +2,7 @@ package ru.noties.markwon.core; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.annotation.VisibleForTesting; import android.widget.TextView; import org.commonmark.node.BlockQuote; @@ -142,9 +143,18 @@ public class CorePlugin extends AbstractMarkwonPlugin { builder.on(BlockQuote.class, new MarkwonVisitor.NodeVisitor
() { @Override public void visit(@NonNull MarkwonVisitor visitor, @NonNull BlockQuote blockQuote) { + + visitor.ensureNewLine(); + final int length = visitor.length(); + visitor.visitChildren(blockQuote); visitor.setSpansForNode(blockQuote, length); + + if (visitor.hasNext(blockQuote)) { + visitor.ensureNewLine(); + visitor.forceNewLine(); + } } }); } @@ -186,7 +196,8 @@ public class CorePlugin extends AbstractMarkwonPlugin { }); } - private static void visitCodeBlock( + @VisibleForTesting + static void visitCodeBlock( @NonNull MarkwonVisitor visitor, @Nullable String info, @NonNull String code, @@ -227,6 +238,11 @@ public class CorePlugin extends AbstractMarkwonPlugin { final int length = visitor.length(); + // it's important to visit children before applying render props ( + // we can have nested children, who are list items also, thus they will + // override out props (if we set them before visiting children) + visitor.visitChildren(listItem); + final Node parent = listItem.getParent(); if (parent instanceof OrderedList) { @@ -244,7 +260,6 @@ public class CorePlugin extends AbstractMarkwonPlugin { CoreProps.BULLET_LIST_ITEM_LEVEL.set(visitor.renderProps(), listLevel(listItem)); } - visitor.visitChildren(listItem); visitor.setSpansForNode(listItem, length); if (visitor.hasNext(listItem)) { diff --git a/markwon/src/main/java/ru/noties/markwon/core/MarkwonSpannableFactory.java b/markwon/src/main/java/ru/noties/markwon/core/MarkwonSpannableFactory.java deleted file mode 100644 index 1e440591..00000000 --- a/markwon/src/main/java/ru/noties/markwon/core/MarkwonSpannableFactory.java +++ /dev/null @@ -1,51 +0,0 @@ -package ru.noties.markwon.core; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import ru.noties.markwon.core.spans.LinkSpan; - -/** - * Each method can return null or a Span object or an array of spans - * - * @since 1.1.0 - */ -@Deprecated -public interface MarkwonSpannableFactory { - - @Nullable - Object strongEmphasis(); - - @Nullable - Object emphasis(); - - @Nullable - Object blockQuote(@NonNull MarkwonTheme theme); - - @Nullable - Object code(@NonNull MarkwonTheme theme, boolean multiline); - - @Nullable - Object orderedListItem(@NonNull MarkwonTheme theme, int startNumber); - - @Nullable - Object bulletListItem(@NonNull MarkwonTheme theme, int level); - - @Nullable - Object thematicBreak(@NonNull MarkwonTheme theme); - - @Nullable - Object heading(@NonNull MarkwonTheme theme, int level); - - /** - * @since 1.1.1 - */ - @Nullable - Object paragraph(boolean inTightList); - - @Nullable - Object link( - @NonNull MarkwonTheme theme, - @NonNull String destination, - @NonNull LinkSpan.Resolver resolver); -} diff --git a/markwon/src/main/java/ru/noties/markwon/core/MarkwonSpannableFactoryDef.java b/markwon/src/main/java/ru/noties/markwon/core/MarkwonSpannableFactoryDef.java deleted file mode 100644 index 5765c7b4..00000000 --- a/markwon/src/main/java/ru/noties/markwon/core/MarkwonSpannableFactoryDef.java +++ /dev/null @@ -1,90 +0,0 @@ -package ru.noties.markwon.core; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import ru.noties.markwon.core.spans.BlockQuoteSpan; -import ru.noties.markwon.core.spans.BulletListItemSpan; -import ru.noties.markwon.core.spans.CodeSpan; -import ru.noties.markwon.core.spans.EmphasisSpan; -import ru.noties.markwon.core.spans.HeadingSpan; -import ru.noties.markwon.core.spans.LinkSpan; -import ru.noties.markwon.core.spans.OrderedListItemSpan; -import ru.noties.markwon.core.spans.StrongEmphasisSpan; -import ru.noties.markwon.core.spans.ThematicBreakSpan; - -/** - * @since 1.1.0 - */ -@Deprecated -public class MarkwonSpannableFactoryDef implements MarkwonSpannableFactory { - - @NonNull - public static MarkwonSpannableFactoryDef create() { - return new MarkwonSpannableFactoryDef(); - } - - @Nullable - @Override - public Object strongEmphasis() { - return new StrongEmphasisSpan(); - } - - @Nullable - @Override - public Object emphasis() { - return new EmphasisSpan(); - } - - @Nullable - @Override - public Object blockQuote(@NonNull MarkwonTheme theme) { - return new BlockQuoteSpan(theme); - } - - @Nullable - @Override - public Object code(@NonNull MarkwonTheme theme, boolean multiline) { - return new CodeSpan(theme, multiline); - } - - @Nullable - @Override - public Object orderedListItem(@NonNull MarkwonTheme theme, int startNumber) { - // todo| in order to provide real RTL experience there must be a way to provide this string - return new OrderedListItemSpan(theme, String.valueOf(startNumber) + "." + '\u00a0'); - } - - @Nullable - @Override - public Object bulletListItem(@NonNull MarkwonTheme theme, int level) { - return new BulletListItemSpan(theme, level); - } - - @Nullable - @Override - public Object thematicBreak(@NonNull MarkwonTheme theme) { - return new ThematicBreakSpan(theme); - } - - @Nullable - @Override - public Object heading(@NonNull MarkwonTheme theme, int level) { - return new HeadingSpan(theme, level); - } - - /** - * @since 1.1.1 - */ - @Nullable - @Override - public Object paragraph(boolean inTightList) { - return null; - } - - @Nullable - @Override - public Object link(@NonNull MarkwonTheme theme, @NonNull String destination, @NonNull LinkSpan.Resolver resolver) { - return new LinkSpan(theme, destination, resolver); - } -} diff --git a/markwon/src/main/java/ru/noties/markwon/core/factory/BlockQuoteSpanFactory.java b/markwon/src/main/java/ru/noties/markwon/core/factory/BlockQuoteSpanFactory.java index 437c0028..cbe86db6 100644 --- a/markwon/src/main/java/ru/noties/markwon/core/factory/BlockQuoteSpanFactory.java +++ b/markwon/src/main/java/ru/noties/markwon/core/factory/BlockQuoteSpanFactory.java @@ -11,7 +11,7 @@ import ru.noties.markwon.core.spans.BlockQuoteSpan; public class BlockQuoteSpanFactory implements SpanFactory { @Nullable @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) { + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { return new BlockQuoteSpan(configuration.theme()); } } diff --git a/markwon/src/main/java/ru/noties/markwon/core/factory/CodeBlockSpanFactory.java b/markwon/src/main/java/ru/noties/markwon/core/factory/CodeBlockSpanFactory.java index 472bf620..4fd07685 100644 --- a/markwon/src/main/java/ru/noties/markwon/core/factory/CodeBlockSpanFactory.java +++ b/markwon/src/main/java/ru/noties/markwon/core/factory/CodeBlockSpanFactory.java @@ -11,7 +11,7 @@ import ru.noties.markwon.core.spans.CodeSpan; public class CodeBlockSpanFactory implements SpanFactory { @Nullable @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) { + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { return new CodeSpan(configuration.theme(), true); } } diff --git a/markwon/src/main/java/ru/noties/markwon/core/factory/CodeSpanFactory.java b/markwon/src/main/java/ru/noties/markwon/core/factory/CodeSpanFactory.java index 6850ff44..7726bc02 100644 --- a/markwon/src/main/java/ru/noties/markwon/core/factory/CodeSpanFactory.java +++ b/markwon/src/main/java/ru/noties/markwon/core/factory/CodeSpanFactory.java @@ -11,7 +11,7 @@ import ru.noties.markwon.core.spans.CodeSpan; public class CodeSpanFactory implements SpanFactory { @Nullable @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) { + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { return new CodeSpan(configuration.theme(), false); } } diff --git a/markwon/src/main/java/ru/noties/markwon/core/factory/EmphasisSpanFactory.java b/markwon/src/main/java/ru/noties/markwon/core/factory/EmphasisSpanFactory.java index eb49a906..d9d8331d 100644 --- a/markwon/src/main/java/ru/noties/markwon/core/factory/EmphasisSpanFactory.java +++ b/markwon/src/main/java/ru/noties/markwon/core/factory/EmphasisSpanFactory.java @@ -11,7 +11,7 @@ import ru.noties.markwon.core.spans.EmphasisSpan; public class EmphasisSpanFactory implements SpanFactory { @Nullable @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) { + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { return new EmphasisSpan(); } } diff --git a/markwon/src/main/java/ru/noties/markwon/core/factory/HeadingSpanFactory.java b/markwon/src/main/java/ru/noties/markwon/core/factory/HeadingSpanFactory.java index e0b1b517..bd675edd 100644 --- a/markwon/src/main/java/ru/noties/markwon/core/factory/HeadingSpanFactory.java +++ b/markwon/src/main/java/ru/noties/markwon/core/factory/HeadingSpanFactory.java @@ -12,10 +12,10 @@ import ru.noties.markwon.core.spans.HeadingSpan; public class HeadingSpanFactory implements SpanFactory { @Nullable @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) { + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { return new HeadingSpan( configuration.theme(), - CoreProps.HEADING_LEVEL.require(context) + CoreProps.HEADING_LEVEL.require(props) ); } } diff --git a/markwon/src/main/java/ru/noties/markwon/core/factory/LinkSpanFactory.java b/markwon/src/main/java/ru/noties/markwon/core/factory/LinkSpanFactory.java index e0a39dd2..ee97ba34 100644 --- a/markwon/src/main/java/ru/noties/markwon/core/factory/LinkSpanFactory.java +++ b/markwon/src/main/java/ru/noties/markwon/core/factory/LinkSpanFactory.java @@ -12,10 +12,10 @@ import ru.noties.markwon.core.spans.LinkSpan; public class LinkSpanFactory implements SpanFactory { @Nullable @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) { + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { return new LinkSpan( configuration.theme(), - CoreProps.LINK_DESTINATION.require(context), + CoreProps.LINK_DESTINATION.require(props), configuration.linkResolver() ); } diff --git a/markwon/src/main/java/ru/noties/markwon/core/factory/ListItemSpanFactory.java b/markwon/src/main/java/ru/noties/markwon/core/factory/ListItemSpanFactory.java index 87bd4e4e..06d73d2e 100644 --- a/markwon/src/main/java/ru/noties/markwon/core/factory/ListItemSpanFactory.java +++ b/markwon/src/main/java/ru/noties/markwon/core/factory/ListItemSpanFactory.java @@ -14,22 +14,22 @@ public class ListItemSpanFactory implements SpanFactory { @Nullable @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) { + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { // type of list item // bullet : level // ordered: number final Object spans; - if (CoreProps.ListItemType.BULLET == CoreProps.LIST_ITEM_TYPE.require(context)) { + if (CoreProps.ListItemType.BULLET == CoreProps.LIST_ITEM_TYPE.require(props)) { spans = new BulletListItemSpan( configuration.theme(), - CoreProps.BULLET_LIST_ITEM_LEVEL.require(context) + CoreProps.BULLET_LIST_ITEM_LEVEL.require(props) ); } else { // todo| in order to provide real RTL experience there must be a way to provide this string - final String number = String.valueOf(CoreProps.ORDERED_LIST_ITEM_NUMBER.require(context)) + final String number = String.valueOf(CoreProps.ORDERED_LIST_ITEM_NUMBER.require(props)) + "." + '\u00a0'; spans = new OrderedListItemSpan( diff --git a/markwon/src/main/java/ru/noties/markwon/core/factory/StrongEmphasisSpanFactory.java b/markwon/src/main/java/ru/noties/markwon/core/factory/StrongEmphasisSpanFactory.java index e1905e05..c81d6121 100644 --- a/markwon/src/main/java/ru/noties/markwon/core/factory/StrongEmphasisSpanFactory.java +++ b/markwon/src/main/java/ru/noties/markwon/core/factory/StrongEmphasisSpanFactory.java @@ -11,7 +11,7 @@ import ru.noties.markwon.core.spans.StrongEmphasisSpan; public class StrongEmphasisSpanFactory implements SpanFactory { @Nullable @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) { + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { return new StrongEmphasisSpan(); } } diff --git a/markwon/src/main/java/ru/noties/markwon/core/factory/ThematicBreakSpanFactory.java b/markwon/src/main/java/ru/noties/markwon/core/factory/ThematicBreakSpanFactory.java index 82c1dea8..ecd20f32 100644 --- a/markwon/src/main/java/ru/noties/markwon/core/factory/ThematicBreakSpanFactory.java +++ b/markwon/src/main/java/ru/noties/markwon/core/factory/ThematicBreakSpanFactory.java @@ -11,7 +11,7 @@ import ru.noties.markwon.core.spans.ThematicBreakSpan; public class ThematicBreakSpanFactory implements SpanFactory { @Nullable @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) { + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { return new ThematicBreakSpan(configuration.theme()); } } diff --git a/markwon/src/main/java/ru/noties/markwon/image/ImageSpanFactory.java b/markwon/src/main/java/ru/noties/markwon/image/ImageSpanFactory.java index ba73d047..5af5b0ec 100644 --- a/markwon/src/main/java/ru/noties/markwon/image/ImageSpanFactory.java +++ b/markwon/src/main/java/ru/noties/markwon/image/ImageSpanFactory.java @@ -10,17 +10,17 @@ import ru.noties.markwon.SpanFactory; public class ImageSpanFactory implements SpanFactory { @Nullable @Override - public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) { + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { return new AsyncDrawableSpan( configuration.theme(), new AsyncDrawable( - ImageProps.DESTINATION.require(context), + ImageProps.DESTINATION.require(props), configuration.asyncDrawableLoader(), configuration.imageSizeResolver(), - ImageProps.IMAGE_SIZE.get(context) + ImageProps.IMAGE_SIZE.get(props) ), AsyncDrawableSpan.ALIGN_BOTTOM, - ImageProps.REPLACEMENT_TEXT_IS_LINK.get(context, false) + ImageProps.REPLACEMENT_TEXT_IS_LINK.get(props, false) ); } } diff --git a/markwon/src/test/java/ru/noties/markwon/AbstractMarkwonVisitorImpl.java b/markwon/src/test/java/ru/noties/markwon/AbstractMarkwonVisitorImpl.java index 99d183ce..f3ad18b3 100644 --- a/markwon/src/test/java/ru/noties/markwon/AbstractMarkwonVisitorImpl.java +++ b/markwon/src/test/java/ru/noties/markwon/AbstractMarkwonVisitorImpl.java @@ -10,7 +10,8 @@ public class AbstractMarkwonVisitorImpl extends MarkwonVisitorImpl { public AbstractMarkwonVisitorImpl( @NonNull MarkwonConfiguration configuration, + @NonNull RenderProps renderProps, @NonNull Map, NodeVisitor> nodes) { - super(configuration, nodes); + super(configuration, renderProps, nodes); } } diff --git a/markwon/src/test/java/ru/noties/markwon/core/CorePluginBridge.java b/markwon/src/test/java/ru/noties/markwon/core/CorePluginBridge.java new file mode 100644 index 00000000..6517873b --- /dev/null +++ b/markwon/src/test/java/ru/noties/markwon/core/CorePluginBridge.java @@ -0,0 +1,22 @@ +package ru.noties.markwon.core; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import org.commonmark.node.Node; + +import ru.noties.markwon.MarkwonVisitor; + +public abstract class CorePluginBridge { + + public static void visitCodeBlock( + @NonNull MarkwonVisitor visitor, + @Nullable String info, + @NonNull String code, + @NonNull Node node) { + CorePlugin.visitCodeBlock(visitor, info, code, node); + } + + private CorePluginBridge() { + } +} diff --git a/markwon/src/test/java/ru/noties/markwon/core/CoreTest.java b/markwon/src/test/java/ru/noties/markwon/core/CoreTest.java index 17ee51db..de7c0dd0 100644 --- a/markwon/src/test/java/ru/noties/markwon/core/CoreTest.java +++ b/markwon/src/test/java/ru/noties/markwon/core/CoreTest.java @@ -3,6 +3,8 @@ package ru.noties.markwon.core; import android.support.annotation.NonNull; import android.text.Spanned; +import org.commonmark.node.Emphasis; +import org.commonmark.node.StrongEmphasis; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @@ -12,6 +14,9 @@ import org.robolectric.annotation.Config; import ru.noties.markwon.AbstractMarkwonPlugin; import ru.noties.markwon.Markwon; import ru.noties.markwon.MarkwonConfiguration; +import ru.noties.markwon.MarkwonSpansFactory; +import ru.noties.markwon.RenderProps; +import ru.noties.markwon.SpanFactory; import ru.noties.markwon.test.TestSpan; import ru.noties.markwon.test.TestSpanMatcher; @@ -31,23 +36,24 @@ public class CoreTest { span("bold", span("italic", text("bold italic")))); - final Spanned spanned = (Spanned) Markwon.builder(RuntimeEnvironment.application) + final Spanned spanned = Markwon.builder(RuntimeEnvironment.application) .usePlugin(CorePlugin.create()) .usePlugin(new AbstractMarkwonPlugin() { @Override - public void configureConfiguration(@NonNull MarkwonConfiguration.Builder builder) { - builder.factory(new MarkwonSpannableFactoryDef() { - - @Override - public Object strongEmphasis() { - return span("bold"); - } - - @Override - public Object emphasis() { - return span("italic"); - } - }); + public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) { + builder + .setFactory(StrongEmphasis.class, new SpanFactory() { + @Override + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { + return span("bold"); + } + }) + .setFactory(Emphasis.class, new SpanFactory() { + @Override + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { + return span("italic"); + } + }); } }) .build() diff --git a/markwon/src/test/java/ru/noties/markwon/core/suite/BaseSuiteTest.java b/markwon/src/test/java/ru/noties/markwon/core/suite/BaseSuiteTest.java index 65555352..f91f2f13 100644 --- a/markwon/src/test/java/ru/noties/markwon/core/suite/BaseSuiteTest.java +++ b/markwon/src/test/java/ru/noties/markwon/core/suite/BaseSuiteTest.java @@ -1,20 +1,55 @@ package ru.noties.markwon.core.suite; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.text.Spanned; +import org.commonmark.node.BlockQuote; +import org.commonmark.node.Code; +import org.commonmark.node.Emphasis; +import org.commonmark.node.FencedCodeBlock; +import org.commonmark.node.Heading; +import org.commonmark.node.IndentedCodeBlock; +import org.commonmark.node.Link; +import org.commonmark.node.ListItem; +import org.commonmark.node.Node; +import org.commonmark.node.Paragraph; +import org.commonmark.node.StrongEmphasis; +import org.commonmark.node.ThematicBreak; import org.robolectric.RuntimeEnvironment; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + import ru.noties.markwon.AbstractMarkwonPlugin; import ru.noties.markwon.Markwon; import ru.noties.markwon.MarkwonConfiguration; +import ru.noties.markwon.MarkwonSpansFactory; +import ru.noties.markwon.RenderProps; +import ru.noties.markwon.SpanFactory; import ru.noties.markwon.core.CorePlugin; +import ru.noties.markwon.core.CoreProps; import ru.noties.markwon.test.TestSpan; import ru.noties.markwon.test.TestSpanMatcher; import ru.noties.markwon.test.TestUtil; +import static ru.noties.markwon.test.TestSpan.args; +import static ru.noties.markwon.test.TestSpan.span; + abstract class BaseSuiteTest { + static final String BOLD = "bold"; + static final String ITALIC = "italic"; + static final String CODE = "code"; + static final String LINK = "link"; + static final String BLOCK_QUOTE = "blockquote"; + static final String PARAGRAPH = "paragraph"; + static final String ORDERED_LIST = "ordered-list"; + static final String UN_ORDERED_LIST = "un-ordered-list"; + static final String HEADING = "heading"; + static final String THEMATIC_BREAK = "thematic-break"; + void match(@NonNull String markdown, @NonNull TestSpan.Document document) { final Spanned spanned = markwon().toMarkdown(markdown); TestSpanMatcher.matches(spanned, document); @@ -36,8 +71,20 @@ abstract class BaseSuiteTest { .usePlugin(CorePlugin.create(softBreakAddsNewLine())) .usePlugin(new AbstractMarkwonPlugin() { @Override - public void configureConfiguration(@NonNull MarkwonConfiguration.Builder builder) { - builder.factory(new TestFactory(useParagraphs())); + public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) { + + for (Map.Entry, SpanFactory> entry : CORE_NODES.entrySet()) { + builder.setFactory(entry.getKey(), entry.getValue()); + } + + if (useParagraphs()) { + builder.setFactory(Paragraph.class, new SpanFactory() { + @Override + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { + return span(PARAGRAPH); + } + }); + } } }) .build(); @@ -50,4 +97,75 @@ abstract class BaseSuiteTest { boolean softBreakAddsNewLine() { return false; } + + private static final Map, SpanFactory> CORE_NODES; + + static { + final Map, SpanFactory> factories = new HashMap<>(); + factories.put(BlockQuote.class, new NamedSpanFactory(BLOCK_QUOTE)); + factories.put(Code.class, new SpanFactory() { + @Override + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { + return span(CODE, args("multiline", false)); + } + }); + factories.put(FencedCodeBlock.class, new SpanFactory() { + @Override + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { + return span(CODE, args("multiline", true)); + } + }); + factories.put(IndentedCodeBlock.class, new SpanFactory() { + @Override + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { + return span(CODE, args("multiline", true)); + } + }); + factories.put(Emphasis.class, new NamedSpanFactory(ITALIC)); + factories.put(Heading.class, new SpanFactory() { + @Override + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { + return span(HEADING, args("level", CoreProps.HEADING_LEVEL.require(props))); + } + }); + factories.put(Link.class, new SpanFactory() { + @Override + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { + return span(LINK, args("href", CoreProps.LINK_DESTINATION.require(props))); + } + }); + factories.put(ListItem.class, new SpanFactory() { + @Override + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { + final CoreProps.ListItemType type = CoreProps.LIST_ITEM_TYPE.require(props); + if (CoreProps.ListItemType.BULLET == type) { + return span(UN_ORDERED_LIST, args("level", CoreProps.BULLET_LIST_ITEM_LEVEL.require(props))); + } + return span(ORDERED_LIST, args("start", CoreProps.ORDERED_LIST_ITEM_NUMBER.require(props))); + } + }); + factories.put(StrongEmphasis.class, new NamedSpanFactory(BOLD)); + factories.put(ThematicBreak.class, new NamedSpanFactory(THEMATIC_BREAK)); + CORE_NODES = factories; + } + + private static class NamedSpanFactory implements SpanFactory { + + private final String name; + + private NamedSpanFactory(@NonNull String name) { + this.name = name; + } + + @Nullable + @Override + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { + return span(name, extractArgs(props)); + } + + @NonNull + Map extractArgs(@NonNull RenderProps props) { + return Collections.emptyMap(); + } + } } diff --git a/markwon/src/test/java/ru/noties/markwon/core/suite/BlockquoteTest.java b/markwon/src/test/java/ru/noties/markwon/core/suite/BlockquoteTest.java index 02eb2674..21d2c852 100644 --- a/markwon/src/test/java/ru/noties/markwon/core/suite/BlockquoteTest.java +++ b/markwon/src/test/java/ru/noties/markwon/core/suite/BlockquoteTest.java @@ -7,7 +7,6 @@ import org.robolectric.annotation.Config; import ru.noties.markwon.test.TestSpan.Document; -import static ru.noties.markwon.core.suite.TestFactory.BLOCK_QUOTE; import static ru.noties.markwon.test.TestSpan.document; import static ru.noties.markwon.test.TestSpan.span; import static ru.noties.markwon.test.TestSpan.text; diff --git a/markwon/src/test/java/ru/noties/markwon/core/suite/BoldItalicTest.java b/markwon/src/test/java/ru/noties/markwon/core/suite/BoldItalicTest.java index 67cb1a0d..1315136b 100644 --- a/markwon/src/test/java/ru/noties/markwon/core/suite/BoldItalicTest.java +++ b/markwon/src/test/java/ru/noties/markwon/core/suite/BoldItalicTest.java @@ -7,8 +7,6 @@ import org.robolectric.annotation.Config; import ru.noties.markwon.test.TestSpan; -import static ru.noties.markwon.core.suite.TestFactory.BOLD; -import static ru.noties.markwon.core.suite.TestFactory.ITALIC; import static ru.noties.markwon.test.TestSpan.document; import static ru.noties.markwon.test.TestSpan.span; import static ru.noties.markwon.test.TestSpan.text; diff --git a/markwon/src/test/java/ru/noties/markwon/core/suite/CodeTest.java b/markwon/src/test/java/ru/noties/markwon/core/suite/CodeTest.java index 6e5d0c53..52a8f614 100644 --- a/markwon/src/test/java/ru/noties/markwon/core/suite/CodeTest.java +++ b/markwon/src/test/java/ru/noties/markwon/core/suite/CodeTest.java @@ -7,7 +7,6 @@ import org.robolectric.annotation.Config; import ru.noties.markwon.test.TestSpan.Document; -import static ru.noties.markwon.core.suite.TestFactory.CODE; import static ru.noties.markwon.test.TestSpan.args; import static ru.noties.markwon.test.TestSpan.document; import static ru.noties.markwon.test.TestSpan.span; diff --git a/markwon/src/test/java/ru/noties/markwon/core/suite/DeeplyNestedTest.java b/markwon/src/test/java/ru/noties/markwon/core/suite/DeeplyNestedTest.java index 49606f90..e0dcda38 100644 --- a/markwon/src/test/java/ru/noties/markwon/core/suite/DeeplyNestedTest.java +++ b/markwon/src/test/java/ru/noties/markwon/core/suite/DeeplyNestedTest.java @@ -7,9 +7,6 @@ import org.robolectric.annotation.Config; import ru.noties.markwon.test.TestSpan.Document; -import static ru.noties.markwon.core.suite.TestFactory.BOLD; -import static ru.noties.markwon.core.suite.TestFactory.CODE; -import static ru.noties.markwon.core.suite.TestFactory.ITALIC; import static ru.noties.markwon.test.TestSpan.args; import static ru.noties.markwon.test.TestSpan.document; import static ru.noties.markwon.test.TestSpan.span; diff --git a/markwon/src/test/java/ru/noties/markwon/core/suite/EmphasisTest.java b/markwon/src/test/java/ru/noties/markwon/core/suite/EmphasisTest.java index 0e1b1d1c..057acc18 100644 --- a/markwon/src/test/java/ru/noties/markwon/core/suite/EmphasisTest.java +++ b/markwon/src/test/java/ru/noties/markwon/core/suite/EmphasisTest.java @@ -7,7 +7,6 @@ import org.robolectric.annotation.Config; import ru.noties.markwon.test.TestSpan.Document; -import static ru.noties.markwon.core.suite.TestFactory.ITALIC; import static ru.noties.markwon.test.TestSpan.document; import static ru.noties.markwon.test.TestSpan.span; import static ru.noties.markwon.test.TestSpan.text; diff --git a/markwon/src/test/java/ru/noties/markwon/core/suite/FirstTest.java b/markwon/src/test/java/ru/noties/markwon/core/suite/FirstTest.java index 340b5fe9..f67a5062 100644 --- a/markwon/src/test/java/ru/noties/markwon/core/suite/FirstTest.java +++ b/markwon/src/test/java/ru/noties/markwon/core/suite/FirstTest.java @@ -7,9 +7,6 @@ import org.robolectric.annotation.Config; import ru.noties.markwon.test.TestSpan.Document; -import static ru.noties.markwon.core.suite.TestFactory.BOLD; -import static ru.noties.markwon.core.suite.TestFactory.ITALIC; -import static ru.noties.markwon.core.suite.TestFactory.LINK; import static ru.noties.markwon.test.TestSpan.args; import static ru.noties.markwon.test.TestSpan.document; import static ru.noties.markwon.test.TestSpan.span; diff --git a/markwon/src/test/java/ru/noties/markwon/core/suite/HeadingTest.java b/markwon/src/test/java/ru/noties/markwon/core/suite/HeadingTest.java index efc1a090..10fa5f9b 100644 --- a/markwon/src/test/java/ru/noties/markwon/core/suite/HeadingTest.java +++ b/markwon/src/test/java/ru/noties/markwon/core/suite/HeadingTest.java @@ -7,7 +7,6 @@ import org.robolectric.annotation.Config; import ru.noties.markwon.test.TestSpan.Document; -import static ru.noties.markwon.core.suite.TestFactory.HEADING; import static ru.noties.markwon.test.TestSpan.args; import static ru.noties.markwon.test.TestSpan.document; import static ru.noties.markwon.test.TestSpan.span; diff --git a/markwon/src/test/java/ru/noties/markwon/core/suite/LinkTest.java b/markwon/src/test/java/ru/noties/markwon/core/suite/LinkTest.java index b691db9c..ff70f82c 100644 --- a/markwon/src/test/java/ru/noties/markwon/core/suite/LinkTest.java +++ b/markwon/src/test/java/ru/noties/markwon/core/suite/LinkTest.java @@ -7,7 +7,6 @@ import org.robolectric.annotation.Config; import ru.noties.markwon.test.TestSpan.Document; -import static ru.noties.markwon.core.suite.TestFactory.LINK; import static ru.noties.markwon.test.TestSpan.args; import static ru.noties.markwon.test.TestSpan.document; import static ru.noties.markwon.test.TestSpan.span; diff --git a/markwon/src/test/java/ru/noties/markwon/core/suite/OrderedListTest.java b/markwon/src/test/java/ru/noties/markwon/core/suite/OrderedListTest.java index 31fed7d8..9efb46b8 100644 --- a/markwon/src/test/java/ru/noties/markwon/core/suite/OrderedListTest.java +++ b/markwon/src/test/java/ru/noties/markwon/core/suite/OrderedListTest.java @@ -7,7 +7,6 @@ import org.robolectric.annotation.Config; import ru.noties.markwon.test.TestSpan.Document; -import static ru.noties.markwon.core.suite.TestFactory.ORDERED_LIST; import static ru.noties.markwon.test.TestSpan.args; import static ru.noties.markwon.test.TestSpan.document; import static ru.noties.markwon.test.TestSpan.span; diff --git a/markwon/src/test/java/ru/noties/markwon/core/suite/ParagraphTest.java b/markwon/src/test/java/ru/noties/markwon/core/suite/ParagraphTest.java index 79b678c5..877a8818 100644 --- a/markwon/src/test/java/ru/noties/markwon/core/suite/ParagraphTest.java +++ b/markwon/src/test/java/ru/noties/markwon/core/suite/ParagraphTest.java @@ -7,7 +7,6 @@ import org.robolectric.annotation.Config; import ru.noties.markwon.test.TestSpan.Document; -import static ru.noties.markwon.core.suite.TestFactory.PARAGRAPH; import static ru.noties.markwon.test.TestSpan.document; import static ru.noties.markwon.test.TestSpan.span; import static ru.noties.markwon.test.TestSpan.text; diff --git a/markwon/src/test/java/ru/noties/markwon/core/suite/SecondTest.java b/markwon/src/test/java/ru/noties/markwon/core/suite/SecondTest.java index 65f238ed..340df08d 100644 --- a/markwon/src/test/java/ru/noties/markwon/core/suite/SecondTest.java +++ b/markwon/src/test/java/ru/noties/markwon/core/suite/SecondTest.java @@ -7,11 +7,6 @@ import org.robolectric.annotation.Config; import ru.noties.markwon.test.TestSpan.Document; -import static ru.noties.markwon.core.suite.TestFactory.BLOCK_QUOTE; -import static ru.noties.markwon.core.suite.TestFactory.BOLD; -import static ru.noties.markwon.core.suite.TestFactory.CODE; -import static ru.noties.markwon.core.suite.TestFactory.HEADING; -import static ru.noties.markwon.core.suite.TestFactory.ITALIC; import static ru.noties.markwon.test.TestSpan.args; import static ru.noties.markwon.test.TestSpan.document; import static ru.noties.markwon.test.TestSpan.span; diff --git a/markwon/src/test/java/ru/noties/markwon/core/suite/StrongEmphasisTest.java b/markwon/src/test/java/ru/noties/markwon/core/suite/StrongEmphasisTest.java index 12d9358b..d08377a1 100644 --- a/markwon/src/test/java/ru/noties/markwon/core/suite/StrongEmphasisTest.java +++ b/markwon/src/test/java/ru/noties/markwon/core/suite/StrongEmphasisTest.java @@ -7,7 +7,6 @@ import org.robolectric.annotation.Config; import ru.noties.markwon.test.TestSpan.Document; -import static ru.noties.markwon.core.suite.TestFactory.BOLD; import static ru.noties.markwon.test.TestSpan.document; import static ru.noties.markwon.test.TestSpan.span; import static ru.noties.markwon.test.TestSpan.text; diff --git a/markwon/src/test/java/ru/noties/markwon/core/suite/TestFactory.java b/markwon/src/test/java/ru/noties/markwon/core/suite/TestFactory.java deleted file mode 100644 index 693c5cb5..00000000 --- a/markwon/src/test/java/ru/noties/markwon/core/suite/TestFactory.java +++ /dev/null @@ -1,93 +0,0 @@ -package ru.noties.markwon.core.suite; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import ru.noties.markwon.core.MarkwonSpannableFactory; -import ru.noties.markwon.core.MarkwonTheme; -import ru.noties.markwon.core.spans.LinkSpan; - -import static ru.noties.markwon.test.TestSpan.args; -import static ru.noties.markwon.test.TestSpan.span; - -class TestFactory implements MarkwonSpannableFactory { - - static final String BOLD = "bold"; - static final String ITALIC = "italic"; - static final String CODE = "code"; - static final String LINK = "link"; - static final String BLOCK_QUOTE = "blockquote"; - static final String PARAGRAPH = "paragraph"; - static final String ORDERED_LIST = "ordered-list"; - static final String UN_ORDERED_LIST = "un-ordered-list"; - static final String HEADING = "heading"; - static final String THEMATIC_BREAK = "thematic-break"; - - private final boolean useParagraphs; - - TestFactory(boolean useParagraphs) { - this.useParagraphs = useParagraphs; - } - - @Nullable - @Override - public Object strongEmphasis() { - return span(BOLD); - } - - @Nullable - @Override - public Object emphasis() { - return span(ITALIC); - } - - @Nullable - @Override - public Object blockQuote(@NonNull MarkwonTheme theme) { - return span(BLOCK_QUOTE); - } - - @Nullable - @Override - public Object code(@NonNull MarkwonTheme theme, boolean multiline) { - return span(CODE, args("multiline", multiline)); - } - - @Nullable - @Override - public Object orderedListItem(@NonNull MarkwonTheme theme, int startNumber) { - return span(ORDERED_LIST, args("start", startNumber)); - } - - @Nullable - @Override - public Object bulletListItem(@NonNull MarkwonTheme theme, int level) { - return span(UN_ORDERED_LIST, args("level", level)); - } - - @Nullable - @Override - public Object thematicBreak(@NonNull MarkwonTheme theme) { - return span(THEMATIC_BREAK); - } - - @Nullable - @Override - public Object heading(@NonNull MarkwonTheme theme, int level) { - return span(HEADING, args("level", level)); - } - - @Nullable - @Override - public Object paragraph(boolean inTightList) { - return useParagraphs - ? span(PARAGRAPH) - : null; - } - - @Nullable - @Override - public Object link(@NonNull MarkwonTheme theme, @NonNull String destination, @NonNull LinkSpan.Resolver resolver) { - return span(LINK, args("href", destination)); - } -} diff --git a/markwon/src/test/java/ru/noties/markwon/core/suite/ThematicBreakTest.java b/markwon/src/test/java/ru/noties/markwon/core/suite/ThematicBreakTest.java index a5005a98..1e0159bc 100644 --- a/markwon/src/test/java/ru/noties/markwon/core/suite/ThematicBreakTest.java +++ b/markwon/src/test/java/ru/noties/markwon/core/suite/ThematicBreakTest.java @@ -7,7 +7,6 @@ import org.robolectric.annotation.Config; import ru.noties.markwon.test.TestSpan.Document; -import static ru.noties.markwon.core.suite.TestFactory.THEMATIC_BREAK; import static ru.noties.markwon.test.TestSpan.document; import static ru.noties.markwon.test.TestSpan.span; import static ru.noties.markwon.test.TestSpan.text; diff --git a/markwon/src/test/java/ru/noties/markwon/core/suite/UnOrderedListTest.java b/markwon/src/test/java/ru/noties/markwon/core/suite/UnOrderedListTest.java index b5aa346e..9b1dfb85 100644 --- a/markwon/src/test/java/ru/noties/markwon/core/suite/UnOrderedListTest.java +++ b/markwon/src/test/java/ru/noties/markwon/core/suite/UnOrderedListTest.java @@ -7,7 +7,6 @@ import org.robolectric.annotation.Config; import ru.noties.markwon.test.TestSpan.Document; -import static ru.noties.markwon.core.suite.TestFactory.UN_ORDERED_LIST; import static ru.noties.markwon.test.TestSpan.args; import static ru.noties.markwon.test.TestSpan.document; import static ru.noties.markwon.test.TestSpan.span; diff --git a/markwon/src/test/java/ru/noties/markwon/core/visitor/BlockQuoteNodeVisitorTest.java b/markwon/src/test/java/ru/noties/markwon/core/visitor/BlockQuoteNodeVisitorTest.java deleted file mode 100644 index f83173ce..00000000 --- a/markwon/src/test/java/ru/noties/markwon/core/visitor/BlockQuoteNodeVisitorTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package ru.noties.markwon.core.visitor; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.annotation.Config; - -import static org.junit.Assert.*; - -@RunWith(RobolectricTestRunner.class) -@Config(manifest = Config.NONE) -public class BlockQuoteNodeVisitorTest { - - @Test - public void test() { - fail(); - } -} \ No newline at end of file diff --git a/markwon/src/test/java/ru/noties/markwon/image/ImageTest.java b/markwon/src/test/java/ru/noties/markwon/image/ImageTest.java index 48cd3227..69391899 100644 --- a/markwon/src/test/java/ru/noties/markwon/image/ImageTest.java +++ b/markwon/src/test/java/ru/noties/markwon/image/ImageTest.java @@ -2,14 +2,21 @@ package ru.noties.markwon.image; import android.content.Context; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import org.commonmark.node.Image; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import ru.noties.markwon.AbstractMarkwonPlugin; import ru.noties.markwon.Markwon; +import ru.noties.markwon.MarkwonConfiguration; +import ru.noties.markwon.MarkwonSpansFactory; +import ru.noties.markwon.RenderProps; +import ru.noties.markwon.SpanFactory; import ru.noties.markwon.core.CorePlugin; import ru.noties.markwon.core.MarkwonTheme; import ru.noties.markwon.test.TestSpan.Document; @@ -32,10 +39,16 @@ public class ImageTest { final Context context = RuntimeEnvironment.application; final Markwon markwon = Markwon.builder(context) .usePlugin(CorePlugin.create()) - .usePlugin(new ImagesPlugin(context, false) { + .usePlugin(new ImagesPlugin(context, false)) + .usePlugin(new AbstractMarkwonPlugin() { @Override - protected Object imageSpan(@NonNull MarkwonTheme theme, @NonNull String destination, @NonNull AsyncDrawableLoader loader, @NonNull ImageSizeResolver imageSizeResolver, boolean replacementTextIsLink) { - return span("image", args("href", destination)); + public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) { + builder.setFactory(Image.class, new SpanFactory() { + @Override + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { + return span("image", args("href", ImageProps.DESTINATION.require(props))); + } + }); } }) .build(); diff --git a/markwon/src/test/java/ru/noties/markwon/syntax/SyntaxHighlightTest.java b/markwon/src/test/java/ru/noties/markwon/syntax/SyntaxHighlightTest.java index c15426d2..732a182f 100644 --- a/markwon/src/test/java/ru/noties/markwon/syntax/SyntaxHighlightTest.java +++ b/markwon/src/test/java/ru/noties/markwon/syntax/SyntaxHighlightTest.java @@ -1,6 +1,5 @@ package ru.noties.markwon.syntax; -import android.content.Context; import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -14,21 +13,24 @@ import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import java.util.HashMap; +import java.util.Collections; import java.util.Map; import ru.noties.markwon.AbstractMarkwonVisitorImpl; import ru.noties.markwon.MarkwonConfiguration; +import ru.noties.markwon.MarkwonSpansFactory; import ru.noties.markwon.MarkwonVisitor; +import ru.noties.markwon.RenderProps; +import ru.noties.markwon.RenderPropsImpl; +import ru.noties.markwon.SpanFactory; import ru.noties.markwon.SpannableBuilder; +import ru.noties.markwon.core.CorePluginBridge; import ru.noties.markwon.core.MarkwonTheme; -import ru.noties.markwon.core.MarkwonSpannableFactory; import ru.noties.markwon.image.AsyncDrawableLoader; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -53,6 +55,7 @@ public class SyntaxHighlightTest { @Test public void test() { + // code span must be first in the list, then should go highlight spans class Highlight { } @@ -70,19 +73,23 @@ public class SyntaxHighlightTest { } }; - final MarkwonSpannableFactory factory = mock(MarkwonSpannableFactory.class); - when(factory.code(any(MarkwonTheme.class), anyBoolean())).thenReturn(codeSpan); + final MarkwonSpansFactory spansFactory = mock(MarkwonSpansFactory.class); + when(spansFactory.require(any(FencedCodeBlock.class))).thenReturn(new SpanFactory() { + @Override + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { + return codeSpan; + } + }); - final MarkwonConfiguration configuration = MarkwonConfiguration.builder(mock(Context.class)) + final MarkwonConfiguration configuration = MarkwonConfiguration.builder() .syntaxHighlight(highlight) - .factory(factory) - .build(mock(MarkwonTheme.class), mock(AsyncDrawableLoader.class)); + .build(mock(MarkwonTheme.class), mock(AsyncDrawableLoader.class), spansFactory); - final Map, MarkwonVisitor.NodeVisitor> visitorMap = new HashMap<>(1); - visitorMap.put(FencedCodeBlock.class, new CodeBlockNodeVisitor.Fenced()); + final Map, MarkwonVisitor.NodeVisitor> visitorMap = Collections.emptyMap(); final MarkwonVisitor visitor = new AbstractMarkwonVisitorImpl( configuration, + new RenderPropsImpl(), visitorMap); final SpannableBuilder builder = visitor.builder(); @@ -96,12 +103,7 @@ public class SyntaxHighlightTest { final FencedCodeBlock fencedCodeBlock = new FencedCodeBlock(); fencedCodeBlock.setLiteral("{code}"); - CodeBlockNodeVisitor.visitCodeBlock( - visitor, - null, - "{code}", - fencedCodeBlock - ); + CorePluginBridge.visitCodeBlock(visitor, null, "{code}", fencedCodeBlock); final int end = builder.length(); @@ -116,6 +118,7 @@ public class SyntaxHighlightTest { assertEquals(length, spans.length); assertEquals(codeSpan, spans[0]); + // each character for (int i = 1; i < length; i++) { assertTrue(spans[i] instanceof Highlight); } diff --git a/sample-custom-extension/src/main/java/ru/noties/markwon/sample/extension/IconPlugin.java b/sample-custom-extension/src/main/java/ru/noties/markwon/sample/extension/IconPlugin.java index e03f8a86..eb821000 100644 --- a/sample-custom-extension/src/main/java/ru/noties/markwon/sample/extension/IconPlugin.java +++ b/sample-custom-extension/src/main/java/ru/noties/markwon/sample/extension/IconPlugin.java @@ -24,7 +24,6 @@ public class IconPlugin extends AbstractMarkwonPlugin { @Override public void configureParser(@NonNull Parser.Builder builder) { builder.customDelimiterProcessor(IconProcessor.create()); - builder.postProcessor() } @Override diff --git a/sample-custom-extension/src/main/java/ru/noties/markwon/sample/extension/MainActivity.java b/sample-custom-extension/src/main/java/ru/noties/markwon/sample/extension/MainActivity.java index 4fa0bac7..4975dc38 100644 --- a/sample-custom-extension/src/main/java/ru/noties/markwon/sample/extension/MainActivity.java +++ b/sample-custom-extension/src/main/java/ru/noties/markwon/sample/extension/MainActivity.java @@ -25,6 +25,8 @@ public class MainActivity extends Activity { .usePlugin(new AbstractMarkwonPlugin() { @Override public void configureTheme(@NonNull MarkwonTheme.Builder builder) { + // this part has nothing to do with actual IconPlugin + // this part is used to showcase that headers can be controlled via Theme final float[] textSizeMultipliers = new float[]{3f, 2f, 1.5f, 1f, .5f, .25f}; builder .headingTypeface(Typeface.MONOSPACE)