Fix newline handling in markdownCellFormat

Fixes https://github.com/bazelbuild/stardoc/issues/6

RELNOTES: None.
PiperOrigin-RevId: 270938140
diff --git a/src/main/java/com/google/devtools/build/skydoc/rendering/MarkdownUtil.java b/src/main/java/com/google/devtools/build/skydoc/rendering/MarkdownUtil.java
index 67e6eca..decfb46 100644
--- a/src/main/java/com/google/devtools/build/skydoc/rendering/MarkdownUtil.java
+++ b/src/main/java/com/google/devtools/build/skydoc/rendering/MarkdownUtil.java
@@ -44,7 +44,9 @@
    *   <li>Transforms the string using {@link #htmlEscape}.
    *   <li>Transforms multline code (```) tags into preformatted code HTML tags.
    *   <li>Transforms single-tick code (`) tags into code HTML tags.
-   *   <li>Transforms newline characters into line break HTML tags.
+   *   <li>Transforms 'new paraphgraph' patterns (two or more sequential newline characters) into
+   *       line break HTML tags.
+   *   <li>Turns lingering new line tags into spaces (as they generally indicate intended line wrap.
    * </ul>
    */
   public String markdownCellFormat(String docString) {
@@ -53,7 +55,7 @@
     resultString = replaceWithTag(resultString, "```", "<pre><code>", "</code></pre>");
     resultString = replaceWithTag(resultString, "`", "<code>", "</code>");
 
-    return resultString.replace("\n", "<br>");
+    return resultString.replaceAll("\n(\\s*\n)+", "<br><br>").replace('\n', ' ');
   }
 
   private static String replaceWithTag(
diff --git a/src/test/java/com/google/devtools/build/skydoc/MarkdownRendererTest.java b/src/test/java/com/google/devtools/build/skydoc/MarkdownRendererTest.java
index 62c6997..8c02e99 100644
--- a/src/test/java/com/google/devtools/build/skydoc/MarkdownRendererTest.java
+++ b/src/test/java/com/google/devtools/build/skydoc/MarkdownRendererTest.java
@@ -99,11 +99,17 @@
         ProviderFieldInfo.newBuilder()
             .setName("one")
             .setDocString(
-                "This field <is totally> the `one`.\na **second** line.\n"
+                "This field <is totally> the `one`.\n"
+                    + "\n"
+                    + "a **second** line.\n"
+                    + "  \n"
+                    + "  \n"
                     + "For example:\n"
+                    + "\n"
                     + "```thisfield > otherfield\n"
                     + "  otherotherfield < thisfield```\n"
-                    + "Usage: `thisfield.<some method>`")
+                    + "\n"
+                    + "Usage: `thisfield.<some method>`\n")
             .build();
 
     ProviderInfo providerInfo =
@@ -129,9 +135,9 @@
                 + "| Name  | Description |\n"
                 + "| :-------------: | :-------------: |\n"
                 + "| one |  This field &lt;is totally&gt; the "
-                + "<code>one</code>.<br>a **second** line.<br>For example:<br>"
-                + "<pre><code>thisfield &gt; otherfield<br>  otherotherfield &lt;"
-                + " thisfield</code></pre><br>Usage: <code>thisfield.&lt;some "
+                + "<code>one</code>.<br><br>a **second** line.<br><br>For example:<br><br>"
+                + "<pre><code>thisfield &gt; otherfield   otherotherfield &lt;"
+                + " thisfield</code></pre><br><br>Usage: <code>thisfield.&lt;some "
                 + "method&gt;</code>    |\n");
   }