This page explains how to render the AST into each supported output format.
HtmlRenderer is the most common renderer.
Parser parser = Parser.builder().build();
Node document = parser.parse("Hello **world**");
HtmlRenderer renderer = HtmlRenderer.builder().build();
String html = renderer.render(document);
StringBuilder out = new StringBuilder();
HtmlRenderer renderer = HtmlRenderer.builder().build();
renderer.render(document, out);
HtmlRenderer renderer = HtmlRenderer.builder()
.softbreak("<br>")
.build();
Soft line breaks are emitted as the fragment you choose.
HtmlRenderer renderer = HtmlRenderer.builder()
.escapeHtml(true)
.build();
When enabled, literal HTML nodes are escaped instead of interpreted as markup.
HtmlRenderer renderer = HtmlRenderer.builder()
.sanitizeUrls(true)
.build();
When enabled, links and images are passed through the configured UrlSanitizer before emission.
HtmlRenderer renderer = HtmlRenderer.builder()
.omitSingleParagraphP(true)
.build();
This is useful when the document contains one top-level paragraph and you want the rendered HTML without the wrapper <p>.
Elemental2Renderer renders directly into a detached DocumentFragment.
Parser parser = Parser.builder().build();
Node document = parser.parse("Hello **world**");
Elemental2Renderer renderer = Elemental2Renderer.builder().build();
DocumentFragment fragment = renderer.render(document);
The result is safe to insert into the DOM after rendering.
Elemental2Renderer renderer = Elemental2Renderer.builder()
.softBreakRendering(SoftBreakRendering.BR_ELEMENT)
.build();
Elemental2Renderer renderer = Elemental2Renderer.builder()
.rawHtmlHandler(new RawHtmlHandler() {
@Override
public elemental2.dom.Node renderInline(String literal) {
return null;
}
@Override
public elemental2.dom.Node renderBlock(String literal) {
return null;
}
})
.build();
Provide a handler when you want custom DOM behavior for raw HTML content.
Elemental2Renderer renderer = Elemental2Renderer.builder()
.sanitizeUrls(true)
.build();
TextContentRenderer extracts readable text.
Parser parser = Parser.builder().build();
Node document = parser.parse("Hello **world**");
TextContentRenderer renderer = TextContentRenderer.builder().build();
String text = renderer.render(document);
TextContentRenderer renderer = TextContentRenderer.builder()
.lineBreakRendering(LineBreakRendering.COMPACT)
.build();
The older stripNewlines(boolean) method still exists for compatibility, but lineBreakRendering is the preferred API.
MarkdownRenderer rebuilds canonical Markdown from the AST.
Parser parser = Parser.builder().build();
Node document = parser.parse("Hello **world**");
MarkdownRenderer renderer = MarkdownRenderer.builder().build();
String markdown = renderer.render(document);
Markdown rendering is semantic, not source-preserving.
That means:
You can register your own Markdown node renderer factory when you need to alter the emitted syntax.
MarkdownRenderer renderer = MarkdownRenderer.builder()
.nodeRendererFactory(context -> new MyMarkdownNodeRenderer(context))
.build();
Parser parser = Parser.builder().build();
Node document = parser.parse("""
# Title
Content here.
""");
String html = HtmlRenderer.builder().build().render(document);
String text = TextContentRenderer.builder().build().render(document);
String md = MarkdownRenderer.builder().build().render(document);
The same AST can feed:
String HTML outputThat is useful when you need previews, exports, and accessibility text from the same source.