From 359fd8699d2b147cb5a82a41c02df5fff525520c Mon Sep 17 00:00:00 2001
From: Dimitry Ivanov <mail@dimitryivanov.ru>
Date: Fri, 17 Aug 2018 17:10:51 +0300
Subject: [PATCH] Implement Appendable and CharSequence in SpannableBuilder

---
 .../ru/noties/markwon/SpannableBuilder.java   | 31 ++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/library/src/main/java/ru/noties/markwon/SpannableBuilder.java b/library/src/main/java/ru/noties/markwon/SpannableBuilder.java
index 5cc2420f..675cd433 100644
--- a/library/src/main/java/ru/noties/markwon/SpannableBuilder.java
+++ b/library/src/main/java/ru/noties/markwon/SpannableBuilder.java
@@ -14,11 +14,13 @@ import java.util.Iterator;
  * is using an array to store all the information about spans. So, a span that is added first
  * will be drawn first, which leads to subtle bugs (spans receive wrong `x` values when
  * requested to draw itself)
+ * <p>
+ * since 2.0.0 implements Appendable and CharSequence
  *
  * @since 1.0.1
  */
 @SuppressWarnings({"WeakerAccess", "unused"})
-public class SpannableBuilder {
+public class SpannableBuilder implements Appendable, CharSequence {
 
     // do not implement CharSequence (or any of Spanned interfaces)
 
@@ -51,12 +53,14 @@ public class SpannableBuilder {
     }
 
     @NonNull
+    @Override
     public SpannableBuilder append(char c) {
         builder.append(c);
         return this;
     }
 
     @NonNull
+    @Override
     public SpannableBuilder append(@NonNull CharSequence cs) {
 
         copySpans(length(), cs);
@@ -66,6 +70,21 @@ public class SpannableBuilder {
         return this;
     }
 
+    /**
+     * @since 2.0.0 to follow Appendable interface
+     */
+    @NonNull
+    @Override
+    public SpannableBuilder append(CharSequence csq, int start, int end) {
+
+        final CharSequence cs = csq.subSequence(start, end);
+        copySpans(length(), cs);
+
+        builder.append(cs.toString());
+
+        return this;
+    }
+
     @NonNull
     public SpannableBuilder append(@NonNull CharSequence cs, @NonNull Object span) {
         final int length = length();
@@ -98,14 +117,24 @@ public class SpannableBuilder {
         return this;
     }
 
+    @Override
     public int length() {
         return builder.length();
     }
 
+    @Override
     public char charAt(int index) {
         return builder.charAt(index);
     }
 
+    /**
+     * @since 2.0.0 to follow CharSequence interface
+     */
+    @Override
+    public CharSequence subSequence(int start, int end) {
+        return builder.subSequence(start, end);
+    }
+
     public char lastChar() {
         return builder.charAt(length() - 1);
     }