diff --git a/markwon/src/main/java/ru/noties/markwon/SpannableConfiguration.java b/markwon/src/main/java/ru/noties/markwon/SpannableConfiguration.java index cb2a34bc..5df9d316 100644 --- a/markwon/src/main/java/ru/noties/markwon/SpannableConfiguration.java +++ b/markwon/src/main/java/ru/noties/markwon/SpannableConfiguration.java @@ -51,6 +51,14 @@ public class SpannableConfiguration { this.htmlAllowNonClosedTags = builder.htmlAllowNonClosedTags; } + /** + * Returns a new builder based on this configuration + */ + @NonNull + public Builder newBuilder(@NonNull Context context) { + return new Builder(context, this); + } + @NonNull public SpannableTheme theme() { return theme; @@ -138,6 +146,21 @@ public class SpannableConfiguration { this.context = context; } + Builder(@NonNull Context context, @NonNull SpannableConfiguration configuration) { + this(context); + this.theme = configuration.theme; + this.asyncDrawableLoader = configuration.asyncDrawableLoader; + this.syntaxHighlight = configuration.syntaxHighlight; + this.linkResolver = configuration.linkResolver; + this.urlProcessor = configuration.urlProcessor; + this.imageSizeResolver = configuration.imageSizeResolver; + this.factory = configuration.factory; + this.softBreakAddsNewLine = configuration.softBreakAddsNewLine; + this.htmlParser = configuration.htmlParser; + this.htmlRenderer = configuration.htmlRenderer; + this.htmlAllowNonClosedTags = configuration.htmlAllowNonClosedTags; + } + @NonNull public Builder theme(@NonNull SpannableTheme theme) { this.theme = theme; diff --git a/markwon/src/test/java/ru/noties/markwon/renderer/SpannableConfigurationTest.java b/markwon/src/test/java/ru/noties/markwon/renderer/SpannableConfigurationTest.java new file mode 100644 index 00000000..daa70332 --- /dev/null +++ b/markwon/src/test/java/ru/noties/markwon/renderer/SpannableConfigurationTest.java @@ -0,0 +1,52 @@ +package ru.noties.markwon.renderer; + +import org.junit.Test; + +import ru.noties.markwon.SpannableConfiguration; +import ru.noties.markwon.SpannableFactory; +import ru.noties.markwon.SyntaxHighlight; +import ru.noties.markwon.UrlProcessor; +import ru.noties.markwon.html.api.MarkwonHtmlParser; +import ru.noties.markwon.renderer.html2.MarkwonHtmlRenderer; +import ru.noties.markwon.spans.AsyncDrawable; +import ru.noties.markwon.spans.LinkSpan; +import ru.noties.markwon.spans.SpannableTheme; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +public class SpannableConfigurationTest { + + @Test + public void testNewBuilder() { + final SpannableConfiguration configuration = SpannableConfiguration + .builder(null) + .theme(mock(SpannableTheme.class)) + .asyncDrawableLoader(mock(AsyncDrawable.Loader.class)) + .syntaxHighlight(mock(SyntaxHighlight.class)) + .linkResolver(mock(LinkSpan.Resolver.class)) + .urlProcessor(mock(UrlProcessor.class)) + .imageSizeResolver(mock(ImageSizeResolver.class)) + .factory(mock(SpannableFactory.class)) + .softBreakAddsNewLine(true) + .htmlParser(mock(MarkwonHtmlParser.class)) + .htmlRenderer(mock(MarkwonHtmlRenderer.class)) + .htmlAllowNonClosedTags(true) + .build(); + + final SpannableConfiguration newConfiguration = configuration + .newBuilder(null) + .build(); + + assertEquals(configuration.theme(), newConfiguration.theme()); + assertEquals(configuration.asyncDrawableLoader(), newConfiguration.asyncDrawableLoader()); + assertEquals(configuration.syntaxHighlight(), newConfiguration.syntaxHighlight()); + assertEquals(configuration.linkResolver(), newConfiguration.linkResolver()); + assertEquals(configuration.urlProcessor(), newConfiguration.urlProcessor()); + assertEquals(configuration.imageSizeResolver(), newConfiguration.imageSizeResolver()); + assertEquals(configuration.factory(), newConfiguration.factory()); + assertEquals(configuration.softBreakAddsNewLine(), newConfiguration.softBreakAddsNewLine()); + assertEquals(configuration.htmlParser(), newConfiguration.htmlParser()); + assertEquals(configuration.htmlRenderer(), newConfiguration.htmlRenderer()); + assertEquals(configuration.htmlAllowNonClosedTags(), newConfiguration.htmlAllowNonClosedTags()); + } +}