1717import java .io .Reader ;
1818import java .util .*;
1919
20-
2120/**
2221 * Parses input text to a tree of nodes.
2322 * <p>
@@ -32,6 +31,7 @@ public class Parser {
3231 private final List <BlockParserFactory > blockParserFactories ;
3332 private final List <InlineContentParserFactory > inlineContentParserFactories ;
3433 private final List <DelimiterProcessor > delimiterProcessors ;
34+ private final List <DelimiterProcessor > overrideDelimiterProcessors ;
3535 private final List <LinkProcessor > linkProcessors ;
3636 private final Set <Character > linkMarkers ;
3737 private final InlineParserFactory inlineParserFactory ;
@@ -45,6 +45,7 @@ private Parser(Builder builder) {
4545 this .postProcessors = builder .postProcessors ;
4646 this .inlineContentParserFactories = builder .inlineContentParserFactories ;
4747 this .delimiterProcessors = builder .delimiterProcessors ;
48+ this .overrideDelimiterProcessors = builder .overrideDelimiterProcessors ;
4849 this .linkProcessors = builder .linkProcessors ;
4950 this .linkMarkers = builder .linkMarkers ;
5051 this .includeSourceSpans = builder .includeSourceSpans ;
@@ -53,7 +54,8 @@ private Parser(Builder builder) {
5354 // Try to construct an inline parser. Invalid configuration might result in an exception, which we want to
5455 // detect as soon as possible.
5556 var context = new InlineParserContextImpl (
56- inlineContentParserFactories , delimiterProcessors , linkProcessors , linkMarkers , new Definitions ());
57+ inlineContentParserFactories , delimiterProcessors , overrideDelimiterProcessors ,
58+ linkProcessors , linkMarkers , new Definitions ());
5759 this .inlineParserFactory .create (context );
5860 }
5961
@@ -108,7 +110,7 @@ public Node parseReader(Reader input) throws IOException {
108110
109111 private DocumentParser createDocumentParser () {
110112 return new DocumentParser (blockParserFactories , inlineParserFactory , inlineContentParserFactories ,
111- delimiterProcessors , linkProcessors , linkMarkers , includeSourceSpans , maxOpenBlockParsers );
113+ delimiterProcessors , overrideDelimiterProcessors , linkProcessors , linkMarkers , includeSourceSpans , maxOpenBlockParsers );
112114 }
113115
114116 private Node postProcess (Node document ) {
@@ -125,6 +127,7 @@ public static class Builder {
125127 private final List <BlockParserFactory > blockParserFactories = new ArrayList <>();
126128 private final List <InlineContentParserFactory > inlineContentParserFactories = new ArrayList <>();
127129 private final List <DelimiterProcessor > delimiterProcessors = new ArrayList <>();
130+ private final List <DelimiterProcessor > overrideDelimiterProcessors = new ArrayList <>();
128131 private final List <LinkProcessor > linkProcessors = new ArrayList <>();
129132 private final List <PostProcessor > postProcessors = new ArrayList <>();
130133 private final Set <Character > linkMarkers = new HashSet <>();
@@ -273,6 +276,23 @@ public Builder customDelimiterProcessor(DelimiterProcessor delimiterProcessor) {
273276 return this ;
274277 }
275278
279+ /**
280+ * Add a delimiter processor that replaces the built-in processor for the same delimiter character.
281+ * <p>
282+ * This can be used to override core syntax such as emphasis and strong emphasis parsing.
283+ * The built-in processor for the same delimiter character and minimum length is replaced.
284+ * If a processor with the same delimiter character but a different minimum length exists, it is combined
285+ * using the standard staggered delimiter processor behavior.
286+ *
287+ * @param delimiterProcessor a delimiter processor implementation
288+ * @return {@code this}
289+ */
290+ public Builder overrideDelimiterProcessor (DelimiterProcessor delimiterProcessor ) {
291+ Objects .requireNonNull (delimiterProcessor , "delimiterProcessor must not be null" );
292+ overrideDelimiterProcessors .add (delimiterProcessor );
293+ return this ;
294+ }
295+
276296 /**
277297 * Add a custom link/image processor for inline parsing.
278298 * <p>
0 commit comments