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() {
|
builder.setFactory(Image.class, new SpanFactory() {
|
||||||
@Override
|
@Override
|
||||||
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) {
|
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) {
|
||||||
return new AsyncDrawableSpan(
|
return new AsyncDrawableSpan(
|
||||||
configuration.theme(),
|
configuration.theme(),
|
||||||
new GifAwareAsyncDrawable(
|
new GifAwareAsyncDrawable(
|
||||||
gifPlaceholder,
|
gifPlaceholder,
|
||||||
ImageProps.DESTINATION.require(context),
|
ImageProps.DESTINATION.require(props),
|
||||||
configuration.asyncDrawableLoader(),
|
configuration.asyncDrawableLoader(),
|
||||||
configuration.imageSizeResolver(),
|
configuration.imageSizeResolver(),
|
||||||
ImageProps.IMAGE_SIZE.get(context)
|
ImageProps.IMAGE_SIZE.get(props)
|
||||||
),
|
),
|
||||||
AsyncDrawableSpan.ALIGN_BOTTOM,
|
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) {
|
public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) {
|
||||||
builder.setFactory(Strikethrough.class, new SpanFactory() {
|
builder.setFactory(Strikethrough.class, new SpanFactory() {
|
||||||
@Override
|
@Override
|
||||||
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) {
|
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) {
|
||||||
return new StrikethroughSpan();
|
return new StrikethroughSpan();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -18,12 +18,12 @@ public class TaskListSpanFactory implements SpanFactory {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) {
|
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) {
|
||||||
return new TaskListSpan(
|
return new TaskListSpan(
|
||||||
configuration.theme(),
|
configuration.theme(),
|
||||||
drawable,
|
drawable,
|
||||||
TaskListProps.BLOCK_INDENT.get(context, 0),
|
TaskListProps.BLOCK_INDENT.get(props, 0),
|
||||||
TaskListProps.DONE.get(context, false)
|
TaskListProps.DONE.get(props, false)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,5 +11,5 @@ public interface SpanFactory {
|
|||||||
@Nullable
|
@Nullable
|
||||||
Object getSpans(
|
Object getSpans(
|
||||||
@NonNull MarkwonConfiguration configuration,
|
@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.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
import android.support.annotation.VisibleForTesting;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.commonmark.node.BlockQuote;
|
import org.commonmark.node.BlockQuote;
|
||||||
@ -142,9 +143,18 @@ public class CorePlugin extends AbstractMarkwonPlugin {
|
|||||||
builder.on(BlockQuote.class, new MarkwonVisitor.NodeVisitor<BlockQuote>() {
|
builder.on(BlockQuote.class, new MarkwonVisitor.NodeVisitor<BlockQuote>() {
|
||||||
@Override
|
@Override
|
||||||
public void visit(@NonNull MarkwonVisitor visitor, @NonNull BlockQuote blockQuote) {
|
public void visit(@NonNull MarkwonVisitor visitor, @NonNull BlockQuote blockQuote) {
|
||||||
|
|
||||||
|
visitor.ensureNewLine();
|
||||||
|
|
||||||
final int length = visitor.length();
|
final int length = visitor.length();
|
||||||
|
|
||||||
visitor.visitChildren(blockQuote);
|
visitor.visitChildren(blockQuote);
|
||||||
visitor.setSpansForNode(blockQuote, length);
|
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,
|
@NonNull MarkwonVisitor visitor,
|
||||||
@Nullable String info,
|
@Nullable String info,
|
||||||
@NonNull String code,
|
@NonNull String code,
|
||||||
@ -227,6 +238,11 @@ public class CorePlugin extends AbstractMarkwonPlugin {
|
|||||||
|
|
||||||
final int length = visitor.length();
|
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();
|
final Node parent = listItem.getParent();
|
||||||
if (parent instanceof OrderedList) {
|
if (parent instanceof OrderedList) {
|
||||||
|
|
||||||
@ -244,7 +260,6 @@ public class CorePlugin extends AbstractMarkwonPlugin {
|
|||||||
CoreProps.BULLET_LIST_ITEM_LEVEL.set(visitor.renderProps(), listLevel(listItem));
|
CoreProps.BULLET_LIST_ITEM_LEVEL.set(visitor.renderProps(), listLevel(listItem));
|
||||||
}
|
}
|
||||||
|
|
||||||
visitor.visitChildren(listItem);
|
|
||||||
visitor.setSpansForNode(listItem, length);
|
visitor.setSpansForNode(listItem, length);
|
||||||
|
|
||||||
if (visitor.hasNext(listItem)) {
|
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 {
|
public class BlockQuoteSpanFactory implements SpanFactory {
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) {
|
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) {
|
||||||
return new BlockQuoteSpan(configuration.theme());
|
return new BlockQuoteSpan(configuration.theme());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@ import ru.noties.markwon.core.spans.CodeSpan;
|
|||||||
public class CodeBlockSpanFactory implements SpanFactory {
|
public class CodeBlockSpanFactory implements SpanFactory {
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@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);
|
return new CodeSpan(configuration.theme(), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@ import ru.noties.markwon.core.spans.CodeSpan;
|
|||||||
public class CodeSpanFactory implements SpanFactory {
|
public class CodeSpanFactory implements SpanFactory {
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@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);
|
return new CodeSpan(configuration.theme(), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@ import ru.noties.markwon.core.spans.EmphasisSpan;
|
|||||||
public class EmphasisSpanFactory implements SpanFactory {
|
public class EmphasisSpanFactory implements SpanFactory {
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) {
|
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) {
|
||||||
return new EmphasisSpan();
|
return new EmphasisSpan();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,10 +12,10 @@ import ru.noties.markwon.core.spans.HeadingSpan;
|
|||||||
public class HeadingSpanFactory implements SpanFactory {
|
public class HeadingSpanFactory implements SpanFactory {
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) {
|
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) {
|
||||||
return new HeadingSpan(
|
return new HeadingSpan(
|
||||||
configuration.theme(),
|
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 {
|
public class LinkSpanFactory implements SpanFactory {
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) {
|
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) {
|
||||||
return new LinkSpan(
|
return new LinkSpan(
|
||||||
configuration.theme(),
|
configuration.theme(),
|
||||||
CoreProps.LINK_DESTINATION.require(context),
|
CoreProps.LINK_DESTINATION.require(props),
|
||||||
configuration.linkResolver()
|
configuration.linkResolver()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -14,22 +14,22 @@ public class ListItemSpanFactory implements SpanFactory {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) {
|
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) {
|
||||||
|
|
||||||
// type of list item
|
// type of list item
|
||||||
// bullet : level
|
// bullet : level
|
||||||
// ordered: number
|
// ordered: number
|
||||||
final Object spans;
|
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(
|
spans = new BulletListItemSpan(
|
||||||
configuration.theme(),
|
configuration.theme(),
|
||||||
CoreProps.BULLET_LIST_ITEM_LEVEL.require(context)
|
CoreProps.BULLET_LIST_ITEM_LEVEL.require(props)
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// todo| in order to provide real RTL experience there must be a way to provide this string
|
// 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';
|
+ "." + '\u00a0';
|
||||||
|
|
||||||
spans = new OrderedListItemSpan(
|
spans = new OrderedListItemSpan(
|
||||||
|
@ -11,7 +11,7 @@ import ru.noties.markwon.core.spans.StrongEmphasisSpan;
|
|||||||
public class StrongEmphasisSpanFactory implements SpanFactory {
|
public class StrongEmphasisSpanFactory implements SpanFactory {
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) {
|
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) {
|
||||||
return new StrongEmphasisSpan();
|
return new StrongEmphasisSpan();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@ import ru.noties.markwon.core.spans.ThematicBreakSpan;
|
|||||||
public class ThematicBreakSpanFactory implements SpanFactory {
|
public class ThematicBreakSpanFactory implements SpanFactory {
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) {
|
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) {
|
||||||
return new ThematicBreakSpan(configuration.theme());
|
return new ThematicBreakSpan(configuration.theme());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,17 +10,17 @@ import ru.noties.markwon.SpanFactory;
|
|||||||
public class ImageSpanFactory implements SpanFactory {
|
public class ImageSpanFactory implements SpanFactory {
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps context) {
|
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) {
|
||||||
return new AsyncDrawableSpan(
|
return new AsyncDrawableSpan(
|
||||||
configuration.theme(),
|
configuration.theme(),
|
||||||
new AsyncDrawable(
|
new AsyncDrawable(
|
||||||
ImageProps.DESTINATION.require(context),
|
ImageProps.DESTINATION.require(props),
|
||||||
configuration.asyncDrawableLoader(),
|
configuration.asyncDrawableLoader(),
|
||||||
configuration.imageSizeResolver(),
|
configuration.imageSizeResolver(),
|
||||||
ImageProps.IMAGE_SIZE.get(context)
|
ImageProps.IMAGE_SIZE.get(props)
|
||||||
),
|
),
|
||||||
AsyncDrawableSpan.ALIGN_BOTTOM,
|
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(
|
public AbstractMarkwonVisitorImpl(
|
||||||
@NonNull MarkwonConfiguration configuration,
|
@NonNull MarkwonConfiguration configuration,
|
||||||
|
@NonNull RenderProps renderProps,
|
||||||
@NonNull Map<Class<? extends Node>, NodeVisitor<? extends Node>> nodes) {
|
@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.support.annotation.NonNull;
|
||||||
import android.text.Spanned;
|
import android.text.Spanned;
|
||||||
|
|
||||||
|
import org.commonmark.node.Emphasis;
|
||||||
|
import org.commonmark.node.StrongEmphasis;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
@ -12,6 +14,9 @@ import org.robolectric.annotation.Config;
|
|||||||
import ru.noties.markwon.AbstractMarkwonPlugin;
|
import ru.noties.markwon.AbstractMarkwonPlugin;
|
||||||
import ru.noties.markwon.Markwon;
|
import ru.noties.markwon.Markwon;
|
||||||
import ru.noties.markwon.MarkwonConfiguration;
|
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.TestSpan;
|
||||||
import ru.noties.markwon.test.TestSpanMatcher;
|
import ru.noties.markwon.test.TestSpanMatcher;
|
||||||
|
|
||||||
@ -31,20 +36,21 @@ public class CoreTest {
|
|||||||
span("bold",
|
span("bold",
|
||||||
span("italic", text("bold italic"))));
|
span("italic", text("bold italic"))));
|
||||||
|
|
||||||
final Spanned spanned = (Spanned) Markwon.builder(RuntimeEnvironment.application)
|
final Spanned spanned = Markwon.builder(RuntimeEnvironment.application)
|
||||||
.usePlugin(CorePlugin.create())
|
.usePlugin(CorePlugin.create())
|
||||||
.usePlugin(new AbstractMarkwonPlugin() {
|
.usePlugin(new AbstractMarkwonPlugin() {
|
||||||
@Override
|
@Override
|
||||||
public void configureConfiguration(@NonNull MarkwonConfiguration.Builder builder) {
|
public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) {
|
||||||
builder.factory(new MarkwonSpannableFactoryDef() {
|
builder
|
||||||
|
.setFactory(StrongEmphasis.class, new SpanFactory() {
|
||||||
@Override
|
@Override
|
||||||
public Object strongEmphasis() {
|
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) {
|
||||||
return span("bold");
|
return span("bold");
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
.setFactory(Emphasis.class, new SpanFactory() {
|
||||||
@Override
|
@Override
|
||||||
public Object emphasis() {
|
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) {
|
||||||
return span("italic");
|
return span("italic");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1,20 +1,55 @@
|
|||||||
package ru.noties.markwon.core.suite;
|
package ru.noties.markwon.core.suite;
|
||||||
|
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
import android.text.Spanned;
|
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 org.robolectric.RuntimeEnvironment;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import ru.noties.markwon.AbstractMarkwonPlugin;
|
import ru.noties.markwon.AbstractMarkwonPlugin;
|
||||||
import ru.noties.markwon.Markwon;
|
import ru.noties.markwon.Markwon;
|
||||||
import ru.noties.markwon.MarkwonConfiguration;
|
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.CorePlugin;
|
||||||
|
import ru.noties.markwon.core.CoreProps;
|
||||||
import ru.noties.markwon.test.TestSpan;
|
import ru.noties.markwon.test.TestSpan;
|
||||||
import ru.noties.markwon.test.TestSpanMatcher;
|
import ru.noties.markwon.test.TestSpanMatcher;
|
||||||
import ru.noties.markwon.test.TestUtil;
|
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 {
|
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) {
|
void match(@NonNull String markdown, @NonNull TestSpan.Document document) {
|
||||||
final Spanned spanned = markwon().toMarkdown(markdown);
|
final Spanned spanned = markwon().toMarkdown(markdown);
|
||||||
TestSpanMatcher.matches(spanned, document);
|
TestSpanMatcher.matches(spanned, document);
|
||||||
@ -36,8 +71,20 @@ abstract class BaseSuiteTest {
|
|||||||
.usePlugin(CorePlugin.create(softBreakAddsNewLine()))
|
.usePlugin(CorePlugin.create(softBreakAddsNewLine()))
|
||||||
.usePlugin(new AbstractMarkwonPlugin() {
|
.usePlugin(new AbstractMarkwonPlugin() {
|
||||||
@Override
|
@Override
|
||||||
public void configureConfiguration(@NonNull MarkwonConfiguration.Builder builder) {
|
public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) {
|
||||||
builder.factory(new TestFactory(useParagraphs()));
|
|
||||||
|
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();
|
.build();
|
||||||
@ -50,4 +97,75 @@ abstract class BaseSuiteTest {
|
|||||||
boolean softBreakAddsNewLine() {
|
boolean softBreakAddsNewLine() {
|
||||||
return false;
|
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 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.document;
|
||||||
import static ru.noties.markwon.test.TestSpan.span;
|
import static ru.noties.markwon.test.TestSpan.span;
|
||||||
import static ru.noties.markwon.test.TestSpan.text;
|
import static ru.noties.markwon.test.TestSpan.text;
|
||||||
|
@ -7,8 +7,6 @@ import org.robolectric.annotation.Config;
|
|||||||
|
|
||||||
import ru.noties.markwon.test.TestSpan;
|
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.document;
|
||||||
import static ru.noties.markwon.test.TestSpan.span;
|
import static ru.noties.markwon.test.TestSpan.span;
|
||||||
import static ru.noties.markwon.test.TestSpan.text;
|
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 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.args;
|
||||||
import static ru.noties.markwon.test.TestSpan.document;
|
import static ru.noties.markwon.test.TestSpan.document;
|
||||||
import static ru.noties.markwon.test.TestSpan.span;
|
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 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.args;
|
||||||
import static ru.noties.markwon.test.TestSpan.document;
|
import static ru.noties.markwon.test.TestSpan.document;
|
||||||
import static ru.noties.markwon.test.TestSpan.span;
|
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 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.document;
|
||||||
import static ru.noties.markwon.test.TestSpan.span;
|
import static ru.noties.markwon.test.TestSpan.span;
|
||||||
import static ru.noties.markwon.test.TestSpan.text;
|
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 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.args;
|
||||||
import static ru.noties.markwon.test.TestSpan.document;
|
import static ru.noties.markwon.test.TestSpan.document;
|
||||||
import static ru.noties.markwon.test.TestSpan.span;
|
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 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.args;
|
||||||
import static ru.noties.markwon.test.TestSpan.document;
|
import static ru.noties.markwon.test.TestSpan.document;
|
||||||
import static ru.noties.markwon.test.TestSpan.span;
|
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 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.args;
|
||||||
import static ru.noties.markwon.test.TestSpan.document;
|
import static ru.noties.markwon.test.TestSpan.document;
|
||||||
import static ru.noties.markwon.test.TestSpan.span;
|
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 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.args;
|
||||||
import static ru.noties.markwon.test.TestSpan.document;
|
import static ru.noties.markwon.test.TestSpan.document;
|
||||||
import static ru.noties.markwon.test.TestSpan.span;
|
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 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.document;
|
||||||
import static ru.noties.markwon.test.TestSpan.span;
|
import static ru.noties.markwon.test.TestSpan.span;
|
||||||
import static ru.noties.markwon.test.TestSpan.text;
|
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 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.args;
|
||||||
import static ru.noties.markwon.test.TestSpan.document;
|
import static ru.noties.markwon.test.TestSpan.document;
|
||||||
import static ru.noties.markwon.test.TestSpan.span;
|
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 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.document;
|
||||||
import static ru.noties.markwon.test.TestSpan.span;
|
import static ru.noties.markwon.test.TestSpan.span;
|
||||||
import static ru.noties.markwon.test.TestSpan.text;
|
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 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.document;
|
||||||
import static ru.noties.markwon.test.TestSpan.span;
|
import static ru.noties.markwon.test.TestSpan.span;
|
||||||
import static ru.noties.markwon.test.TestSpan.text;
|
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 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.args;
|
||||||
import static ru.noties.markwon.test.TestSpan.document;
|
import static ru.noties.markwon.test.TestSpan.document;
|
||||||
import static ru.noties.markwon.test.TestSpan.span;
|
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.content.Context;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
|
||||||
|
import org.commonmark.node.Image;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
import org.robolectric.RuntimeEnvironment;
|
import org.robolectric.RuntimeEnvironment;
|
||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
|
|
||||||
|
import ru.noties.markwon.AbstractMarkwonPlugin;
|
||||||
import ru.noties.markwon.Markwon;
|
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.CorePlugin;
|
||||||
import ru.noties.markwon.core.MarkwonTheme;
|
import ru.noties.markwon.core.MarkwonTheme;
|
||||||
import ru.noties.markwon.test.TestSpan.Document;
|
import ru.noties.markwon.test.TestSpan.Document;
|
||||||
@ -32,10 +39,16 @@ public class ImageTest {
|
|||||||
final Context context = RuntimeEnvironment.application;
|
final Context context = RuntimeEnvironment.application;
|
||||||
final Markwon markwon = Markwon.builder(context)
|
final Markwon markwon = Markwon.builder(context)
|
||||||
.usePlugin(CorePlugin.create())
|
.usePlugin(CorePlugin.create())
|
||||||
.usePlugin(new ImagesPlugin(context, false) {
|
.usePlugin(new ImagesPlugin(context, false))
|
||||||
|
.usePlugin(new AbstractMarkwonPlugin() {
|
||||||
@Override
|
@Override
|
||||||
protected Object imageSpan(@NonNull MarkwonTheme theme, @NonNull String destination, @NonNull AsyncDrawableLoader loader, @NonNull ImageSizeResolver imageSizeResolver, boolean replacementTextIsLink) {
|
public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) {
|
||||||
return span("image", args("href", destination));
|
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();
|
.build();
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package ru.noties.markwon.syntax;
|
package ru.noties.markwon.syntax;
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
@ -14,21 +13,24 @@ import org.junit.runner.RunWith;
|
|||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.Collections;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import ru.noties.markwon.AbstractMarkwonVisitorImpl;
|
import ru.noties.markwon.AbstractMarkwonVisitorImpl;
|
||||||
import ru.noties.markwon.MarkwonConfiguration;
|
import ru.noties.markwon.MarkwonConfiguration;
|
||||||
|
import ru.noties.markwon.MarkwonSpansFactory;
|
||||||
import ru.noties.markwon.MarkwonVisitor;
|
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.SpannableBuilder;
|
||||||
|
import ru.noties.markwon.core.CorePluginBridge;
|
||||||
import ru.noties.markwon.core.MarkwonTheme;
|
import ru.noties.markwon.core.MarkwonTheme;
|
||||||
import ru.noties.markwon.core.MarkwonSpannableFactory;
|
|
||||||
import ru.noties.markwon.image.AsyncDrawableLoader;
|
import ru.noties.markwon.image.AsyncDrawableLoader;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
@ -53,6 +55,7 @@ public class SyntaxHighlightTest {
|
|||||||
@Test
|
@Test
|
||||||
public void test() {
|
public void test() {
|
||||||
|
|
||||||
|
// code span must be first in the list, then should go highlight spans
|
||||||
class Highlight {
|
class Highlight {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,19 +73,23 @@ public class SyntaxHighlightTest {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
final MarkwonSpannableFactory factory = mock(MarkwonSpannableFactory.class);
|
final MarkwonSpansFactory spansFactory = mock(MarkwonSpansFactory.class);
|
||||||
when(factory.code(any(MarkwonTheme.class), anyBoolean())).thenReturn(codeSpan);
|
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)
|
.syntaxHighlight(highlight)
|
||||||
.factory(factory)
|
.build(mock(MarkwonTheme.class), mock(AsyncDrawableLoader.class), spansFactory);
|
||||||
.build(mock(MarkwonTheme.class), mock(AsyncDrawableLoader.class));
|
|
||||||
|
|
||||||
final Map<Class<? extends Node>, MarkwonVisitor.NodeVisitor<? extends Node>> visitorMap = new HashMap<>(1);
|
final Map<Class<? extends Node>, MarkwonVisitor.NodeVisitor<? extends Node>> visitorMap = Collections.emptyMap();
|
||||||
visitorMap.put(FencedCodeBlock.class, new CodeBlockNodeVisitor.Fenced());
|
|
||||||
|
|
||||||
final MarkwonVisitor visitor = new AbstractMarkwonVisitorImpl(
|
final MarkwonVisitor visitor = new AbstractMarkwonVisitorImpl(
|
||||||
configuration,
|
configuration,
|
||||||
|
new RenderPropsImpl(),
|
||||||
visitorMap);
|
visitorMap);
|
||||||
|
|
||||||
final SpannableBuilder builder = visitor.builder();
|
final SpannableBuilder builder = visitor.builder();
|
||||||
@ -96,12 +103,7 @@ public class SyntaxHighlightTest {
|
|||||||
final FencedCodeBlock fencedCodeBlock = new FencedCodeBlock();
|
final FencedCodeBlock fencedCodeBlock = new FencedCodeBlock();
|
||||||
fencedCodeBlock.setLiteral("{code}");
|
fencedCodeBlock.setLiteral("{code}");
|
||||||
|
|
||||||
CodeBlockNodeVisitor.visitCodeBlock(
|
CorePluginBridge.visitCodeBlock(visitor, null, "{code}", fencedCodeBlock);
|
||||||
visitor,
|
|
||||||
null,
|
|
||||||
"{code}",
|
|
||||||
fencedCodeBlock
|
|
||||||
);
|
|
||||||
|
|
||||||
final int end = builder.length();
|
final int end = builder.length();
|
||||||
|
|
||||||
@ -116,6 +118,7 @@ public class SyntaxHighlightTest {
|
|||||||
assertEquals(length, spans.length);
|
assertEquals(length, spans.length);
|
||||||
assertEquals(codeSpan, spans[0]);
|
assertEquals(codeSpan, spans[0]);
|
||||||
|
|
||||||
|
// each character
|
||||||
for (int i = 1; i < length; i++) {
|
for (int i = 1; i < length; i++) {
|
||||||
assertTrue(spans[i] instanceof Highlight);
|
assertTrue(spans[i] instanceof Highlight);
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,6 @@ public class IconPlugin extends AbstractMarkwonPlugin {
|
|||||||
@Override
|
@Override
|
||||||
public void configureParser(@NonNull Parser.Builder builder) {
|
public void configureParser(@NonNull Parser.Builder builder) {
|
||||||
builder.customDelimiterProcessor(IconProcessor.create());
|
builder.customDelimiterProcessor(IconProcessor.create());
|
||||||
builder.postProcessor()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -25,6 +25,8 @@ public class MainActivity extends Activity {
|
|||||||
.usePlugin(new AbstractMarkwonPlugin() {
|
.usePlugin(new AbstractMarkwonPlugin() {
|
||||||
@Override
|
@Override
|
||||||
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
|
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};
|
final float[] textSizeMultipliers = new float[]{3f, 2f, 1.5f, 1f, .5f, .25f};
|
||||||
builder
|
builder
|
||||||
.headingTypeface(Typeface.MONOSPACE)
|
.headingTypeface(Typeface.MONOSPACE)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user