Recipes
SpannableFactory
Consider using NoCopySpannableFactory
when a TextView
will be used to display markdown
multiple times (for example in a RecyclerView
):
// call after inflation and before setting markdown
textView.setSpannableFactory(NoCopySpannableFactory.getInstance());
Autolink
Do not use autolink
XML attribute on your TextView
as it will remove all links except autolinked ones.
Consider using linkify plugin or commonmark-java autolink extension
List item spacing
If your list items, task list items or paragraphs need special space between them
(increasing spacing between them, but keeping the original line height),
LastLineSpacingSpan
4.0.0 can be used:
final Markwon markwon = Markwon.builder(context)
.usePlugin(new AbstractMarkwonPlugin() {
@Override
public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) {
// or Paragraph, or TaskListItem
builder.addFactory(ListItem.class, new SpanFactory() {
@Override
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) {
return new LastLineSpacingSpan(spacingPx);
}
});
}
})
.build();
Softbreak new-line
If you want to add a new line when a softbreak
is used:
final Markwon markwon = Markwon.builder(context)
.usePlugin(new AbstractMarkwonPlugin() {
@Override
public void configureVisitor(@NonNull MarkwonVisitor.Builder builder) {
builder.on(SoftLineBreak.class, new MarkwonVisitor.NodeVisitor<SoftLineBreak>() {
@Override
public void visit(@NonNull MarkwonVisitor visitor, @NonNull SoftLineBreak softLineBreak) {
visitor.forceNewLine();
}
});
}
})
.build();
Custom typeface
When using a custom typeface on a TextView
you might find that bold and italic nodes
are displayed incorrectly. Consider registering own SpanFactories
for StrongEmphasis
and Emphasis
nodes:
final Markwon markwon = Markwon.builder(context)
.usePlugin(new AbstractMarkwonPlugin() {
@Override
public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) {
builder
.setFactory(StrongEmphasis.class, new SpanFactory() {
@Override
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) {
return new StyleSpan(Typeface.BOLD);
}
})
.setFactory(Emphasis.class, new SpanFactory() {
@Override
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) {
return new StyleSpan(Typeface.ITALIC);
}
});
}
})
.build();
Please check that StyleSpan
works for you. If it doesn't consider
using CustomTypefaceSpan
with your typeface directly.