This is an automated email from the ASF dual-hosted git repository.

kwin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-doxia.git


The following commit(s) were added to refs/heads/master by this push:
     new 19afc816 MarkdownSink: Fix verbatim inside table cell
19afc816 is described below

commit 19afc8166ba66265862a43e2ecd4aad62daed07e
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&lt;a&gt;test&lt;/a&gt;</em></dd>" + EOL + "</dl>" + 
EOL + EOL;
+                + "<dd>prefix 
<code>code</code><em>suffix&lt;a&gt;test&lt;/a&gt;</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());
+    }
 }

Reply via email to