Move HTML specifics to html module
This commit is contained in:
		
							parent
							
								
									f3476ca5cc
								
							
						
					
					
						commit
						df0177af95
					
				| @ -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 | ||||
| @ -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) { | ||||
|  | ||||
| @ -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(); | ||||
|  | ||||
| @ -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(); | ||||
|             } | ||||
|  | ||||
| @ -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> | ||||
|  | ||||
| @ -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(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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, | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -195,7 +195,6 @@ public class MarkwonHtmlParserImpl extends MarkwonHtmlParser { | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             //noinspection unchecked | ||||
|             action.apply(Collections.unmodifiableList((List<? extends Inline>) inlineTags)); | ||||
|             inlineTags.clear(); | ||||
|         } else { | ||||
|  | ||||
| @ -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); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -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; | ||||
|     } | ||||
| } | ||||
| @ -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"); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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"); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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"); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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; | ||||
|     } | ||||
|  | ||||
| @ -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"); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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) { | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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(); | ||||
|  | ||||
| @ -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"); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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"); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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"); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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"); | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dimitry Ivanov
						Dimitry Ivanov