Move HTML specifics to html module

This commit is contained in:
Dimitry Ivanov 2019-06-04 16:32:35 +03:00
parent f3476ca5cc
commit df0177af95
23 changed files with 307 additions and 139 deletions

View File

@ -6,4 +6,6 @@
internally caches latest state and skips scheduling if drawables are already processed
* configure with registry
* removed priority
* images-plugin moved to standalone again
* images-plugin moved to standalone again
* removed MarkwonPlugin#configureHtmlRenderer -> now part of HtmlPlugin
* TagHandler now has `supportedTags()` method

View File

@ -49,11 +49,6 @@ public abstract class AbstractMarkwonPlugin implements MarkwonPlugin {
}
@Override
public void configureHtmlRenderer(@NonNull MarkwonHtmlRenderer.Builder builder) {
}
@NonNull
@Override
public String processMarkdown(@NonNull String markdown) {

View File

@ -16,7 +16,6 @@ import java.util.List;
import java.util.Set;
import ru.noties.markwon.core.MarkwonTheme;
import ru.noties.markwon.html.MarkwonHtmlRenderer;
/**
* @since 3.0.0
@ -84,7 +83,6 @@ class MarkwonBuilderImpl implements Markwon.Builder {
final MarkwonConfiguration.Builder configurationBuilder = new MarkwonConfiguration.Builder();
final MarkwonVisitor.Builder visitorBuilder = new MarkwonVisitorImpl.BuilderImpl();
final MarkwonSpansFactory.Builder spanFactoryBuilder = new MarkwonSpansFactoryImpl.BuilderImpl();
final MarkwonHtmlRenderer.Builder htmlRendererBuilder = MarkwonHtmlRenderer.builder();
for (MarkwonPlugin plugin : plugins) {
plugin.configureParser(parserBuilder);
@ -92,12 +90,10 @@ class MarkwonBuilderImpl implements Markwon.Builder {
plugin.configureConfiguration(configurationBuilder);
plugin.configureVisitor(visitorBuilder);
plugin.configureSpansFactory(spanFactoryBuilder);
plugin.configureHtmlRenderer(htmlRendererBuilder);
}
final MarkwonConfiguration configuration = configurationBuilder.build(
themeBuilder.build(),
htmlRendererBuilder.build(),
spanFactoryBuilder.build());
final RenderProps renderProps = new RenderPropsImpl();

View File

@ -122,6 +122,15 @@ public class MarkwonConfiguration {
return this;
}
/**
* @since 4.0.0-SNAPSHOT
*/
@NonNull
public Builder htmlRenderer(@NonNull MarkwonHtmlRenderer htmlRenderer) {
this.htmlRenderer = htmlRenderer;
return this;
}
@NonNull
public Builder syntaxHighlight(@NonNull SyntaxHighlight syntaxHighlight) {
this.syntaxHighlight = syntaxHighlight;
@ -158,11 +167,9 @@ public class MarkwonConfiguration {
@NonNull
public MarkwonConfiguration build(
@NonNull MarkwonTheme theme,
@NonNull MarkwonHtmlRenderer htmlRenderer,
@NonNull MarkwonSpansFactory spansFactory) {
this.theme = theme;
this.htmlRenderer = htmlRenderer;
this.spansFactory = spansFactory;
// @since 4.0.0-SNAPSHOT
@ -170,6 +177,11 @@ public class MarkwonConfiguration {
asyncDrawableLoader = AsyncDrawableLoader.noOp();
}
// @since 4.0.0-SNAPSHOT
if (htmlRenderer == null) {
htmlRenderer = MarkwonHtmlRenderer.noOp();
}
if (syntaxHighlight == null) {
syntaxHighlight = new SyntaxHighlightNoOp();
}

View File

@ -16,7 +16,7 @@ import ru.noties.markwon.html.MarkwonHtmlRenderer;
*
* @see AbstractMarkwonPlugin
* @see ru.noties.markwon.core.CorePlugin
* @see ru.noties.markwon.image.ImagesPlugin
* @see ru.noties.markwon.movement.MovementMethodPlugin
* @since 3.0.0
*/
public interface MarkwonPlugin {
@ -88,13 +88,13 @@ public interface MarkwonPlugin {
*/
void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder);
/**
* Configure {@link MarkwonHtmlRenderer} to add or remove HTML {@link ru.noties.markwon.html.TagHandler}s
*
* @see MarkwonHtmlRenderer
* @see MarkwonHtmlRenderer.Builder
*/
void configureHtmlRenderer(@NonNull MarkwonHtmlRenderer.Builder builder);
// /**
// * Configure {@link MarkwonHtmlRenderer} to add or remove HTML {@link ru.noties.markwon.html.TagHandler}s
// *
// * @see MarkwonHtmlRenderer
// * @see MarkwonHtmlRenderer.Builder
// */
// void configureHtmlRenderer(@NonNull MarkwonHtmlRenderer.Builder builder);
/**
* Process input markdown and return new string to be used in parsing stage further.
@ -128,7 +128,7 @@ public interface MarkwonPlugin {
/**
* This method will be called <strong>before</strong> calling <code>TextView#setText</code>.
* <p>
* It can be useful to prepare a TextView for markdown. For example {@link ru.noties.markwon.image.ImagesPlugin}
* It can be useful to prepare a TextView for markdown. For example {@code ru.noties.markwon.image.ImagesPlugin}
* uses this method to unregister previously registered {@link ru.noties.markwon.image.AsyncDrawableSpan}
* (if there are such spans in this TextView at this point). Or {@link ru.noties.markwon.core.CorePlugin}
* which measures ordered list numbers
@ -141,7 +141,7 @@ public interface MarkwonPlugin {
/**
* This method will be called <strong>after</strong> markdown was applied.
* <p>
* It can be useful to trigger certain action on spans/textView. For example {@link ru.noties.markwon.image.ImagesPlugin}
* It can be useful to trigger certain action on spans/textView. For example {@code ru.noties.markwon.image.ImagesPlugin}
* uses this method to register {@link ru.noties.markwon.image.AsyncDrawableSpan} and start
* asynchronously loading images.
* <p>

View File

@ -3,8 +3,6 @@ package ru.noties.markwon.html;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.util.Collection;
import ru.noties.markwon.MarkwonVisitor;
/**
@ -12,9 +10,12 @@ import ru.noties.markwon.MarkwonVisitor;
*/
public abstract class MarkwonHtmlRenderer {
/**
* @since 4.0.0-SNAPSHOT
*/
@NonNull
public static Builder builder() {
return new MarkwonHtmlRendererImpl.BuilderImpl();
public static MarkwonHtmlRenderer noOp() {
return new MarkwonHtmlRendererNoOp();
}
public abstract void render(
@ -24,33 +25,4 @@ public abstract class MarkwonHtmlRenderer {
@Nullable
public abstract TagHandler tagHandler(@NonNull String tagName);
/**
* @since 3.0.0
*/
public interface Builder {
/**
* @param allowNonClosedTags parameter to indicate that all non-closed HTML tags should be
* closed at the end of a document. if {@code true} all non-closed
* tags will be force-closed at the end. Otherwise these tags will be
* ignored and thus not rendered.
* @return self
*/
@NonNull
Builder allowNonClosedTags(boolean allowNonClosedTags);
@NonNull
Builder setHandler(@NonNull String tagName, @Nullable TagHandler tagHandler);
@NonNull
Builder setHandler(@NonNull Collection<String> tagNames, @Nullable TagHandler tagHandler);
@Nullable
TagHandler getHandler(@NonNull String tagName);
@NonNull
MarkwonHtmlRenderer build();
}
}

View File

@ -2,6 +2,8 @@ package ru.noties.markwon.html;
import android.support.annotation.NonNull;
import java.util.Collection;
import ru.noties.markwon.MarkwonVisitor;
public abstract class TagHandler {
@ -12,6 +14,13 @@ public abstract class TagHandler {
@NonNull HtmlTag tag
);
/**
* @since 4.0.0-SNAPSHOT
*/
@NonNull
public abstract Collection<String> supportedTags();
protected static void visitChildren(
@NonNull MarkwonVisitor visitor,
@NonNull MarkwonHtmlRenderer renderer,

View File

@ -10,19 +10,6 @@ import org.commonmark.node.Node;
import ru.noties.markwon.AbstractMarkwonPlugin;
import ru.noties.markwon.MarkwonConfiguration;
import ru.noties.markwon.MarkwonVisitor;
import ru.noties.markwon.html.tag.BlockquoteHandler;
import ru.noties.markwon.html.tag.EmphasisHandler;
import ru.noties.markwon.html.tag.HeadingHandler;
import ru.noties.markwon.html.tag.ImageHandler;
import ru.noties.markwon.html.tag.LinkHandler;
import ru.noties.markwon.html.tag.ListHandler;
import ru.noties.markwon.html.tag.StrikeHandler;
import ru.noties.markwon.html.tag.StrongEmphasisHandler;
import ru.noties.markwon.html.tag.SubScriptHandler;
import ru.noties.markwon.html.tag.SuperScriptHandler;
import ru.noties.markwon.html.tag.UnderlineHandler;
import static java.util.Arrays.asList;
/**
* @since 3.0.0
@ -36,48 +23,60 @@ public class HtmlPlugin extends AbstractMarkwonPlugin {
public static final float SCRIPT_DEF_TEXT_SIZE_RATIO = .75F;
@Override
public void configureConfiguration(@NonNull MarkwonConfiguration.Builder builder) {
builder.htmlParser(MarkwonHtmlParserImpl.create());
private final MarkwonHtmlRendererImpl.Builder builder;
@SuppressWarnings("WeakerAccess")
HtmlPlugin() {
this.builder = new MarkwonHtmlRendererImpl.Builder();
}
/**
* @param allowNonClosedTags whether or not non-closed tags should be closed
* at the document end. By default `false`
* @since 4.0.0-SNAPSHOT
*/
@NonNull
public HtmlPlugin allowNonClosedTags(boolean allowNonClosedTags) {
builder.allowNonClosedTags(allowNonClosedTags);
return this;
}
/**
* @since 4.0.0-SNAPSHOT
*/
@NonNull
public HtmlPlugin addHandler(@NonNull TagHandler tagHandler) {
builder.addHandler(tagHandler);
return this;
}
/**
* @since 4.0.0-SNAPSHOT
*/
@Nullable
public TagHandler getHandler(@NonNull String tagName) {
return builder.getHandler(tagName);
}
/**
* Indicate if HtmlPlugin should register default HTML tag handlers. Pass `true` to <strong>not</strong>
* include default handlers. By default default handlers are included. You can use
* {@link TagHandlerNoOp} to no-op certain default tags.
*
* @see TagHandlerNoOp
* @since 4.0.0-SNAPSHOT
*/
@NonNull
public HtmlPlugin excludeDefaults(boolean excludeDefaults) {
builder.excludeDefaults(excludeDefaults);
return this;
}
@Override
public void configureHtmlRenderer(@NonNull MarkwonHtmlRenderer.Builder builder) {
public void configureConfiguration(@NonNull MarkwonConfiguration.Builder builder) {
builder
.setHandler(
"img",
ImageHandler.create())
.setHandler(
"a",
new LinkHandler())
.setHandler(
"blockquote",
new BlockquoteHandler())
.setHandler(
"sub",
new SubScriptHandler())
.setHandler(
"sup",
new SuperScriptHandler())
.setHandler(
asList("b", "strong"),
new StrongEmphasisHandler())
.setHandler(
asList("s", "del"),
new StrikeHandler())
.setHandler(
asList("u", "ins"),
new UnderlineHandler())
.setHandler(
asList("ul", "ol"),
new ListHandler())
.setHandler(
asList("i", "em", "cite", "dfn"),
new EmphasisHandler())
.setHandler(
asList("h1", "h2", "h3", "h4", "h5", "h6"),
new HeadingHandler());
.htmlRenderer(this.builder.build())
.htmlParser(MarkwonHtmlParserImpl.create());
}
@Override

View File

@ -195,7 +195,6 @@ public class MarkwonHtmlParserImpl extends MarkwonHtmlParser {
}
}
//noinspection unchecked
action.apply(Collections.unmodifiableList((List<? extends Inline>) inlineTags));
inlineTags.clear();
} else {

View File

@ -3,19 +3,30 @@ package ru.noties.markwon.html;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import ru.noties.markwon.MarkwonVisitor;
import ru.noties.markwon.html.tag.BlockquoteHandler;
import ru.noties.markwon.html.tag.EmphasisHandler;
import ru.noties.markwon.html.tag.HeadingHandler;
import ru.noties.markwon.html.tag.ImageHandler;
import ru.noties.markwon.html.tag.LinkHandler;
import ru.noties.markwon.html.tag.ListHandler;
import ru.noties.markwon.html.tag.StrikeHandler;
import ru.noties.markwon.html.tag.StrongEmphasisHandler;
import ru.noties.markwon.html.tag.SubScriptHandler;
import ru.noties.markwon.html.tag.SuperScriptHandler;
import ru.noties.markwon.html.tag.UnderlineHandler;
class MarkwonHtmlRendererImpl extends MarkwonHtmlRenderer {
private final boolean allowNonClosedTags;
private final Map<String, TagHandler> tagHandlers;
@SuppressWarnings("WeakerAccess")
MarkwonHtmlRendererImpl(boolean allowNonClosedTags, @NonNull Map<String, TagHandler> tagHandlers) {
this.allowNonClosedTags = allowNonClosedTags;
this.tagHandlers = tagHandlers;
@ -86,58 +97,82 @@ class MarkwonHtmlRendererImpl extends MarkwonHtmlRenderer {
return tagHandlers.get(tagName);
}
static class BuilderImpl implements Builder {
static class Builder {
private final Map<String, TagHandler> tagHandlers = new HashMap<>(2);
private boolean allowNonClosedTags;
private boolean excludeDefaults;
@NonNull
@Override
public Builder allowNonClosedTags(boolean allowNonClosedTags) {
private boolean isBuilt;
void allowNonClosedTags(boolean allowNonClosedTags) {
checkState();
this.allowNonClosedTags = allowNonClosedTags;
return this;
}
@NonNull
@Override
public Builder setHandler(@NonNull String tagName, @Nullable TagHandler tagHandler) {
if (tagHandler == null) {
tagHandlers.remove(tagName);
} else {
tagHandlers.put(tagName, tagHandler);
void addHandler(@NonNull TagHandler tagHandler) {
checkState();
for (String tag : tagHandler.supportedTags()) {
tagHandlers.put(tag, tagHandler);
}
return this;
}
@NonNull
@Override
public Builder setHandler(@NonNull Collection<String> tagNames, @Nullable TagHandler tagHandler) {
if (tagHandler == null) {
for (String tagName : tagNames) {
tagHandlers.remove(tagName);
}
} else {
for (String tagName : tagNames) {
tagHandlers.put(tagName, tagHandler);
}
}
return this;
}
@Nullable
@Override
public TagHandler getHandler(@NonNull String tagName) {
TagHandler getHandler(@NonNull String tagName) {
checkState();
return tagHandlers.get(tagName);
}
public void excludeDefaults(boolean excludeDefaults) {
checkState();
this.excludeDefaults = excludeDefaults;
}
@NonNull
@Override
public MarkwonHtmlRenderer build() {
checkState();
isBuilt = true;
if (!excludeDefaults) {
// register default handlers, check if a handler is present already for specified tag
registerDefaultHandlers();
}
// okay, let's validate that we have at least one tagHandler registered
// if we have none -> return no-op implementation
return tagHandlers.size() > 0
? new MarkwonHtmlRendererImpl(allowNonClosedTags, Collections.unmodifiableMap(tagHandlers))
: new MarkwonHtmlRendererNoOp();
}
private void checkState() {
if (isBuilt) {
throw new IllegalStateException("Builder has been already built");
}
}
private void registerDefaultHandlers() {
add(ImageHandler.create());
add(new LinkHandler());
add(new BlockquoteHandler());
add(new SubScriptHandler());
add(new SuperScriptHandler());
add(new StrongEmphasisHandler());
add(new StrikeHandler());
add(new UnderlineHandler());
add(new ListHandler());
add(new EmphasisHandler());
add(new HeadingHandler());
}
private void add(@NonNull TagHandler tagHandler) {
for (String tag : tagHandler.supportedTags()) {
if (!tagHandlers.containsKey(tag)) {
tagHandlers.put(tag, tagHandler);
}
}
}
}
}

View File

@ -0,0 +1,43 @@
package ru.noties.markwon.html;
import android.support.annotation.NonNull;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import ru.noties.markwon.MarkwonVisitor;
/**
* @since 4.0.0-SNAPSHOT
*/
public class TagHandlerNoOp extends TagHandler {
@NonNull
public static TagHandlerNoOp create(@NonNull String tag) {
return new TagHandlerNoOp(Collections.singleton(tag));
}
@NonNull
public static TagHandlerNoOp create(@NonNull String... tags) {
return new TagHandlerNoOp(Arrays.asList(tags));
}
private final Collection<String> tags;
@SuppressWarnings("WeakerAccess")
TagHandlerNoOp(Collection<String> tags) {
this.tags = tags;
}
@Override
public void handle(@NonNull MarkwonVisitor visitor, @NonNull MarkwonHtmlRenderer renderer, @NonNull HtmlTag tag) {
// no op
}
@NonNull
@Override
public Collection<String> supportedTags() {
return tags;
}
}

View File

@ -4,6 +4,9 @@ import android.support.annotation.NonNull;
import org.commonmark.node.BlockQuote;
import java.util.Collection;
import java.util.Collections;
import ru.noties.markwon.MarkwonConfiguration;
import ru.noties.markwon.MarkwonVisitor;
import ru.noties.markwon.SpanFactory;
@ -35,4 +38,10 @@ public class BlockquoteHandler extends TagHandler {
);
}
}
@NonNull
@Override
public Collection<String> supportedTags() {
return Collections.singleton("blockquote");
}
}

View File

@ -5,6 +5,9 @@ import android.support.annotation.Nullable;
import org.commonmark.node.Emphasis;
import java.util.Arrays;
import java.util.Collection;
import ru.noties.markwon.MarkwonConfiguration;
import ru.noties.markwon.RenderProps;
import ru.noties.markwon.SpanFactory;
@ -23,4 +26,10 @@ public class EmphasisHandler extends SimpleTagHandler {
}
return spanFactory.getSpans(configuration, renderProps);
}
@NonNull
@Override
public Collection<String> supportedTags() {
return Arrays.asList("i", "em", "cite", "dfn");
}
}

View File

@ -5,6 +5,9 @@ import android.support.annotation.Nullable;
import org.commonmark.node.Heading;
import java.util.Arrays;
import java.util.Collection;
import ru.noties.markwon.MarkwonConfiguration;
import ru.noties.markwon.RenderProps;
import ru.noties.markwon.SpanFactory;
@ -41,4 +44,10 @@ public class HeadingHandler extends SimpleTagHandler {
return factory.getSpans(configuration, renderProps);
}
@NonNull
@Override
public Collection<String> supportedTags() {
return Arrays.asList("h1", "h2", "h3", "h4", "h5", "h6");
}
}

View File

@ -6,6 +6,8 @@ import android.text.TextUtils;
import org.commonmark.node.Image;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import ru.noties.markwon.MarkwonConfiguration;
@ -18,6 +20,12 @@ import ru.noties.markwon.image.ImageSize;
public class ImageHandler extends SimpleTagHandler {
@NonNull
@Override
public Collection<String> supportedTags() {
return Collections.singleton("img");
}
interface ImageSizeParser {
@Nullable
ImageSize parse(@NonNull Map<String, String> attributes);
@ -30,6 +38,7 @@ public class ImageHandler extends SimpleTagHandler {
private final ImageSizeParser imageSizeParser;
@SuppressWarnings("WeakerAccess")
ImageHandler(@NonNull ImageSizeParser imageSizeParser) {
this.imageSizeParser = imageSizeParser;
}

View File

@ -6,6 +6,9 @@ import android.text.TextUtils;
import org.commonmark.node.Link;
import java.util.Collection;
import java.util.Collections;
import ru.noties.markwon.MarkwonConfiguration;
import ru.noties.markwon.RenderProps;
import ru.noties.markwon.SpanFactory;
@ -30,4 +33,10 @@ public class LinkHandler extends SimpleTagHandler {
}
return null;
}
@NonNull
@Override
public Collection<String> supportedTags() {
return Collections.singleton("a");
}
}

View File

@ -4,6 +4,9 @@ import android.support.annotation.NonNull;
import org.commonmark.node.ListItem;
import java.util.Arrays;
import java.util.Collection;
import ru.noties.markwon.MarkwonConfiguration;
import ru.noties.markwon.MarkwonVisitor;
import ru.noties.markwon.RenderProps;
@ -65,6 +68,12 @@ public class ListHandler extends TagHandler {
}
}
@NonNull
@Override
public Collection<String> supportedTags() {
return Arrays.asList("ol", "ul");
}
private static int currentBulletListLevel(@NonNull HtmlTag.Block block) {
int level = 0;
while ((block = block.parent()) != null) {

View File

@ -3,6 +3,8 @@ package ru.noties.markwon.html.tag;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.util.Collection;
import ru.noties.markwon.MarkwonConfiguration;
import ru.noties.markwon.MarkwonVisitor;
import ru.noties.markwon.RenderProps;
@ -19,6 +21,11 @@ public abstract class SimpleTagHandler extends TagHandler {
@NonNull RenderProps renderProps,
@NonNull HtmlTag tag);
@NonNull
@Override
public abstract Collection<String> supportedTags();
@Override
public void handle(@NonNull MarkwonVisitor visitor, @NonNull MarkwonHtmlRenderer renderer, @NonNull HtmlTag tag) {
final Object spans = getSpans(visitor.configuration(), visitor.renderProps(), tag);

View File

@ -4,6 +4,9 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.style.StrikethroughSpan;
import java.util.Arrays;
import java.util.Collection;
import ru.noties.markwon.MarkwonConfiguration;
import ru.noties.markwon.MarkwonVisitor;
import ru.noties.markwon.SpanFactory;
@ -47,6 +50,12 @@ public class StrikeHandler extends TagHandler {
);
}
@NonNull
@Override
public Collection<String> supportedTags() {
return Arrays.asList("s", "del");
}
@Nullable
private static Object getMarkdownSpans(@NonNull MarkwonVisitor visitor) {
final MarkwonConfiguration configuration = visitor.configuration();

View File

@ -5,6 +5,9 @@ import android.support.annotation.Nullable;
import org.commonmark.node.StrongEmphasis;
import java.util.Arrays;
import java.util.Collection;
import ru.noties.markwon.MarkwonConfiguration;
import ru.noties.markwon.RenderProps;
import ru.noties.markwon.SpanFactory;
@ -23,4 +26,10 @@ public class StrongEmphasisHandler extends SimpleTagHandler {
}
return spanFactory.getSpans(configuration, renderProps);
}
@NonNull
@Override
public Collection<String> supportedTags() {
return Arrays.asList("b", "strong");
}
}

View File

@ -3,6 +3,9 @@ package ru.noties.markwon.html.tag;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.util.Collection;
import java.util.Collections;
import ru.noties.markwon.MarkwonConfiguration;
import ru.noties.markwon.RenderProps;
import ru.noties.markwon.html.HtmlTag;
@ -14,4 +17,10 @@ public class SubScriptHandler extends SimpleTagHandler {
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps renderProps, @NonNull HtmlTag tag) {
return new SubScriptSpan();
}
@NonNull
@Override
public Collection<String> supportedTags() {
return Collections.singleton("sub");
}
}

View File

@ -3,6 +3,9 @@ package ru.noties.markwon.html.tag;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.util.Collection;
import java.util.Collections;
import ru.noties.markwon.MarkwonConfiguration;
import ru.noties.markwon.RenderProps;
import ru.noties.markwon.html.HtmlTag;
@ -14,4 +17,10 @@ public class SuperScriptHandler extends SimpleTagHandler {
public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps renderProps, @NonNull HtmlTag tag) {
return new SuperScriptSpan();
}
@NonNull
@Override
public Collection<String> supportedTags() {
return Collections.singleton("sup");
}
}

View File

@ -3,6 +3,9 @@ package ru.noties.markwon.html.tag;
import android.support.annotation.NonNull;
import android.text.style.UnderlineSpan;
import java.util.Arrays;
import java.util.Collection;
import ru.noties.markwon.MarkwonVisitor;
import ru.noties.markwon.SpannableBuilder;
import ru.noties.markwon.html.HtmlTag;
@ -31,4 +34,10 @@ public class UnderlineHandler extends TagHandler {
tag.end()
);
}
@NonNull
@Override
public Collection<String> supportedTags() {
return Arrays.asList("u", "ins");
}
}