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("&#9;");
+                    literal = literal.substring(1);
+                    break;
+                }
+                case ' ': {
+                    writer.write("&#32;");
+                    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("&#10;");
+                } 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("&#9;foo\n");
+        assertRoundTrip("&#32;   foo\n");
+        assertRoundTrip("foo&#10;&#10;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