Fix markwon main artifact tests
This commit is contained in:
		
							parent
							
								
									f86cf1d109
								
							
						
					
					
						commit
						4f02a793e7
					
				| @ -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) | ||||
|                 ); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
| @ -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(); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
| @ -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) | ||||
|         ); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -11,5 +11,5 @@ public interface SpanFactory { | ||||
|     @Nullable | ||||
|     Object getSpans( | ||||
|             @NonNull MarkwonConfiguration configuration, | ||||
|             @NonNull RenderProps context); | ||||
|             @NonNull RenderProps props); | ||||
| } | ||||
|  | ||||
| @ -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<BlockQuote>() { | ||||
|             @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)) { | ||||
|  | ||||
| @ -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); | ||||
| } | ||||
| @ -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); | ||||
|     } | ||||
| } | ||||
| @ -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()); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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) | ||||
|         ); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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() | ||||
|         ); | ||||
|     } | ||||
|  | ||||
| @ -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( | ||||
|  | ||||
| @ -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(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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()); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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) | ||||
|         ); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -10,7 +10,8 @@ public class AbstractMarkwonVisitorImpl extends MarkwonVisitorImpl { | ||||
| 
 | ||||
|     public AbstractMarkwonVisitorImpl( | ||||
|             @NonNull MarkwonConfiguration configuration, | ||||
|             @NonNull RenderProps renderProps, | ||||
|             @NonNull Map<Class<? extends Node>, NodeVisitor<? extends Node>> nodes) { | ||||
|         super(configuration, nodes); | ||||
|         super(configuration, renderProps, nodes); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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() { | ||||
|     } | ||||
| } | ||||
| @ -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,20 +36,21 @@ 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() { | ||||
| 
 | ||||
|                     public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) { | ||||
|                         builder | ||||
|                                 .setFactory(StrongEmphasis.class, new SpanFactory() { | ||||
|                                     @Override | ||||
|                             public Object strongEmphasis() { | ||||
|                                     public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { | ||||
|                                         return span("bold"); | ||||
|                                     } | ||||
| 
 | ||||
|                                 }) | ||||
|                                 .setFactory(Emphasis.class, new SpanFactory() { | ||||
|                                     @Override | ||||
|                             public Object emphasis() { | ||||
|                                     public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { | ||||
|                                         return span("italic"); | ||||
|                                     } | ||||
|                                 }); | ||||
|  | ||||
| @ -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<Class<? extends Node>, 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<Class<? extends Node>, SpanFactory> CORE_NODES; | ||||
| 
 | ||||
|   static { | ||||
|     final Map<Class<? extends Node>, 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<String, Object> extractArgs(@NonNull RenderProps props) { | ||||
|       return Collections.emptyMap(); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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)); | ||||
|   } | ||||
| } | ||||
| @ -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; | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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(); | ||||
|     } | ||||
| } | ||||
| @ -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(); | ||||
|  | ||||
| @ -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<Class<? extends Node>, MarkwonVisitor.NodeVisitor<? extends Node>> visitorMap = new HashMap<>(1); | ||||
|         visitorMap.put(FencedCodeBlock.class, new CodeBlockNodeVisitor.Fenced()); | ||||
|         final Map<Class<? extends Node>, MarkwonVisitor.NodeVisitor<? extends Node>> 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); | ||||
|         } | ||||
|  | ||||
| @ -24,7 +24,6 @@ public class IconPlugin extends AbstractMarkwonPlugin { | ||||
|     @Override | ||||
|     public void configureParser(@NonNull Parser.Builder builder) { | ||||
|         builder.customDelimiterProcessor(IconProcessor.create()); | ||||
|         builder.postProcessor() | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|  | ||||
| @ -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) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dimitry Ivanov
						Dimitry Ivanov