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 ""
append 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