Skip to content

Commit

Permalink
TextContentRenderer: Fix overriding of core node rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
robinst committed Oct 6, 2024
1 parent 4634a00 commit cebb010
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -140,11 +140,9 @@ private class RendererContext implements TextContentNodeRendererContext {
private RendererContext(TextContentWriter textContentWriter) {
this.textContentWriter = textContentWriter;

// The first node renderer for a node type "wins".
for (int i = nodeRendererFactories.size() - 1; i >= 0; i--) {
TextContentNodeRendererFactory nodeRendererFactory = nodeRendererFactories.get(i);
NodeRenderer nodeRenderer = nodeRendererFactory.create(this);
nodeRendererMap.add(nodeRenderer);
for (var factory : nodeRendererFactories) {
var renderer = factory.create(this);
nodeRendererMap.add(renderer);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
package org.commonmark.test;

import org.commonmark.node.Link;
import org.commonmark.node.Node;
import org.commonmark.renderer.NodeRenderer;
import org.commonmark.renderer.text.LineBreakRendering;
import org.commonmark.renderer.text.TextContentNodeRendererContext;
import org.commonmark.renderer.text.TextContentNodeRendererFactory;
import org.commonmark.renderer.text.TextContentRenderer;
import org.commonmark.parser.Parser;
import org.commonmark.testutil.Asserts;
import org.junit.Test;

import java.util.Set;

import static org.junit.Assert.assertEquals;

public class TextContentRendererTest {
Expand Down Expand Up @@ -191,6 +198,41 @@ public void textContentHtml() {
assertAll(html, html);
}

@Test
public void testOverrideNodeRendering() {
var nodeRendererFactory = new TextContentNodeRendererFactory() {
@Override
public NodeRenderer create(TextContentNodeRendererContext context) {
return new NodeRenderer() {

@Override
public Set<Class<? extends Node>> getNodeTypes() {
return Set.of(Link.class);
}

@Override
public void render(Node node) {
context.getWriter().write('"');
renderChildren(node);
context.getWriter().write('"');
}

private void renderChildren(Node parent) {
Node node = parent.getFirstChild();
while (node != null) {
Node next = node.getNext();
context.render(node);
node = next;
}
}
};
}
};
var renderer = TextContentRenderer.builder().nodeRendererFactory(nodeRendererFactory).build();
var source = "Hi [Example](https://example.com)";
Asserts.assertRendering(source, "Hi \"Example\"", renderer.render(PARSER.parse(source)));
}

private void assertCompact(String source, String expected) {
var doc = PARSER.parse(source);
var actualRendering = COMPACT_RENDERER.render(doc);
Expand Down

0 comments on commit cebb010

Please sign in to comment.