Unified html and image modules
This commit is contained in:
		
							parent
							
								
									dba07e3f3c
								
							
						
					
					
						commit
						4b918bf094
					
				| @ -6,7 +6,7 @@ org.gradle.configureondemand=true | ||||
| android.enableBuildCache=true | ||||
| android.buildCacheDir=build/pre-dex-cache | ||||
| 
 | ||||
| VERSION_NAME=3.1.0-SNAPSHOT | ||||
| VERSION_NAME=4.0.0-SNAPSHOT | ||||
| 
 | ||||
| GROUP=ru.noties.markwon | ||||
| POM_DESCRIPTION=Markwon markdown for Android | ||||
|  | ||||
| @ -10,6 +10,17 @@ 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; | ||||
| 
 | ||||
| /** | ||||
|  * @since 3.0.0 | ||||
| @ -73,9 +84,29 @@ public class HtmlPlugin extends AbstractMarkwonPlugin { | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void configureConfiguration(@NonNull MarkwonConfiguration.Builder builder) { | ||||
|         builder | ||||
|                 .htmlRenderer(this.builder.build()) | ||||
|     public void configureConfiguration(@NonNull MarkwonConfiguration.Builder configurationBuilder) { | ||||
| 
 | ||||
|         final MarkwonHtmlRendererImpl.Builder builder = this.builder; | ||||
| 
 | ||||
|         if (!builder.excludeDefaults()) { | ||||
|             // please note that it's better to not checkState for | ||||
|             // this method call (minor optimization), final `build` method call | ||||
|             // will check for the state and throw an exception if applicable | ||||
|             builder.addDefaultTagHandler(ImageHandler.create()); | ||||
|             builder.addDefaultTagHandler(new LinkHandler()); | ||||
|             builder.addDefaultTagHandler(new BlockquoteHandler()); | ||||
|             builder.addDefaultTagHandler(new SubScriptHandler()); | ||||
|             builder.addDefaultTagHandler(new SuperScriptHandler()); | ||||
|             builder.addDefaultTagHandler(new StrongEmphasisHandler()); | ||||
|             builder.addDefaultTagHandler(new StrikeHandler()); | ||||
|             builder.addDefaultTagHandler(new UnderlineHandler()); | ||||
|             builder.addDefaultTagHandler(new ListHandler()); | ||||
|             builder.addDefaultTagHandler(new EmphasisHandler()); | ||||
|             builder.addDefaultTagHandler(new HeadingHandler()); | ||||
|         } | ||||
| 
 | ||||
|         configurationBuilder | ||||
|                 .htmlRenderer(builder.build()) | ||||
|                 .htmlParser(MarkwonHtmlParserImpl.create()); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -9,17 +9,6 @@ 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 { | ||||
| 
 | ||||
| @ -127,6 +116,10 @@ class MarkwonHtmlRendererImpl extends MarkwonHtmlRenderer { | ||||
|             checkState(); | ||||
|             this.excludeDefaults = excludeDefaults; | ||||
|         } | ||||
|          | ||||
|         boolean excludeDefaults() { | ||||
|             return excludeDefaults; | ||||
|         } | ||||
| 
 | ||||
|         @NonNull | ||||
|         public MarkwonHtmlRenderer build() { | ||||
| @ -135,11 +128,6 @@ class MarkwonHtmlRendererImpl extends MarkwonHtmlRenderer { | ||||
| 
 | ||||
|             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 | ||||
| @ -153,21 +141,7 @@ class MarkwonHtmlRendererImpl extends MarkwonHtmlRenderer { | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         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) { | ||||
|         void addDefaultTagHandler(@NonNull TagHandler tagHandler) { | ||||
|             for (String tag : tagHandler.supportedTags()) { | ||||
|                 if (!tagHandlers.containsKey(tag)) { | ||||
|                     tagHandlers.put(tag, tagHandler); | ||||
|  | ||||
| @ -34,30 +34,36 @@ class AsyncDrawableLoaderBuilder { | ||||
|     } | ||||
| 
 | ||||
|     void executorService(@NonNull ExecutorService executorService) { | ||||
|         checkState(); | ||||
|         this.executorService = executorService; | ||||
|     } | ||||
| 
 | ||||
|     void addSchemeHandler(@NonNull SchemeHandler schemeHandler) { | ||||
|         checkState(); | ||||
|         for (String scheme : schemeHandler.supportedSchemes()) { | ||||
|             schemeHandlers.put(scheme, schemeHandler); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     void addMediaDecoder(@NonNull MediaDecoder mediaDecoder) { | ||||
|         checkState(); | ||||
|         for (String type : mediaDecoder.supportedTypes()) { | ||||
|             mediaDecoders.put(type, mediaDecoder); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     void defaultMediaDecoder(@Nullable MediaDecoder mediaDecoder) { | ||||
|         checkState(); | ||||
|         this.defaultMediaDecoder = mediaDecoder; | ||||
|     } | ||||
| 
 | ||||
|     void removeSchemeHandler(@NonNull String scheme) { | ||||
|         checkState(); | ||||
|         schemeHandlers.remove(scheme); | ||||
|     } | ||||
| 
 | ||||
|     void removeMediaDecoder(@NonNull String contentType) { | ||||
|         checkState(); | ||||
|         mediaDecoders.remove(contentType); | ||||
|     } | ||||
| 
 | ||||
| @ -65,6 +71,7 @@ class AsyncDrawableLoaderBuilder { | ||||
|      * @since 3.0.0 | ||||
|      */ | ||||
|     void placeholderProvider(@NonNull ImagesPlugin.PlaceholderProvider placeholderDrawableProvider) { | ||||
|         checkState(); | ||||
|         this.placeholderProvider = placeholderDrawableProvider; | ||||
|     } | ||||
| 
 | ||||
| @ -72,12 +79,15 @@ class AsyncDrawableLoaderBuilder { | ||||
|      * @since 3.0.0 | ||||
|      */ | ||||
|     void errorHandler(@NonNull ImagesPlugin.ErrorHandler errorHandler) { | ||||
|         checkState(); | ||||
|         this.errorHandler = errorHandler; | ||||
|     } | ||||
| 
 | ||||
|     @NonNull | ||||
|     AsyncDrawableLoader build() { | ||||
| 
 | ||||
|         checkState(); | ||||
| 
 | ||||
|         isBuilt = true; | ||||
| 
 | ||||
|         if (executorService == null) { | ||||
| @ -86,4 +96,11 @@ class AsyncDrawableLoaderBuilder { | ||||
| 
 | ||||
|         return new AsyncDrawableLoaderImpl(this); | ||||
|     } | ||||
| 
 | ||||
|     private void checkState() { | ||||
|         if (isBuilt) { | ||||
|             throw new IllegalStateException("ImagesPlugin has already been configured " + | ||||
|                     "and cannot be modified any further"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -72,7 +72,6 @@ public class ImagesPlugin extends AbstractMarkwonPlugin { | ||||
|      */ | ||||
|     @NonNull | ||||
|     public ImagesPlugin executorService(@NonNull ExecutorService executorService) { | ||||
|         checkBuilderState(); | ||||
|         builder.executorService(executorService); | ||||
|         return this; | ||||
|     } | ||||
| @ -87,7 +86,6 @@ public class ImagesPlugin extends AbstractMarkwonPlugin { | ||||
|      */ | ||||
|     @NonNull | ||||
|     public ImagesPlugin addSchemeHandler(@NonNull SchemeHandler schemeHandler) { | ||||
|         checkBuilderState(); | ||||
|         builder.addSchemeHandler(schemeHandler); | ||||
|         return this; | ||||
|     } | ||||
| @ -100,7 +98,6 @@ public class ImagesPlugin extends AbstractMarkwonPlugin { | ||||
|      */ | ||||
|     @NonNull | ||||
|     public ImagesPlugin addMediaDecoder(@NonNull MediaDecoder mediaDecoder) { | ||||
|         checkBuilderState(); | ||||
|         builder.addMediaDecoder(mediaDecoder); | ||||
|         return this; | ||||
|     } | ||||
| @ -114,7 +111,6 @@ public class ImagesPlugin extends AbstractMarkwonPlugin { | ||||
|      */ | ||||
|     @NonNull | ||||
|     public ImagesPlugin defaultMediaDecoder(@Nullable MediaDecoder mediaDecoder) { | ||||
|         checkBuilderState(); | ||||
|         builder.defaultMediaDecoder(mediaDecoder); | ||||
|         return this; | ||||
|     } | ||||
| @ -124,7 +120,6 @@ public class ImagesPlugin extends AbstractMarkwonPlugin { | ||||
|      */ | ||||
|     @NonNull | ||||
|     public ImagesPlugin removeSchemeHandler(@NonNull String scheme) { | ||||
|         checkBuilderState(); | ||||
|         builder.removeSchemeHandler(scheme); | ||||
|         return this; | ||||
|     } | ||||
| @ -134,7 +129,6 @@ public class ImagesPlugin extends AbstractMarkwonPlugin { | ||||
|      */ | ||||
|     @NonNull | ||||
|     public ImagesPlugin removeMediaDecoder(@NonNull String contentType) { | ||||
|         checkBuilderState(); | ||||
|         builder.removeMediaDecoder(contentType); | ||||
|         return this; | ||||
|     } | ||||
| @ -144,7 +138,6 @@ public class ImagesPlugin extends AbstractMarkwonPlugin { | ||||
|      */ | ||||
|     @NonNull | ||||
|     public ImagesPlugin placeholderProvider(@NonNull PlaceholderProvider placeholderProvider) { | ||||
|         checkBuilderState(); | ||||
|         builder.placeholderProvider(placeholderProvider); | ||||
|         return this; | ||||
|     } | ||||
| @ -155,14 +148,12 @@ public class ImagesPlugin extends AbstractMarkwonPlugin { | ||||
|      */ | ||||
|     @NonNull | ||||
|     public ImagesPlugin errorHandler(@NonNull ErrorHandler errorHandler) { | ||||
|         checkBuilderState(); | ||||
|         builder.errorHandler(errorHandler); | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void configureConfiguration(@NonNull MarkwonConfiguration.Builder builder) { | ||||
|         checkBuilderState(); | ||||
|         builder.asyncDrawableLoader(this.builder.build()); | ||||
|     } | ||||
| 
 | ||||
| @ -180,11 +171,4 @@ public class ImagesPlugin extends AbstractMarkwonPlugin { | ||||
|     public void afterSetText(@NonNull TextView textView) { | ||||
|         AsyncDrawableScheduler.schedule(textView); | ||||
|     } | ||||
| 
 | ||||
|     private void checkBuilderState() { | ||||
|         if (builder.isBuilt) { | ||||
|             throw new IllegalStateException("ImagesPlugin has already been configured " + | ||||
|                     "and cannot be modified any further"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -4,6 +4,6 @@ Use this module (or take a hint from it) if you would need _linkify_ capabilitie | ||||
| use `TextView.setAutolinkMask` (or specify `autolink` in XML) because it will remove all  | ||||
| existing links and keep only the ones it creates. | ||||
| 
 | ||||
| Please note that usage of this plugin introduces significant performance drop due not | ||||
| Please note that usage of this plugin introduces significant performance drop due to not | ||||
| optimal implementation of underlying `android.text.util.Linkify`. If you have any ideas of how | ||||
| to improve this - PR are welcome! | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dimitry Ivanov
						Dimitry Ivanov