Skip to content

Commit 55db441

Browse files
authored
Merge branch 'main' into patch-1
2 parents 762c2ad + fadbbe9 commit 55db441

File tree

5 files changed

+50
-5
lines changed

5 files changed

+50
-5
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
66
This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html),
77
with the exception that 0.x versions can break between minor versions.
88

9+
## [Unreleased]
10+
### Added
11+
### Changed
12+
### Fixed
13+
- `MarkdownRenderer`: Fix precedence for `nodeRendererFactory`: Factories passed
14+
to the builder can now override rendering for core node types.
15+
916
## [0.24.0] - 2024-10-21
1017
### Added
1118
- `SourceSpan` on nodes now have a `getInputIndex` to get the index within the
@@ -459,6 +466,7 @@ API breaking changes (caused by changes in spec):
459466
Initial release of commonmark-java, a port of commonmark.js with extensions
460467
for autolinking URLs, GitHub flavored strikethrough and tables.
461468
469+
[Unreleased]: https://github.com/commonmark/commonmark-java/compare/commonmark-parent-0.24.0...main
462470
[0.24.0]: https://github.com/commonmark/commonmark-java/compare/commonmark-parent-0.23.0...commonmark-parent-0.24.0
463471
[0.23.0]: https://github.com/commonmark/commonmark-java/compare/commonmark-parent-0.22.0...commonmark-parent-0.23.0
464472
[0.22.0]: https://github.com/commonmark/commonmark-java/compare/commonmark-parent-0.21.0...commonmark-parent-0.22.0

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,7 @@ Some users of this library (feel free to raise a PR if you want to be added):
450450
* [Gerrit](https://www.gerritcodereview.com/) code review/Gitiles ([link](https://gerrit-review.googlesource.com/c/gitiles/+/353794))
451451
* [Clerk](https://clerk.vision/) moldable live programming for Clojure
452452
* [Znai](https://github.com/testingisdocumenting/znai)
453+
* [Open Note](https://github.com/YangDai2003/OpenNote-Compose) a markdown editor and note-taking app for Android
453454
* [Quarkus Roq](https://github.com/quarkiverse/quarkus-roq/) The Roq Static Site Generator allows to easily create a static website or blog using Quarkus super-powers.
454455

455456
See also

commonmark/src/main/java/org/commonmark/internal/renderer/NodeRendererMap.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ public class NodeRendererMap {
1313
private final List<NodeRenderer> nodeRenderers = new ArrayList<>();
1414
private final Map<Class<? extends Node>, NodeRenderer> renderers = new HashMap<>(32);
1515

16+
/**
17+
* Set the renderer for each {@link NodeRenderer#getNodeTypes()}, unless there was already a renderer set (first wins).
18+
*/
1619
public void add(NodeRenderer nodeRenderer) {
1720
nodeRenderers.add(nodeRenderer);
1821
for (var nodeType : nodeRenderer.getNodeTypes()) {

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,10 @@ 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+
for (var factory : nodeRendererFactories) {
142140
// Pass in this as context here, which uses the fields set above
143-
NodeRenderer nodeRenderer = nodeRendererFactory.create(this);
144-
nodeRendererMap.add(nodeRenderer);
141+
var renderer = factory.create(this);
142+
nodeRendererMap.add(renderer);
145143
}
146144
}
147145

commonmark/src/test/java/org/commonmark/renderer/markdown/MarkdownRendererTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,14 @@
22

33
import org.commonmark.node.*;
44
import org.commonmark.parser.Parser;
5+
import org.commonmark.renderer.NodeRenderer;
6+
import org.commonmark.renderer.html.HtmlNodeRendererContext;
7+
import org.commonmark.renderer.html.HtmlNodeRendererFactory;
8+
import org.commonmark.renderer.html.HtmlRenderer;
59
import org.junit.Test;
610

11+
import java.util.Set;
12+
713
import static org.commonmark.testutil.Asserts.assertRendering;
814
import static org.junit.Assert.assertEquals;
915

@@ -300,6 +306,35 @@ public void testSoftLineBreaks() {
300306
assertRoundTrip("foo\nbar\n");
301307
}
302308

309+
@Test
310+
public void overrideNodeRender() {
311+
var nodeRendererFactory = new MarkdownNodeRendererFactory() {
312+
@Override
313+
public NodeRenderer create(MarkdownNodeRendererContext context) {
314+
return new NodeRenderer() {
315+
@Override
316+
public Set<Class<? extends Node>> getNodeTypes() {
317+
return Set.of(Heading.class);
318+
}
319+
320+
@Override
321+
public void render(Node node) {
322+
context.getWriter().raw("# Custom heading");
323+
}
324+
};
325+
}
326+
327+
@Override
328+
public Set<Character> getSpecialCharacters() {
329+
return Set.of();
330+
}
331+
};
332+
333+
MarkdownRenderer renderer = MarkdownRenderer.builder().nodeRendererFactory(nodeRendererFactory).build();
334+
String rendered = renderer.render(parse("# Hello"));
335+
assertEquals("# Custom heading\n", rendered);
336+
}
337+
303338
private void assertRoundTrip(String input) {
304339
String rendered = parseAndRender(input);
305340
assertEquals(input, rendered);

0 commit comments

Comments
 (0)