commonmark-java
commonmark-java copied to clipboard
Stackoverflow while rendering ListItem
Steps to reproduce the problem (provide example Markdown if applicable):
#Title
List:
1. 2. 3. -> until some jvm limit
end
Expected behavior: it renders
Actual behavior:
java.lang.StackOverflowError: null
at java.base/java.util.LinkedList.addLast(Unknown Source)
at org.commonmark.renderer.text.TextContentWriter.pushTight(TextContentWriter.java:73)
at org.commonmark.renderer.text.CoreTextContentNodeRenderer.visit(CoreTextContentNodeRenderer.java:182)
at org.commonmark.node.OrderedList.accept(OrderedList.java:22)
at org.commonmark.renderer.text.CoreTextContentNodeRenderer.render(CoreTextContentNodeRenderer.java:54)
at org.commonmark.internal.renderer.NodeRendererMap.render(NodeRendererMap.java:30)
at org.commonmark.renderer.text.TextContentRenderer$RendererContext.render(TextContentRenderer.java:166)
at org.commonmark.renderer.text.CoreTextContentNodeRenderer.visitChildren(CoreTextContentNodeRenderer.java:215)
at org.commonmark.renderer.text.CoreTextContentNodeRenderer.visit(CoreTextContentNodeRenderer.java:167)
at org.commonmark.node.ListItem.accept(ListItem.java:15)
at org.commonmark.renderer.text.CoreTextContentNodeRenderer.render(CoreTextContentNodeRenderer.java:54)
at org.commonmark.internal.renderer.NodeRendererMap.render(NodeRendererMap.java:30)
at org.commonmark.renderer.text.TextContentRenderer$RendererContext.render(TextContentRenderer.java:166)
at org.commonmark.renderer.text.CoreTextContentNodeRenderer.visitChildren(CoreTextContentNodeRenderer.java:215)
at org.commonmark.renderer.text.CoreTextContentNodeRenderer.visit(CoreTextContentNodeRenderer.java:184)
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertAll;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import org.commonmark.node.Node;
import org.commonmark.parser.Parser;
import org.commonmark.renderer.text.LineBreakRendering;
import org.commonmark.renderer.text.TextContentRenderer;
import org.junit.jupiter.api.Test;
public class CommonMarkTest {
String parse(String markdown) {
Parser parser = Parser.builder() .build();
Node document = parser.parse(markdown);
TextContentRenderer renderer = TextContentRenderer.builder() //
.lineBreakRendering(LineBreakRendering.COMPACT) //
.build();
return renderer.render(document);
}
@Test
void listTest_inline_stackoverflow() {
String hugeListItem = IntStream.range(1, 3000) //
.mapToObj(i -> i + ".") //
.collect(Collectors.joining(" "));
assertThat(parse("""
List:
%s
end""".formatted(hugeListItem))) //
.isNotEmpty();
}
}