This page collects the most important configuration options in one place.
Parser parser = Parser.builder().build();
The default parser is enough for standard Markdown.
Parser parser = Parser.builder()
.enabledBlockTypes(Set.of(Heading.class, ListBlock.class))
.build();
This is useful when you want to restrict what the parser recognizes.
Parser parser = Parser.builder()
.includeSourceSpans(IncludeSourceSpans.ALL)
.build();
This adds origin information to nodes for debugging or editor features.
Parser parser = Parser.builder()
.maxOpenBlockParsers(8)
.build();
This limits how many non-document block parsers may remain open at once.
Parser parser = Parser.builder()
.customBlockParserFactory(new MyBlockParserFactory())
.customInlineContentParserFactory(new MyInlineParserFactory())
.customDelimiterProcessor(new MyDelimiterProcessor())
.linkProcessor(new MyLinkProcessor())
.linkMarker('?')
.postProcessor(new MyPostProcessor())
.build();
This is the advanced hook path when the built-in Markdown rules are not enough.
HtmlRenderer renderer = HtmlRenderer.builder().build();
HtmlRenderer renderer = HtmlRenderer.builder()
.softbreak("<br>")
.escapeHtml(true)
.sanitizeUrls(true)
.urlSanitizer(new DefaultUrlSanitizer())
.percentEncodeUrls(true)
.omitSingleParagraphP(true)
.build();
HtmlRenderer renderer = HtmlRenderer.builder()
.attributeProviderFactory(context -> new MyAttributeProvider())
.build();
Use attribute providers when you need to add or adjust HTML attributes during rendering.
HtmlRenderer renderer = HtmlRenderer.builder()
.nodeRendererFactory(context -> new MyHtmlNodeRenderer(context))
.build();
Elemental2Renderer renderer = Elemental2Renderer.builder().build();
Elemental2Renderer renderer = Elemental2Renderer.builder()
.softBreakRendering(SoftBreakRendering.BR_ELEMENT)
.sanitizeUrls(true)
.urlSanitizer(new DefaultUrlSanitizer())
.percentEncodeUrls(true)
.omitSingleParagraphP(true)
.rawHtmlHandler(new RawHtmlHandler() {
@Override
public elemental2.dom.Node renderInline(String literal) {
return null;
}
@Override
public elemental2.dom.Node renderBlock(String literal) {
return null;
}
})
.build();
Elemental2Renderer renderer = Elemental2Renderer.builder()
.attributeProviderFactory(context -> new MyElementAttributeProvider())
.build();
Elemental2Renderer renderer = Elemental2Renderer.builder()
.nodeRendererFactory(context -> new MyElementNodeRenderer(context))
.build();
TextContentRenderer renderer = TextContentRenderer.builder().build();
TextContentRenderer renderer = TextContentRenderer.builder()
.lineBreakRendering(LineBreakRendering.COMPACT)
.build();
The older compatibility method is still available:
TextContentRenderer renderer = TextContentRenderer.builder()
.stripNewlines(false)
.build();
TextContentRenderer renderer = TextContentRenderer.builder()
.nodeRendererFactory(context -> new MyTextNodeRenderer(context))
.build();
MarkdownRenderer renderer = MarkdownRenderer.builder().build();
MarkdownRenderer renderer = MarkdownRenderer.builder()
.nodeRendererFactory(context -> new MyMarkdownNodeRenderer(context))
.build();
Use HTML when you need browser or server HTML output.
Use Elemental2 when you need browser-side DOM nodes.
Use plain text when you need readable extraction.
Use Markdown rendering when you need canonical Markdown output or round-trip tests.
Use the default builders first.
Register only the extensions you actually need.
Only after the default setup is working should you customize: