Skip to content

Commit eb24615

Browse files
committed
Enable adding own markdown renderers in builder
1 parent 9d1647f commit eb24615

File tree

2 files changed

+76
-3
lines changed

2 files changed

+76
-3
lines changed

commonmark/src/main/java/org/commonmark/renderer/markdown/MarkdownRenderer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,9 @@ private RendererContext(MarkdownWriter writer) {
136136
}
137137
additionalTextEscapes = Collections.unmodifiableSet(escapes);
138138

139-
// The first node renderer for a node type "wins".
140-
for (int i = nodeRendererFactories.size() - 1; i >= 0; i--) {
141-
MarkdownNodeRendererFactory nodeRendererFactory = nodeRendererFactories.get(i);
139+
// The first node renderer for a node type "wins". The NodeRendererMap
140+
// disallows overwriting.
141+
for (MarkdownNodeRendererFactory nodeRendererFactory : nodeRendererFactories) {
142142
// Pass in this as context here, which uses the fields set above
143143
NodeRenderer nodeRenderer = nodeRendererFactory.create(this);
144144
nodeRendererMap.add(nodeRenderer);
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package org.commonmark.renderer.markdown;
2+
3+
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.assertTrue;
5+
6+
import java.util.Set;
7+
8+
import org.commonmark.node.Heading;
9+
import org.commonmark.node.Node;
10+
import org.commonmark.parser.Parser;
11+
import org.commonmark.renderer.NodeRenderer;
12+
import org.junit.Test;
13+
14+
public class NodeRendererFactoriesTest {
15+
16+
@Test
17+
public void testAddedNodeRendererFactoryOverrides() {
18+
String input = "# Header";
19+
TestCoreMarkdownNodeRenderer.called = false;
20+
parseAndRender(input, new TestNodeRendererFactory());
21+
assertTrue(TestCoreMarkdownNodeRenderer.called);
22+
}
23+
24+
private void assertRoundTrip(String input, MarkdownNodeRendererFactory factory) {
25+
String rendered = parseAndRender(input, factory);
26+
assertEquals(input, rendered);
27+
}
28+
29+
private String parseAndRender(String source, MarkdownNodeRendererFactory factory) {
30+
Node parsed = parse(source);
31+
return render(parsed, factory);
32+
}
33+
34+
private Node parse(String source) {
35+
return Parser.builder().build().parse(source);
36+
}
37+
38+
private String render(Node node, MarkdownNodeRendererFactory factory) {
39+
return MarkdownRenderer.builder().nodeRendererFactory(factory).build().render(node);
40+
}
41+
42+
private static class TestNodeRendererFactory implements MarkdownNodeRendererFactory {
43+
@Override
44+
public NodeRenderer create(MarkdownNodeRendererContext context) {
45+
return new TestCoreMarkdownNodeRenderer(context);
46+
}
47+
48+
@Override
49+
public Set<Character> getSpecialCharacters() {
50+
return Set.of();
51+
}
52+
}
53+
54+
private static class TestCoreMarkdownNodeRenderer extends CoreMarkdownNodeRenderer {
55+
static boolean called = false;
56+
57+
public TestCoreMarkdownNodeRenderer(MarkdownNodeRendererContext context) {
58+
super(context);
59+
}
60+
61+
@Override
62+
public Set<Class<? extends Node>> getNodeTypes() {
63+
return super.getNodeTypes();
64+
}
65+
66+
@Override
67+
public void visit(Heading heading) {
68+
called = true;
69+
super.visit(heading);
70+
}
71+
}
72+
73+
}

0 commit comments

Comments
 (0)