diff --git a/src/FSharp.Data.Html.Core/HtmlNode.fs b/src/FSharp.Data.Html.Core/HtmlNode.fs
index fa0f6c245..13485c6bb 100644
--- a/src/FSharp.Data.Html.Core/HtmlNode.fs
+++ b/src/FSharp.Data.Html.Core/HtmlNode.fs
@@ -114,7 +114,7 @@ type HtmlNode =
fun name -> Set.contains name set
- let rec serialize (sb: StringBuilder) indentation canAddNewLine html =
+ let rec serialize (sb: StringBuilder) indentation canAddNewLine insidePre html =
let append (str: string) = sb.Append str |> ignore
let appendEndTag name =
@@ -135,8 +135,9 @@ type HtmlNode =
| _ -> false)
let isPreTag = name = "pre"
+ let nowInsidePre = insidePre || isPreTag
- if canAddNewLine && not (onlyText || isPreTag) then
+ if canAddNewLine && not insidePre && not (onlyText || isPreTag) then
newLine 0
append "<"
@@ -157,16 +158,16 @@ type HtmlNode =
else
append ">"
- if not (onlyText || isPreTag) then
+ if not insidePre && not (onlyText || isPreTag) then
newLine 2
let mutable canAddNewLine = false
for element in elements do
- serialize sb (indentation + 2) canAddNewLine element
+ serialize sb (indentation + 2) canAddNewLine nowInsidePre element
canAddNewLine <- true
- if not (onlyText || isPreTag) then
+ if not insidePre && not (onlyText || isPreTag) then
newLine 0
appendEndTag name
@@ -181,7 +182,7 @@ type HtmlNode =
append "]]>"
let sb = StringBuilder()
- serialize sb 0 false x |> ignore
+ serialize sb 0 false false x |> ignore
sb.ToString()
///
diff --git a/tests/FSharp.Data.Core.Tests/HtmlParser.fs b/tests/FSharp.Data.Core.Tests/HtmlParser.fs
index 392628f2a..1f1a682ed 100644
--- a/tests/FSharp.Data.Core.Tests/HtmlParser.fs
+++ b/tests/FSharp.Data.Core.Tests/HtmlParser.fs
@@ -869,6 +869,18 @@ let ``Maintain whitespace inside pre tag through round-trip``() =
let expected = html
result |> should equal expected
+[]
+let ``Maintain whitespace in deeply nested elements inside pre through round-trip``() =
+ // Regression test for https://github.com/fsprojects/FSharp.Data/issues/1509
+ // Syntax highlighters (e.g. shiki) emit ...
+ // Without the insidePre fix, the nested multi-element spans would have newlines inserted between them.
+ let html = """let x = 1
"""
+
+ let result = HtmlDocument.Parse(html).ToString()
+
+ let expected = html
+ result |> should equal expected
+
[]
let ``Can parse national rail mobile site correctly``() =
HtmlDocument.Load "UKDepartures.html"