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