diff --git a/framework/h/app.go b/framework/h/app.go index 2362348..0e02236 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -247,7 +247,7 @@ func writeHtml(w http.ResponseWriter, element Ren) error { return nil } w.Header().Set("Content-Type", "text/html") - _, err := fmt.Fprint(w, Render(element)) + _, err := fmt.Fprint(w, Render(element, WithDocType())) return err } diff --git a/framework/h/render.go b/framework/h/render.go index aa37dd5..bfce751 100644 --- a/framework/h/render.go +++ b/framework/h/render.go @@ -8,11 +8,33 @@ type Ren interface { Render(context *RenderContext) } -func Render(node Ren) string { +type RenderOptions struct { + doctype bool +} + +type RenderOpt func(context *RenderContext, opt *RenderOptions) + +func WithDocType() RenderOpt { + return func(context *RenderContext, opt *RenderOptions) { + opt.doctype = true + } +} + +func Render(node Ren, opts ...RenderOpt) string { builder := &strings.Builder{} context := &RenderContext{ builder: builder, } + options := &RenderOptions{} + + for _, opt := range opts { + opt(context, options) + } + + if options.doctype { + builder.WriteString("") + } + node.Render(context) return builder.String() } diff --git a/framework/h/render_test.go b/framework/h/render_test.go index dbbd1e1..83a4cf4 100644 --- a/framework/h/render_test.go +++ b/framework/h/render_test.go @@ -10,6 +10,14 @@ import ( "time" ) +func TestRendererShouldRenderDocType(t *testing.T) { + t.Parallel() + result := Render(Html( + Div(), + ), WithDocType()) + assert.Equal(t, `
`, result) +} + func TestSimpleRender(t *testing.T) { t.Parallel() result := Render(