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

Ins extensions markdown renderer

parent 64eafc41
No related branches found
No related tags found
No related merge requests found
......@@ -3,16 +3,23 @@ package org.commonmark.ext.ins;
import org.commonmark.Extension;
import org.commonmark.ext.ins.internal.InsDelimiterProcessor;
import org.commonmark.ext.ins.internal.InsHtmlNodeRenderer;
import org.commonmark.ext.ins.internal.InsMarkdownNodeRenderer;
import org.commonmark.ext.ins.internal.InsTextContentNodeRenderer;
import org.commonmark.parser.Parser;
import org.commonmark.renderer.NodeRenderer;
import org.commonmark.renderer.html.HtmlNodeRendererContext;
import org.commonmark.renderer.html.HtmlNodeRendererFactory;
import org.commonmark.renderer.html.HtmlRenderer;
import org.commonmark.renderer.markdown.MarkdownNodeRendererContext;
import org.commonmark.renderer.markdown.MarkdownNodeRendererFactory;
import org.commonmark.renderer.markdown.MarkdownRenderer;
import org.commonmark.renderer.text.TextContentNodeRendererContext;
import org.commonmark.renderer.text.TextContentNodeRendererFactory;
import org.commonmark.renderer.text.TextContentRenderer;
import java.util.Collections;
import java.util.Set;
/**
* Extension for ins using ++
* <p>
......@@ -24,9 +31,7 @@ import org.commonmark.renderer.text.TextContentRenderer;
* The parsed ins text regions are turned into {@link Ins} nodes.
* </p>
*/
public class InsExtension implements Parser.ParserExtension,
HtmlRenderer.HtmlRendererExtension,
TextContentRenderer.TextContentRendererExtension {
public class InsExtension implements Parser.ParserExtension, HtmlRenderer.HtmlRendererExtension, TextContentRenderer.TextContentRendererExtension, MarkdownRenderer.MarkdownRendererExtension {
private InsExtension() {
}
......@@ -59,4 +64,21 @@ public class InsExtension implements Parser.ParserExtension,
}
});
}
@Override
public void extend(MarkdownRenderer.Builder rendererBuilder) {
rendererBuilder.nodeRendererFactory(new MarkdownNodeRendererFactory() {
@Override
public NodeRenderer create(MarkdownNodeRendererContext context) {
return new InsMarkdownNodeRenderer(context);
}
@Override
public Set<Character> getSpecialCharacters() {
// We technically don't need to escape single occurrences of +, but that's all the extension API
// exposes currently.
return Collections.singleton('+');
}
});
}
}
package org.commonmark.ext.ins.internal;
import org.commonmark.node.Node;
import org.commonmark.renderer.markdown.MarkdownNodeRendererContext;
import org.commonmark.renderer.markdown.MarkdownWriter;
public class InsMarkdownNodeRenderer extends InsNodeRenderer {
private final MarkdownNodeRendererContext context;
private final MarkdownWriter writer;
public InsMarkdownNodeRenderer(MarkdownNodeRendererContext context) {
this.context = context;
this.writer = context.getWriter();
}
@Override
public void render(Node node) {
writer.raw("++");
renderChildren(node);
writer.raw("++");
}
private void renderChildren(Node parent) {
Node node = parent.getFirstChild();
while (node != null) {
Node next = node.getNext();
context.render(node);
node = next;
}
}
}
package org.commonmark.ext.ins;
import org.commonmark.Extension;
import org.commonmark.parser.Parser;
import org.commonmark.renderer.markdown.MarkdownRenderer;
import org.junit.Test;
import java.util.Collections;
import java.util.Set;
import static org.junit.Assert.assertEquals;
public class InsMarkdownRendererTest {
private static final Set<Extension> EXTENSIONS = Collections.singleton(InsExtension.create());
private static final Parser PARSER = Parser.builder().extensions(EXTENSIONS).build();
private static final MarkdownRenderer RENDERER = MarkdownRenderer.builder().extensions(EXTENSIONS).build();
@Test
public void testStrikethrough() {
assertRoundTrip("++foo++\n");
assertRoundTrip("\\+\\+foo\\+\\+\n");
}
protected String render(String source) {
return RENDERER.render(PARSER.parse(source));
}
private void assertRoundTrip(String input) {
String rendered = render(input);
assertEquals(input, rendered);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment