From c58c31d5fd21b5906c2a6a7abf235062ea6a3ad0 Mon Sep 17 00:00:00 2001
From: Dimitry Ivanov <mail@dimitryivanov.ru>
Date: Mon, 24 Dec 2018 15:50:53 +0300
Subject: [PATCH] Add clear after markdown render action and
 SpannableBuilder#clear

---
 markwon/src/main/java/ru/noties/markwon/MarkwonImpl.java  | 8 +++++---
 .../src/main/java/ru/noties/markwon/MarkwonVisitor.java   | 5 +++++
 .../main/java/ru/noties/markwon/MarkwonVisitorImpl.java   | 6 ++++++
 .../src/main/java/ru/noties/markwon/SpannableBuilder.java | 8 ++++++++
 4 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/markwon/src/main/java/ru/noties/markwon/MarkwonImpl.java b/markwon/src/main/java/ru/noties/markwon/MarkwonImpl.java
index 8e2d8791..d9b74a25 100644
--- a/markwon/src/main/java/ru/noties/markwon/MarkwonImpl.java
+++ b/markwon/src/main/java/ru/noties/markwon/MarkwonImpl.java
@@ -63,10 +63,12 @@ class MarkwonImpl extends Markwon {
             plugin.afterRender(node, visitor);
         }
 
-        // clear render props after rending
-        renderProps.clearAll();
+        final Spanned spanned = visitor.builder().spannableStringBuilder();
 
-        return visitor.builder().spannableStringBuilder();
+        // clear render props and builder after rending
+        visitor.clear();
+
+        return spanned;
     }
 
     @NonNull
diff --git a/markwon/src/main/java/ru/noties/markwon/MarkwonVisitor.java b/markwon/src/main/java/ru/noties/markwon/MarkwonVisitor.java
index aec63444..01f9b819 100644
--- a/markwon/src/main/java/ru/noties/markwon/MarkwonVisitor.java
+++ b/markwon/src/main/java/ru/noties/markwon/MarkwonVisitor.java
@@ -88,6 +88,11 @@ public interface MarkwonVisitor extends Visitor {
      */
     void setSpans(int start, @Nullable Object spans);
 
+    /**
+     * Clears state of visitor (both {@link RenderProps} and {@link SpannableBuilder} will be cleared
+     */
+    void clear();
+
     /**
      * Helper method to obtain and apply spans for supplied Node. Internally queries {@link SpanFactory}
      * for the node (via {@link MarkwonSpansFactory#require(Node)} thus throwing an exception
diff --git a/markwon/src/main/java/ru/noties/markwon/MarkwonVisitorImpl.java b/markwon/src/main/java/ru/noties/markwon/MarkwonVisitorImpl.java
index 2616d843..4c4caff8 100644
--- a/markwon/src/main/java/ru/noties/markwon/MarkwonVisitorImpl.java
+++ b/markwon/src/main/java/ru/noties/markwon/MarkwonVisitorImpl.java
@@ -231,6 +231,12 @@ class MarkwonVisitorImpl implements MarkwonVisitor {
         SpannableBuilder.setSpans(builder, spans, start, builder.length());
     }
 
+    @Override
+    public void clear() {
+        renderProps.clearAll();
+        builder.clear();
+    }
+
     @Override
     public <N extends Node> void setSpansForNode(@NonNull N node, int start) {
         setSpans(start, configuration.spansFactory().require(node).getSpans(configuration, renderProps));
diff --git a/markwon/src/main/java/ru/noties/markwon/SpannableBuilder.java b/markwon/src/main/java/ru/noties/markwon/SpannableBuilder.java
index 556d7cc7..bd583311 100644
--- a/markwon/src/main/java/ru/noties/markwon/SpannableBuilder.java
+++ b/markwon/src/main/java/ru/noties/markwon/SpannableBuilder.java
@@ -325,6 +325,14 @@ public class SpannableBuilder implements Appendable, CharSequence {
         return reversed;
     }
 
+    /**
+     * @since 3.0.0
+     */
+    public void clear() {
+        builder.setLength(0);
+        spans.clear();
+    }
+
     private void copySpans(final int index, @Nullable CharSequence cs) {
 
         // we must identify already reversed Spanned...