This is an automated email from the ASF dual-hosted git repository. kwin pushed a commit to branch bugfix/verbatim-inside-tablecell in repository https://gitbox.apache.org/repos/asf/maven-doxia.git
commit 78662f801fdb8cf5ce74098034567d0e84f5db2a Author: Konrad Windszus <[email protected]> AuthorDate: Mon Mar 9 21:01:42 2026 +0100 MarkdownSink: Fix verbatim inside table cell --- .../maven/doxia/module/markdown/MarkdownSink.java | 17 +++++++++++- .../doxia/module/markdown/MarkdownSinkTest.java | 31 +++++++++++++++++----- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/doxia-modules/doxia-module-markdown/src/main/java/org/apache/maven/doxia/module/markdown/MarkdownSink.java b/doxia-modules/doxia-module-markdown/src/main/java/org/apache/maven/doxia/module/markdown/MarkdownSink.java index 3a71b571..bda3edd6 100644 --- a/doxia-modules/doxia-module-markdown/src/main/java/org/apache/maven/doxia/module/markdown/MarkdownSink.java +++ b/doxia-modules/doxia-module-markdown/src/main/java/org/apache/maven/doxia/module/markdown/MarkdownSink.java @@ -93,6 +93,9 @@ public class MarkdownSink extends Xhtml5BaseSink implements MarkdownMarkup { private String figureSrc; + /** flag if the current verbatim block added a HTML context or not */ + private boolean isVerbatimHtmlContext; + @FunctionalInterface interface TextEscapeFunction { String escape(ElementContext context, LastTwoLinesAwareWriter writer, String text); @@ -127,7 +130,7 @@ public class MarkdownSink extends Xhtml5BaseSink implements MarkdownMarkup { // same parameters as BODY but paragraphs inside list items are handled differently LIST_ITEM(Type.CONTAINER_BLOCK, false, ElementContext::escapeMarkdown, false, INDENT), BLOCKQUOTE(Type.CONTAINER_BLOCK, false, ElementContext::escapeMarkdown, false, BLOCKQUOTE_START_MARKUP), - HTML_BLOCK(Type.LEAF_BLOCK, true, ElementContext::escapeHtml, false, "", true); + HTML_BLOCK(Type.GENERIC_CONTAINER, true, ElementContext::escapeHtml, false, "", false); /** * @see <a href="https://spec.commonmark.org/0.30/#blocks-and-inlines">CommonMark, 3 Blocks and inlines</a> @@ -723,6 +726,14 @@ public class MarkdownSink extends Xhtml5BaseSink implements MarkdownMarkup { @Override public void verbatim(SinkEventAttributes attributes) { + if (!elementContextStack.element().isContainer()) { + // markdown doesn't allow block elements but one can instead rely on html blocks for this + startContext(ElementContext.HTML_BLOCK); + isVerbatimHtmlContext = true; + } else { + isVerbatimHtmlContext = false; + } + if (elementContextStack.element().isHtml()) { super.verbatim(attributes); } else { @@ -741,6 +752,10 @@ public class MarkdownSink extends Xhtml5BaseSink implements MarkdownMarkup { public void verbatim_() { if (elementContextStack.element().isHtml()) { super.verbatim_(); + if (isVerbatimHtmlContext) { + endContext(ElementContext.HTML_BLOCK); + isVerbatimHtmlContext = false; + } } else { ensureBeginningOfLine(); write(getLinePrefix()); diff --git a/doxia-modules/doxia-module-markdown/src/test/java/org/apache/maven/doxia/module/markdown/MarkdownSinkTest.java b/doxia-modules/doxia-module-markdown/src/test/java/org/apache/maven/doxia/module/markdown/MarkdownSinkTest.java index 11c6d0e4..a626b526 100644 --- a/doxia-modules/doxia-module-markdown/src/test/java/org/apache/maven/doxia/module/markdown/MarkdownSinkTest.java +++ b/doxia-modules/doxia-module-markdown/src/test/java/org/apache/maven/doxia/module/markdown/MarkdownSinkTest.java @@ -149,7 +149,7 @@ class MarkdownSinkTest extends AbstractSinkTest { protected String getDefinitionListBlock(String definum, String definition) { // don't reuse constants from compile classes to improve accuracy of tests return "<dl>" + EOL + "<dt>" + getEscapedText(definum) + "</dt>" + EOL + "<dd>" + getEscapedText(definition) - + "</dd>" + EOL + "</dl>" + EOL + EOL; + + "</dd>" + EOL + "</dl>"; } protected String getFigureBlock(String source, String caption) { @@ -550,7 +550,7 @@ class MarkdownSinkTest extends AbstractSinkTest { sink.definitionList_(); } String expected = "<dl>" + EOL + "<dt>term</dt>" + EOL - + "<dd>prefix <code>code</code><em>suffix<a>test</a></em></dd>" + EOL + "</dl>" + EOL + EOL; + + "<dd>prefix <code>code</code><em>suffix<a>test</a></em></dd>" + EOL + "</dl>"; assertEquals(expected, getSinkContent(), "Wrong heading after inline element!"); } @@ -600,11 +600,8 @@ class MarkdownSinkTest extends AbstractSinkTest { sink.definition_(); sink.definitionList_(); } - String expected = "<dl>" + EOL - + "<dt>question1</dt>" + EOL - + "<dd><a href=\"#top\">[top]</a></dd>" + EOL - + "</dl>" + EOL - + EOL; + String expected = + "<dl>" + EOL + "<dt>question1</dt>" + EOL + "<dd><a href=\"#top\">[top]</a></dd>" + EOL + "</dl>"; assertEquals(expected, getSinkContent()); } @@ -690,4 +687,24 @@ class MarkdownSinkTest extends AbstractSinkTest { + EOL + EOL; assertEquals(expected, getSinkContent()); } + + @Test + void verbatimInTableCell() throws ParseException, IOException { + try (Sink sink = getSink()) { + sink.table(); + sink.tableRows(); + sink.tableRow(); + sink.tableCell(); + sink.verbatim(SinkEventAttributeSet.SOURCE); + sink.text("code with | and ` inside"); + sink.verbatim_(); + sink.tableCell_(); + sink.tableRow_(); + sink.tableRows_(); + sink.table_(); + } + String expected = + "| |" + EOL + "|---|" + EOL + "|<pre><code>code with | and ` inside</code></pre>|" + EOL + EOL; + assertEquals(expected, getSinkContent()); + } }
