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 6fd45daa [DOXIA-692] Fix escaping of special characters (#143) 6fd45daa is described below commit 6fd45daa78aaf31842defccb9c8958007f91b159 Author: Konrad Windszus <k...@apache.org> AuthorDate: Sun Feb 12 10:31:23 2023 +0100 [DOXIA-692] Fix escaping of special characters (#143) --- .../maven/doxia/module/markdown/MarkdownSink.java | 25 ++++++++------ .../doxia/module/markdown/MarkdownSinkTest.java | 40 ++++++++-------------- 2 files changed, 30 insertions(+), 35 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 c5c7dcb1..b205eef8 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 @@ -933,7 +933,7 @@ public class MarkdownSink extends AbstractTextSink implements MarkdownMarkup { } /** - * Write Apt escaped text to output. + * Write Markdown escaped text to output. * * @param text The text to write. */ @@ -974,11 +974,12 @@ public class MarkdownSink extends AbstractTextSink implements MarkdownMarkup { * Escape special characters in a text in Markdown: * * <pre> - * \~, \=, \-, \+, \*, \[, \], \<, \>, \{, \}, \\ + * \, `, *, _, {, }, [, ], (, ), #, +, -, ., ! * </pre> * * @param text the String to escape, may be null * @return the text escaped, "" if null String input + * @see <a href="https://daringfireball.net/projects/markdown/syntax#backslash">Backslash Escapes</a> */ private static String escapeMarkdown(String text) { if (text == null) { @@ -990,18 +991,22 @@ public class MarkdownSink extends AbstractTextSink implements MarkdownMarkup { for (int i = 0; i < length; ++i) { char c = text.charAt(i); - switch (c) { // 0080 + switch (c) { case '\\': - case '~': - case '=': - case '+': + case '`': case '*': - case '[': - case ']': - case '<': - case '>': + case '_': case '{': case '}': + case '[': + case ']': + case '(': + case ')': + case '#': + case '+': + case '-': + case '.': + case '!': buffer.append('\\'); buffer.append(c); break; 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 cac89ac5..faee074d 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 @@ -54,7 +54,7 @@ public class MarkdownSinkTest extends AbstractSinkTest { /** {@inheritDoc} */ protected String getAuthorBlock(String author) { - return author; + return getEscapedText(author); } /** {@inheritDoc} */ @@ -144,14 +144,15 @@ public class MarkdownSinkTest extends AbstractSinkTest { /** {@inheritDoc} */ protected String getListBlock(String item) { - return EOL + EOL + Markup.SPACE + "" + MarkdownMarkup.LIST_START_MARKUP + "" + Markup.SPACE + item + EOL + EOL; + return EOL + EOL + Markup.SPACE + "" + MarkdownMarkup.LIST_START_MARKUP + "" + Markup.SPACE + + getEscapedText(item) + EOL + EOL; } /** {@inheritDoc} */ protected String getNumberedListBlock(String item) { return EOL + EOL + Markup.SPACE + "" + MarkdownMarkup.NUMBERING_LOWER_ROMAN_CHAR + "" - + Markup.SPACE + item + EOL + EOL; + + Markup.SPACE + getEscapedText(item) + EOL + EOL; } /** {@inheritDoc} */ @@ -164,7 +165,7 @@ public class MarkdownSinkTest extends AbstractSinkTest { protected String getFigureBlock(String source, String caption) { String figureBlock = "<img src=\"" + source + "\" />"; if (caption != null) { - figureBlock += caption + EOL; + figureBlock += getEscapedText(caption) + EOL; } return figureBlock; } @@ -298,27 +299,7 @@ public class MarkdownSinkTest extends AbstractSinkTest { /** {@inheritDoc} */ protected String getTextBlock(String text) { - // "\\~, \\=, \\-, \\+, \\*, \\[, \\], \\<, \\>, \\{, \\}, \\\\" - StringBuilder sb = new StringBuilder(); - sb.append(getSpecialCharacters('~')).append(",_"); - sb.append(getSpecialCharacters(Markup.EQUAL)).append(",_"); - sb.append(getSpecialCharacters(Markup.MINUS)).append(",_"); - sb.append(getSpecialCharacters(Markup.PLUS)).append(",_"); - sb.append(getSpecialCharacters(Markup.STAR)).append(",_"); - sb.append(getSpecialCharacters(Markup.LEFT_SQUARE_BRACKET)).append(",_"); - sb.append(getSpecialCharacters(Markup.RIGHT_SQUARE_BRACKET)).append(",_"); - sb.append(getSpecialCharacters(Markup.LESS_THAN)).append(",_"); - sb.append(getSpecialCharacters(Markup.GREATER_THAN)).append(",_"); - sb.append(getSpecialCharacters(Markup.LEFT_CURLY_BRACKET)).append(",_"); - sb.append(getSpecialCharacters(Markup.RIGHT_CURLY_BRACKET)).append(",_"); - sb.append(getSpecialCharacters(MarkdownMarkup.BACKSLASH)); - - return sb.toString(); - } - - @Override - public void testText() { - // TODO re-enable this test as inherited from parent + return getEscapedText(text); } /** {@inheritDoc} */ @@ -326,6 +307,15 @@ public class MarkdownSinkTest extends AbstractSinkTest { return text; } + /** + * Escapes special characters outlined in <a href="https://daringfireball.net/projects/markdown/syntax#backslash">Markdown Spec</a> + * @param text + * @return the text with all special characters escaped + */ + private String getEscapedText(String text) { + return text.replaceAll("\\\\|\\`|\\*|_|\\{|\\}|\\[|\\]|\\(|\\)|#|\\+|\\-|\\.|\\!", "\\\\$0"); + } + /** * Add a backslash for a special markup character *