From 87d03793a85a63424c34df239a8aedbae9046223 Mon Sep 17 00:00:00 2001 From: Dimitry Ivanov Date: Tue, 16 May 2017 20:33:26 +0300 Subject: [PATCH] Packages refactoring (+ created Markwon class) --- .../java/ru/noties/markwon/MainActivity.java | 23 ++------ .../AsyncDrawableLoaderNoOp.java | 2 +- .../{renderer => }/DrawablesScheduler.java | 2 +- .../{renderer => }/LinkResolverDef.java | 2 +- .../main/java/ru/noties/markwon/Markwon.java | 57 +++++++++++++++++++ .../SpannableConfiguration.java | 3 +- .../{renderer => }/SyntaxHighlight.java | 3 +- .../{renderer => }/SyntaxHighlightNoOp.java | 2 +- .../renderer/SpannableMarkdownVisitor.java | 7 ++- .../markwon/renderer/SpannableRenderer.java | 11 +--- .../ru/noties/markwon/spans/ObjectsPool.java | 2 +- .../noties/markwon/view/MarkdownTextView.java | 2 +- 12 files changed, 79 insertions(+), 37 deletions(-) rename library-renderer/src/main/java/ru/noties/markwon/{renderer => }/AsyncDrawableLoaderNoOp.java (90%) rename library-renderer/src/main/java/ru/noties/markwon/{renderer => }/DrawablesScheduler.java (99%) rename library-renderer/src/main/java/ru/noties/markwon/{renderer => }/LinkResolverDef.java (96%) create mode 100644 library-renderer/src/main/java/ru/noties/markwon/Markwon.java rename library-renderer/src/main/java/ru/noties/markwon/{renderer => }/SpannableConfiguration.java (98%) rename library-renderer/src/main/java/ru/noties/markwon/{renderer => }/SyntaxHighlight.java (77%) rename library-renderer/src/main/java/ru/noties/markwon/{renderer => }/SyntaxHighlightNoOp.java (88%) diff --git a/app/src/main/java/ru/noties/markwon/MainActivity.java b/app/src/main/java/ru/noties/markwon/MainActivity.java index f6113a61..2aec835e 100644 --- a/app/src/main/java/ru/noties/markwon/MainActivity.java +++ b/app/src/main/java/ru/noties/markwon/MainActivity.java @@ -7,23 +7,19 @@ import android.support.annotation.NonNull; import android.text.method.LinkMovementMethod; import android.widget.TextView; -import org.commonmark.ext.gfm.strikethrough.StrikethroughExtension; -import org.commonmark.node.Node; -import org.commonmark.parser.Parser; - import java.io.IOException; import java.io.InputStream; -import java.util.Arrays; import java.util.Scanner; import ru.noties.debug.AndroidLogDebugOutput; import ru.noties.debug.Debug; -import ru.noties.markwon.renderer.SpannableConfiguration; -import ru.noties.markwon.renderer.SpannableRenderer; import ru.noties.markwon.spans.AsyncDrawable; public class MainActivity extends Activity { + // markdown, mdown, mkdn, mdwn, mkd, md + // markdown, mdown, mkdn, mkd, md, text + static { Debug.init(new AndroidLogDebugOutput(true)); } @@ -75,11 +71,8 @@ public class MainActivity extends Activity { } if (md != null) { + final long start = SystemClock.uptimeMillis(); - final Parser parser = new Parser.Builder() - .extensions(Arrays.asList(StrikethroughExtension.create())) - .build(); - final Node node = parser.parse(md); final SpannableConfiguration configuration = SpannableConfiguration.builder(MainActivity.this) .asyncDrawableLoader(new AsyncDrawable.Loader() { @@ -95,10 +88,7 @@ public class MainActivity extends Activity { }) .build(); - final CharSequence text = new SpannableRenderer().render( - configuration, - node - ); + final CharSequence text = Markwon.markdown(configuration, md); final long end = SystemClock.uptimeMillis(); Debug.i("Rendered: %d ms, length: %d", end - start, text.length()); @@ -109,8 +99,7 @@ public class MainActivity extends Activity { // NB! LinkMovementMethod forces frequent updates... textView.setMovementMethod(LinkMovementMethod.getInstance()); textView.setText(text); - SpannableRenderer.scheduleDrawables(textView); -// AsyncDrawableSpanUtils.scheduleDrawables(textView); + Markwon.scheduleDrawables(textView); } }); } diff --git a/library-renderer/src/main/java/ru/noties/markwon/renderer/AsyncDrawableLoaderNoOp.java b/library-renderer/src/main/java/ru/noties/markwon/AsyncDrawableLoaderNoOp.java similarity index 90% rename from library-renderer/src/main/java/ru/noties/markwon/renderer/AsyncDrawableLoaderNoOp.java rename to library-renderer/src/main/java/ru/noties/markwon/AsyncDrawableLoaderNoOp.java index 9e406150..6a568e3a 100644 --- a/library-renderer/src/main/java/ru/noties/markwon/renderer/AsyncDrawableLoaderNoOp.java +++ b/library-renderer/src/main/java/ru/noties/markwon/AsyncDrawableLoaderNoOp.java @@ -1,4 +1,4 @@ -package ru.noties.markwon.renderer; +package ru.noties.markwon; import android.support.annotation.NonNull; diff --git a/library-renderer/src/main/java/ru/noties/markwon/renderer/DrawablesScheduler.java b/library-renderer/src/main/java/ru/noties/markwon/DrawablesScheduler.java similarity index 99% rename from library-renderer/src/main/java/ru/noties/markwon/renderer/DrawablesScheduler.java rename to library-renderer/src/main/java/ru/noties/markwon/DrawablesScheduler.java index 2b2d50cf..c385b749 100644 --- a/library-renderer/src/main/java/ru/noties/markwon/renderer/DrawablesScheduler.java +++ b/library-renderer/src/main/java/ru/noties/markwon/DrawablesScheduler.java @@ -1,4 +1,4 @@ -package ru.noties.markwon.renderer; +package ru.noties.markwon; import android.graphics.Rect; import android.graphics.drawable.Drawable; diff --git a/library-renderer/src/main/java/ru/noties/markwon/renderer/LinkResolverDef.java b/library-renderer/src/main/java/ru/noties/markwon/LinkResolverDef.java similarity index 96% rename from library-renderer/src/main/java/ru/noties/markwon/renderer/LinkResolverDef.java rename to library-renderer/src/main/java/ru/noties/markwon/LinkResolverDef.java index a653e1bb..2ca4de56 100644 --- a/library-renderer/src/main/java/ru/noties/markwon/renderer/LinkResolverDef.java +++ b/library-renderer/src/main/java/ru/noties/markwon/LinkResolverDef.java @@ -1,4 +1,4 @@ -package ru.noties.markwon.renderer; +package ru.noties.markwon; import android.content.ActivityNotFoundException; import android.content.Context; diff --git a/library-renderer/src/main/java/ru/noties/markwon/Markwon.java b/library-renderer/src/main/java/ru/noties/markwon/Markwon.java new file mode 100644 index 00000000..70ce863f --- /dev/null +++ b/library-renderer/src/main/java/ru/noties/markwon/Markwon.java @@ -0,0 +1,57 @@ +package ru.noties.markwon; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.text.TextUtils; +import android.widget.TextView; + +import org.commonmark.ext.gfm.strikethrough.StrikethroughExtension; +import org.commonmark.node.Node; +import org.commonmark.parser.Parser; + +import java.util.Collections; + +import ru.noties.markwon.renderer.SpannableRenderer; + +@SuppressWarnings("WeakerAccess") +public abstract class Markwon { + + public static void scheduleDrawables(@NonNull TextView view) { + DrawablesScheduler.schedule(view); + } + + public static void unscheduleDrawables(@NonNull TextView view) { + DrawablesScheduler.unschedule(view); + } + + // with default configuration + public static CharSequence markdown(@NonNull Context context, @Nullable String text) { + final CharSequence out; + if (TextUtils.isEmpty(text)) { + out = null; + } else { + final SpannableConfiguration configuration = SpannableConfiguration.create(context); + out = markdown(configuration, text); + } + return out; + } + + public static CharSequence markdown(@NonNull SpannableConfiguration configuration, @Nullable String text) { + final CharSequence out; + if (TextUtils.isEmpty(text)) { + out = null; + } else { + final Parser parser = new Parser.Builder() + .extensions(Collections.singleton(StrikethroughExtension.create())) + .build(); + final Node node = parser.parse(text); + final SpannableRenderer renderer = new SpannableRenderer(); + out = renderer.render(configuration, node); + } + return out; + } + + private Markwon() { + } +} diff --git a/library-renderer/src/main/java/ru/noties/markwon/renderer/SpannableConfiguration.java b/library-renderer/src/main/java/ru/noties/markwon/SpannableConfiguration.java similarity index 98% rename from library-renderer/src/main/java/ru/noties/markwon/renderer/SpannableConfiguration.java rename to library-renderer/src/main/java/ru/noties/markwon/SpannableConfiguration.java index 8de774c6..835cc948 100644 --- a/library-renderer/src/main/java/ru/noties/markwon/renderer/SpannableConfiguration.java +++ b/library-renderer/src/main/java/ru/noties/markwon/SpannableConfiguration.java @@ -1,4 +1,4 @@ -package ru.noties.markwon.renderer; +package ru.noties.markwon; import android.content.Context; import android.support.annotation.NonNull; @@ -8,6 +8,7 @@ import ru.noties.markwon.spans.AsyncDrawable; import ru.noties.markwon.spans.LinkSpan; import ru.noties.markwon.spans.SpannableTheme; +@SuppressWarnings("WeakerAccess") public class SpannableConfiguration { // creates default configuration diff --git a/library-renderer/src/main/java/ru/noties/markwon/renderer/SyntaxHighlight.java b/library-renderer/src/main/java/ru/noties/markwon/SyntaxHighlight.java similarity index 77% rename from library-renderer/src/main/java/ru/noties/markwon/renderer/SyntaxHighlight.java rename to library-renderer/src/main/java/ru/noties/markwon/SyntaxHighlight.java index 4ab0b1dd..2f3b630f 100644 --- a/library-renderer/src/main/java/ru/noties/markwon/renderer/SyntaxHighlight.java +++ b/library-renderer/src/main/java/ru/noties/markwon/SyntaxHighlight.java @@ -1,8 +1,9 @@ -package ru.noties.markwon.renderer; +package ru.noties.markwon; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +@SuppressWarnings("WeakerAccess") public interface SyntaxHighlight { @NonNull diff --git a/library-renderer/src/main/java/ru/noties/markwon/renderer/SyntaxHighlightNoOp.java b/library-renderer/src/main/java/ru/noties/markwon/SyntaxHighlightNoOp.java similarity index 88% rename from library-renderer/src/main/java/ru/noties/markwon/renderer/SyntaxHighlightNoOp.java rename to library-renderer/src/main/java/ru/noties/markwon/SyntaxHighlightNoOp.java index 4df3b68e..84724513 100644 --- a/library-renderer/src/main/java/ru/noties/markwon/renderer/SyntaxHighlightNoOp.java +++ b/library-renderer/src/main/java/ru/noties/markwon/SyntaxHighlightNoOp.java @@ -1,4 +1,4 @@ -package ru.noties.markwon.renderer; +package ru.noties.markwon; import android.support.annotation.NonNull; import android.support.annotation.Nullable; diff --git a/library-renderer/src/main/java/ru/noties/markwon/renderer/SpannableMarkdownVisitor.java b/library-renderer/src/main/java/ru/noties/markwon/renderer/SpannableMarkdownVisitor.java index dd71605a..effe20fd 100644 --- a/library-renderer/src/main/java/ru/noties/markwon/renderer/SpannableMarkdownVisitor.java +++ b/library-renderer/src/main/java/ru/noties/markwon/renderer/SpannableMarkdownVisitor.java @@ -34,6 +34,7 @@ import java.util.ArrayDeque; import java.util.Deque; import ru.noties.debug.Debug; +import ru.noties.markwon.SpannableConfiguration; import ru.noties.markwon.renderer.html.SpannableHtmlParser; import ru.noties.markwon.spans.AsyncDrawable; import ru.noties.markwon.spans.AsyncDrawableSpan; @@ -47,7 +48,7 @@ import ru.noties.markwon.spans.OrderedListItemSpan; import ru.noties.markwon.spans.StrongEmphasisSpan; import ru.noties.markwon.spans.ThematicBreakSpan; -// please do not reuse between different texts (due to the html handling) +@SuppressWarnings("WeakerAccess") public class SpannableMarkdownVisitor extends AbstractVisitor { private static final String HTML_CONTENT = "<%1$s>%2$s"; @@ -120,7 +121,7 @@ public class SpannableMarkdownVisitor extends AbstractVisitor { final int length = builder.length(); // NB, in order to provide a _padding_ feeling code is wrapped inside two unbreakable spaces - // unfortunately we cannot use this for multiline code as we cannot control there a new line break will be inserted + // unfortunately we cannot use this for multiline code as we cannot control where a new line break will be inserted builder.append('\u00a0'); builder.append(code.getLiteral()); builder.append('\u00a0'); @@ -331,7 +332,7 @@ public class SpannableMarkdownVisitor extends AbstractVisitor { public void visit(HtmlInline htmlInline) { final SpannableHtmlParser htmlParser = configuration.htmlParser(); final SpannableHtmlParser.Tag tag = htmlParser.parseTag(htmlInline.getLiteral()); - Debug.i(tag); + if (tag != null) { final boolean voidTag = tag.voidTag(); diff --git a/library-renderer/src/main/java/ru/noties/markwon/renderer/SpannableRenderer.java b/library-renderer/src/main/java/ru/noties/markwon/renderer/SpannableRenderer.java index 32c81e6a..e20d0b63 100644 --- a/library-renderer/src/main/java/ru/noties/markwon/renderer/SpannableRenderer.java +++ b/library-renderer/src/main/java/ru/noties/markwon/renderer/SpannableRenderer.java @@ -3,21 +3,14 @@ package ru.noties.markwon.renderer; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.SpannableStringBuilder; -import android.widget.TextView; import org.commonmark.node.Node; +import ru.noties.markwon.SpannableConfiguration; + // please note that this class does not implement Renderer in order to return CharSequence (instead of String) public class SpannableRenderer { - public static void scheduleDrawables(@NonNull TextView view) { - DrawablesScheduler.schedule(view); - } - - public static void unscheduleDrawables(@NonNull TextView view) { - DrawablesScheduler.unschedule(view); - } - // todo // * LinkDrawableSpan, that draws link whilst image is still loading (it must be clickable...) // * Common interface for images (in markdown & inline-html) diff --git a/library-renderer/src/main/java/ru/noties/markwon/spans/ObjectsPool.java b/library-renderer/src/main/java/ru/noties/markwon/spans/ObjectsPool.java index 089abbea..bc56a9d4 100644 --- a/library-renderer/src/main/java/ru/noties/markwon/spans/ObjectsPool.java +++ b/library-renderer/src/main/java/ru/noties/markwon/spans/ObjectsPool.java @@ -4,7 +4,7 @@ import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; -class ObjectsPool { +abstract class ObjectsPool { // maybe it's premature optimization, but as all the drawing is done in one thread // and we apply needed values before actual drawing it's (I assume) safe to reuse some frequently used objects diff --git a/library-view/src/main/java/ru/noties/markwon/view/MarkdownTextView.java b/library-view/src/main/java/ru/noties/markwon/view/MarkdownTextView.java index df8f77b5..a229a859 100644 --- a/library-view/src/main/java/ru/noties/markwon/view/MarkdownTextView.java +++ b/library-view/src/main/java/ru/noties/markwon/view/MarkdownTextView.java @@ -13,7 +13,7 @@ import org.commonmark.parser.Parser; import java.util.Collections; -import ru.noties.markwon.renderer.SpannableConfiguration; +import ru.noties.markwon.SpannableConfiguration; import ru.noties.markwon.renderer.SpannableRenderer; public class MarkdownTextView extends TextView {