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"