fix handling of doctypes
2 files changed, 38 insertions(+), 1 deletion(-)
changed files
M format.go → format.go
@@ -221,7 +221,14 @@ } if err = printChildren(w, n, false, level); err != nil { return } - case html.DoctypeNode, html.DocumentNode: + case html.DoctypeNode: + if _, err = fmt.Fprintf(w, "<!doctype %s>\n", n.Data); err != nil { + return + } + if err = printChildren(w, n, false, level); err != nil { + return + } + case html.DocumentNode: if err = printChildren(w, n, false, level); err != nil { return }
M format_test.go → format_test.go
@@ -120,3 +120,33 @@ } }) } } + +func TestFormatDocument(t *testing.T) { + tests := []struct { + name string + input string + expected string + }{ + { + name: "HTML5 doctype is preserved", + input: "<!doctype html><html><head></head><body></body></html>", + expected: "<!doctype html>\n<html>\n <head>\n </head> <body>\n </body>\n</html>\n", + }, + } + + for _, test := range tests { + test := test + t.Run(test.name, func(t *testing.T) { + t.Parallel() + + r := strings.NewReader(test.input) + w := new(strings.Builder) + if err := Document(w, r); err != nil { + t.Fatalf("failed to format: %v", err) + } + if diff := cmp.Diff(test.expected, w.String()); diff != "" { + t.Error(diff) + } + }) + } +}