diff --git a/src/Html/HtmlParser.fs b/src/Html/HtmlParser.fs index c41fcb7a8..dd4184054 100644 --- a/src/Html/HtmlParser.fs +++ b/src/Html/HtmlParser.fs @@ -93,14 +93,18 @@ type HtmlNode = static member NewCData content = HtmlCData(content) override x.ToString() = + let isVoidElement = + let set = + [| "area"; "base"; "br"; "col"; "command"; "embed"; "hr"; "img"; "input" + "keygen"; "link"; "meta"; "param"; "source"; "track"; "wbr" |] + |> Set.ofArray + fun name -> Set.contains name set let rec serialize (sb:StringBuilder) indentation canAddNewLine html = let append (str:string) = sb.Append str |> ignore let appendEndTag name = append "" - let shouldAppendEndTag name = - name = "textarea" let newLine plus = sb.AppendLine() |> ignore String(' ', indentation + plus) |> append @@ -117,12 +121,11 @@ type HtmlNode = append "=\"" append value append "\"" - if elements.IsEmpty then - if shouldAppendEndTag name then - append ">" - appendEndTag name - else - append " />" + if isVoidElement name then + append " />" + elif elements.IsEmpty then + append ">" + appendEndTag name else append ">" if not onlyText then diff --git a/tests/FSharp.Data.Tests/HtmlParser.fs b/tests/FSharp.Data.Tests/HtmlParser.fs index 359cdf175..8e4a5abca 100644 --- a/tests/FSharp.Data.Tests/HtmlParser.fs +++ b/tests/FSharp.Data.Tests/HtmlParser.fs @@ -647,6 +647,19 @@ let ``Renders textarea closing tag``() = result |> should equal """""" +[] +let ``Renders self-closing tag for void elements``() = + [ "area"; "base"; "br"; "col"; "command"; "embed"; "hr"; "img"; "input" + "keygen"; "link"; "meta"; "param"; "source"; "track"; "wbr" ] + |> List.iter (fun name -> + let html = HtmlNode.NewElement name |> string + html |> should equal $"<%s{name} />") + +[] +let ``Renders no self-closing tag for non-void elements``() = + let html = HtmlNode.NewElement "foo" |> string + html |> should equal "" + [] let ``Can handle CDATA blocks``() = let cData = """ @@ -911,9 +924,9 @@ let ``Parsing non-html content doesn't cause an infinite loop - Github-1264``() [] let ``Can handle incomplete tags at end of file without creating an infinite loop``() = let result = HtmlDocument.Parse """ should equal expected \ No newline at end of file + result |> should equal expected