diff --git a/markwon-core/src/main/java/io/noties/markwon/core/CorePlugin.java b/markwon-core/src/main/java/io/noties/markwon/core/CorePlugin.java index 194882e3..783dadc0 100644 --- a/markwon-core/src/main/java/io/noties/markwon/core/CorePlugin.java +++ b/markwon-core/src/main/java/io/noties/markwon/core/CorePlugin.java @@ -328,6 +328,9 @@ public class CorePlugin extends AbstractMarkwonPlugin { visitor.builder().append('\u00a0'); + // @since 4.1.1-SNAPSHOT + CoreProps.CODE_BLOCK_INFO.set(visitor.renderProps(), info); + visitor.setSpansForNodeOptional(node, length); if (visitor.hasNext(node)) { diff --git a/markwon-core/src/main/java/io/noties/markwon/core/CoreProps.java b/markwon-core/src/main/java/io/noties/markwon/core/CoreProps.java index 1da57e24..5b2140ed 100644 --- a/markwon-core/src/main/java/io/noties/markwon/core/CoreProps.java +++ b/markwon-core/src/main/java/io/noties/markwon/core/CoreProps.java @@ -19,6 +19,11 @@ public abstract class CoreProps { public static final Prop PARAGRAPH_IS_IN_TIGHT_LIST = Prop.of("paragraph-is-in-tight-list"); + /** + * @since 4.1.1-SNAPSHOT + */ + public static final Prop CODE_BLOCK_INFO = Prop.of("code-block-info"); + public enum ListItemType { BULLET, ORDERED diff --git a/markwon-core/src/test/java/io/noties/markwon/core/CorePluginTest.java b/markwon-core/src/test/java/io/noties/markwon/core/CorePluginTest.java index e21a8ded..4137b83e 100644 --- a/markwon-core/src/test/java/io/noties/markwon/core/CorePluginTest.java +++ b/markwon-core/src/test/java/io/noties/markwon/core/CorePluginTest.java @@ -1,10 +1,10 @@ package io.noties.markwon.core; +import android.text.method.MovementMethod; +import android.widget.TextView; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import android.text.method.MovementMethod; -import android.widget.ImageView; -import android.widget.TextView; import org.commonmark.node.BlockQuote; import org.commonmark.node.BulletList; @@ -38,15 +38,15 @@ import java.util.List; import java.util.Map; import java.util.Set; -import ix.Ix; -import ix.IxFunction; -import ix.IxPredicate; import io.noties.markwon.MarkwonConfiguration; import io.noties.markwon.MarkwonSpansFactory; import io.noties.markwon.MarkwonVisitor; import io.noties.markwon.RenderProps; import io.noties.markwon.SpanFactory; import io.noties.markwon.SpannableBuilder; +import ix.Ix; +import ix.IxFunction; +import ix.IxPredicate; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -54,6 +54,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.RETURNS_MOCKS; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -300,4 +301,45 @@ public class CorePluginTest { verify(textView, times(0)).setMovementMethod(any(MovementMethod.class)); } + + @Test + public void code_block_info_prop() { + final CorePlugin plugin = CorePlugin.create(); + final MarkwonVisitor.Builder builder = mock(MarkwonVisitor.Builder.class); + plugin.configureVisitor(builder); + + final ArgumentCaptor fencedCaptor = + ArgumentCaptor.forClass(MarkwonVisitor.NodeVisitor.class); + final ArgumentCaptor indendedCaptor = + ArgumentCaptor.forClass(MarkwonVisitor.NodeVisitor.class); + + //noinspection unchecked + verify(builder, times(1)).on(eq(FencedCodeBlock.class), fencedCaptor.capture()); + //noinspection unchecked + verify(builder, times(1)).on(eq(IndentedCodeBlock.class), indendedCaptor.capture()); + + final RenderProps renderProps = mock(RenderProps.class); + final MarkwonVisitor visitor = mock(MarkwonVisitor.class, RETURNS_MOCKS); + + when(visitor.renderProps()).thenReturn(renderProps); + + // fenced + { + final FencedCodeBlock block = new FencedCodeBlock(); + block.setInfo("testing-fenced"); + //noinspection unchecked + fencedCaptor.getValue().visit(visitor, block); + + verify(renderProps, times(1)).set(eq(CoreProps.CODE_BLOCK_INFO), eq("testing-fenced")); + } + + // indended + { + final IndentedCodeBlock block = new IndentedCodeBlock(); + //noinspection unchecked + indendedCaptor.getValue().visit(visitor, block); + + verify(renderProps, times(1)).set(eq(CoreProps.CODE_BLOCK_INFO), eq((String) null)); + } + } } \ No newline at end of file