Skip to content
Snippets Groups Projects
Commit 0c5ad6e1 authored by Robin Stocker's avatar Robin Stocker
Browse files

Use parsed delimiter for emphasis if available

parent 2966df11
No related branches found
No related tags found
No related merge requests found
...@@ -45,7 +45,7 @@ public class CoreMarkdownNodeRenderer extends AbstractVisitor implements NodeRen ...@@ -45,7 +45,7 @@ public class CoreMarkdownNodeRenderer extends AbstractVisitor implements NodeRen
this.context = context; this.context = context;
this.writer = context.getWriter(); this.writer = context.getWriter();
textEscape = AsciiMatcher.builder().anyOf("[]<>`*&\n\\").anyOf(context.getSpecialCharacters()).build(); textEscape = AsciiMatcher.builder().anyOf("[]<>`*_&\n\\").anyOf(context.getSpecialCharacters()).build();
textEscapeInHeading = AsciiMatcher.builder(textEscape).anyOf("#").build(); textEscapeInHeading = AsciiMatcher.builder(textEscape).anyOf("#").build();
} }
...@@ -282,8 +282,12 @@ public class CoreMarkdownNodeRenderer extends AbstractVisitor implements NodeRen ...@@ -282,8 +282,12 @@ public class CoreMarkdownNodeRenderer extends AbstractVisitor implements NodeRen
@Override @Override
public void visit(Emphasis emphasis) { public void visit(Emphasis emphasis) {
String delimiter = emphasis.getOpeningDelimiter();
// Use delimiter that was parsed if available
if (delimiter == null) {
// When emphasis is nested, a different delimiter needs to be used // When emphasis is nested, a different delimiter needs to be used
char delimiter = writer.getLastChar() == '*' ? '_' : '*'; delimiter = writer.getLastChar() == '*' ? "_" : "*";
}
writer.raw(delimiter); writer.raw(delimiter);
super.visit(emphasis); super.visit(emphasis);
writer.raw(delimiter); writer.raw(delimiter);
......
package org.commonmark.renderer.markdown; package org.commonmark.renderer.markdown;
import org.commonmark.node.Node; import org.commonmark.node.*;
import org.commonmark.parser.Parser; import org.commonmark.parser.Parser;
import org.junit.Test; import org.junit.Test;
...@@ -173,9 +173,21 @@ public class MarkdownRendererTest { ...@@ -173,9 +173,21 @@ public class MarkdownRendererTest {
// When nesting, a different delimiter needs to be used // When nesting, a different delimiter needs to be used
assertRoundTrip("*_foo_*\n"); assertRoundTrip("*_foo_*\n");
assertRoundTrip("*_*foo*_*\n"); assertRoundTrip("*_*foo*_*\n");
assertRoundTrip("_*foo*_\n");
// Not emphasis (needs * inside words) // Not emphasis (needs * inside words)
assertRoundTrip("foo_bar_\n"); assertRoundTrip("foo\\_bar\\_\n");
// Even when rendering a manually constructed tree, the emphasis delimiter needs to be chosen correctly.
Document doc = new Document();
Paragraph p = new Paragraph();
doc.appendChild(p);
Emphasis e1 = new Emphasis();
p.appendChild(e1);
Emphasis e2 = new Emphasis();
e1.appendChild(e2);
e2.appendChild(new Text("hi"));
assertEquals("*_hi_*\n", render(doc));
} }
@Test @Test
...@@ -226,17 +238,21 @@ public class MarkdownRendererTest { ...@@ -226,17 +238,21 @@ public class MarkdownRendererTest {
assertRoundTrip("foo\nbar\n"); assertRoundTrip("foo\nbar\n");
} }
private Node parse(String source) { private void assertRoundTrip(String input) {
return Parser.builder().build().parse(source); String rendered = parseAndRender(input);
assertEquals(input, rendered);
} }
private String render(String source) { private String parseAndRender(String source) {
Node parsed = parse(source); Node parsed = parse(source);
return MarkdownRenderer.builder().build().render(parsed); return render(parsed);
} }
private void assertRoundTrip(String input) { private Node parse(String source) {
String rendered = render(input); return Parser.builder().build().parse(source);
assertEquals(input, rendered); }
private String render(Node node) {
return MarkdownRenderer.builder().build().render(node);
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment