diff --git a/markwon-core/src/main/java/ru/noties/markwon/SpannableBuilder.java b/markwon-core/src/main/java/ru/noties/markwon/SpannableBuilder.java index 0b99d05c..f0a6aa93 100644 --- a/markwon-core/src/main/java/ru/noties/markwon/SpannableBuilder.java +++ b/markwon-core/src/main/java/ru/noties/markwon/SpannableBuilder.java @@ -38,13 +38,9 @@ public class SpannableBuilder implements Appendable, CharSequence { return; } - if (spans.getClass().isArray()) { - for (Object o : ((Object[]) spans)) { - builder.setSpan(o, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - } - } else { - builder.setSpan(spans, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - } + // @since 3.0.1-SNAPSHOT we introduce another method that recursively applies spans + // allowing array of arrays (and more) + setSpansInternal(builder, spans, start, end); } } @@ -406,4 +402,24 @@ public class SpannableBuilder implements Appendable, CharSequence { super(text); } } + + /** + * @since 3.0.1-SNAPSHOT + */ + private static void setSpansInternal( + @NonNull SpannableBuilder builder, + @Nullable Object spans, + int start, + int end) { + if (spans != null) { + if (spans.getClass().isArray()) { + for (Object o : ((Object[]) spans)) { + // @since 3.0.1-SNAPSHOT recursively apply spans (allow array of arrays) + setSpansInternal(builder, o, start, end); + } + } else { + builder.setSpan(spans, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + } } diff --git a/markwon-core/src/test/java/ru/noties/markwon/SpannableBuilderTest.java b/markwon-core/src/test/java/ru/noties/markwon/SpannableBuilderTest.java index a1daf218..3535e19b 100644 --- a/markwon-core/src/test/java/ru/noties/markwon/SpannableBuilderTest.java +++ b/markwon-core/src/test/java/ru/noties/markwon/SpannableBuilderTest.java @@ -224,22 +224,30 @@ public class SpannableBuilderTest { assertTrue(builder.getSpans(0, builder.length()).isEmpty()); + final Object[] flatSpans = { + new Object(), + new Object(), + new Object(), + new Object(), + new Object() + }; + final Object[] spans = { new Object[]{ - new Object(), new Object() + flatSpans[0], flatSpans[1] }, new Object[]{ - new Object(), new Object(), new Object() + flatSpans[2], flatSpans[3], flatSpans[4] } }; setSpans(builder, spans, 0, 1); final List actual = builder.getSpans(0, builder.length()); - assertEquals(2, actual.size()); + assertEquals(flatSpans.length, actual.size()); for (int i = 0, length = spans.length; i < length; i++) { - assertEquals(spans[i], actual.get(i).what); + assertEquals(flatSpans[i], actual.get(i).what); } }