From 59d5c030969c57ce0f23b8eb619283cb2d7bf5ea Mon Sep 17 00:00:00 2001 From: Robin Stocker <robin@nibor.org> Date: Wed, 24 Jan 2024 14:53:33 +1100 Subject: [PATCH] Escape whitespace too (weird) --- .../renderer/markdown/CoreMarkdownNodeRenderer.java | 11 +++++++++++ .../commonmark/renderer/markdown/MarkdownWriter.java | 11 ++++++++--- .../renderer/markdown/MarkdownRendererTest.java | 5 +++++ .../renderer/markdown/SpecMarkdownRendererTest.java | 4 +++- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/commonmark/src/main/java/org/commonmark/renderer/markdown/CoreMarkdownNodeRenderer.java b/commonmark/src/main/java/org/commonmark/renderer/markdown/CoreMarkdownNodeRenderer.java index 11e7ae5f..20785111 100644 --- a/commonmark/src/main/java/org/commonmark/renderer/markdown/CoreMarkdownNodeRenderer.java +++ b/commonmark/src/main/java/org/commonmark/renderer/markdown/CoreMarkdownNodeRenderer.java @@ -364,6 +364,17 @@ public class CoreMarkdownNodeRenderer extends AbstractVisitor implements NodeRen writer.write("\\" + m.group(2)); literal = literal.substring(m.end()); } + break; + } + case '\t': { + writer.write("	"); + literal = literal.substring(1); + break; + } + case ' ': { + writer.write(" "); + literal = literal.substring(1); + break; } } } diff --git a/commonmark/src/main/java/org/commonmark/renderer/markdown/MarkdownWriter.java b/commonmark/src/main/java/org/commonmark/renderer/markdown/MarkdownWriter.java index d95c0bd8..ef294535 100644 --- a/commonmark/src/main/java/org/commonmark/renderer/markdown/MarkdownWriter.java +++ b/commonmark/src/main/java/org/commonmark/renderer/markdown/MarkdownWriter.java @@ -48,10 +48,15 @@ public class MarkdownWriter { try { for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); - if (ch == '\\' || escape.matches(ch)) { - buffer.append('\\'); + if (ch == '\n') { + // Can't escape this with \, use numeric character reference + buffer.append(" "); + } else { + if (ch == '\\' || escape.matches(ch)) { + buffer.append('\\'); + } + buffer.append(ch); } - buffer.append(ch); } } catch (IOException e) { throw new RuntimeException(e); diff --git a/commonmark/src/test/java/org/commonmark/renderer/markdown/MarkdownRendererTest.java b/commonmark/src/test/java/org/commonmark/renderer/markdown/MarkdownRendererTest.java index 6f9e1e6f..bc6d9b69 100644 --- a/commonmark/src/test/java/org/commonmark/renderer/markdown/MarkdownRendererTest.java +++ b/commonmark/src/test/java/org/commonmark/renderer/markdown/MarkdownRendererTest.java @@ -148,6 +148,11 @@ public class MarkdownRendererTest { assertRoundTrip("999\\. Foo\n"); assertRoundTrip("1\\.\n"); assertRoundTrip("1\\) Foo\n"); + + // Escaped whitespace, wow + assertRoundTrip("	foo\n"); + assertRoundTrip("  foo\n"); + assertRoundTrip("foo bar\n"); } @Test diff --git a/commonmark/src/test/java/org/commonmark/renderer/markdown/SpecMarkdownRendererTest.java b/commonmark/src/test/java/org/commonmark/renderer/markdown/SpecMarkdownRendererTest.java index 39269368..5df2e5c8 100644 --- a/commonmark/src/test/java/org/commonmark/renderer/markdown/SpecMarkdownRendererTest.java +++ b/commonmark/src/test/java/org/commonmark/renderer/markdown/SpecMarkdownRendererTest.java @@ -13,6 +13,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** @@ -62,8 +63,9 @@ public class SpecMarkdownRendererTest { System.out.println(); } - int expectedPassed = 650; + int expectedPassed = 652; assertTrue("Expected at least " + expectedPassed + " examples to pass but was " + passes.size(), passes.size() >= expectedPassed); + assertEquals(0, fails.size()); } private static void printCountsBySection(List<Example> examples) { -- GitLab