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<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());
+ }
}