1
0

preformatted elements

This commit is contained in:
Arpad Ryszka 2025-10-29 21:04:07 +01:00
parent 70f7795400
commit effffeadf9
14 changed files with 344 additions and 188 deletions

View File

@ -13,6 +13,7 @@ tags: \
tag/void.block.gen.go \ tag/void.block.gen.go \
tag/void.inline.gen.go \ tag/void.inline.gen.go \
tag/inlinechildren.gen.go \ tag/inlinechildren.gen.go \
tag/preformatted.gen.go \
tag/script.gen.go tag/script.gen.go
go fmt tag/* go fmt tag/*
@ -34,6 +35,9 @@ tag/void.block.gen.go: $(SOURCES) tag.void.block.txt
tag/void.inline.gen.go: $(SOURCES) tag.void.inline.txt tag/void.inline.gen.go: $(SOURCES) tag.void.inline.txt
go run script/generate-tags.go Void Inline < tag.void.inline.txt > tag/void.inline.gen.go go run script/generate-tags.go Void Inline < tag.void.inline.txt > tag/void.inline.gen.go
tag/preformatted.gen.go: $(SOURCES) tag.preformatted.txt
go run script/generate-tags.go Preformatted < tag.preformatted.txt > tag/preformatted.gen.go
tag/script.gen.go: $(SOURCES) tag.script.txt tag/script.gen.go: $(SOURCES) tag.script.txt
go run script/generate-tags.go ScriptContent < tag.script.txt > tag/script.gen.go go run script/generate-tags.go ScriptContent < tag.script.txt > tag/script.gen.go

View File

@ -12,12 +12,16 @@ const unicodeNBSP = 0xa0
type escapeWriter struct { type escapeWriter struct {
out *bufio.Writer out *bufio.Writer
nonbreakSpaces bool
spaceStarted, lastSpace bool spaceStarted, lastSpace bool
err error err error
} }
func newEscapeWriter(out io.Writer) *escapeWriter { func newEscapeWriter(out io.Writer, nonbreakSpaces bool) *escapeWriter {
return &escapeWriter{out: bufio.NewWriter(out)} return &escapeWriter{
out: bufio.NewWriter(out),
nonbreakSpaces: nonbreakSpaces,
}
} }
func (w *escapeWriter) write(r ...rune) { func (w *escapeWriter) write(r ...rune) {
@ -59,7 +63,7 @@ func (w *escapeWriter) Write(p []byte) (int, error) {
continue continue
} }
space := r == ' ' space := w.nonbreakSpaces && r == ' '
switch { switch {
case space && w.spaceStarted: case space && w.spaceStarted:
w.write([]rune("&nbsp;&nbsp;")...) w.write([]rune("&nbsp;&nbsp;")...)
@ -106,9 +110,9 @@ func (w *escapeWriter) Flush() error {
return w.err return w.err
} }
func escape(s string) string { func escape(s string, nonbreakSpaces bool) string {
var b bytes.Buffer var b bytes.Buffer
w := newEscapeWriter(&b) w := newEscapeWriter(&b, nonbreakSpaces)
w.Write([]byte(s)) w.Write([]byte(s))
w.Flush() w.Flush()
return b.String() return b.String()

View File

@ -10,7 +10,7 @@ import (
func TestEscape(t *testing.T) { func TestEscape(t *testing.T) {
t.Run("attribute escape", func(t *testing.T) { t.Run("attribute escape", func(t *testing.T) {
var buf bytes.Buffer var buf bytes.Buffer
if err := html.Render(&buf, Div(Attr("foo", "\"bar\" & \"baz\""))); err != nil { if err := html.WriteRaw(&buf, Div(Attr("foo", "\"bar\" & \"baz\""))); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -21,7 +21,7 @@ func TestEscape(t *testing.T) {
t.Run("failing writer", func(t *testing.T) { t.Run("failing writer", func(t *testing.T) {
ew := &errorWriter{} ew := &errorWriter{}
if err := html.Render(ew, Span("foo bar baz")); err == nil { if err := html.WriteRaw(ew, Span("foo bar baz")); err == nil {
t.Fatal("failed to fail") t.Fatal("failed to fail")
} }
}) })
@ -30,7 +30,7 @@ func TestEscape(t *testing.T) {
b := []byte{'f', 0xc2, 'o', 'o'} b := []byte{'f', 0xc2, 'o', 'o'}
var buf bytes.Buffer var buf bytes.Buffer
if err := html.Render(&buf, Span(string(b))); err != nil { if err := html.WriteRaw(&buf, Span(string(b))); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -41,7 +41,7 @@ func TestEscape(t *testing.T) {
t.Run("multiple spaces", func(t *testing.T) { t.Run("multiple spaces", func(t *testing.T) {
var buf bytes.Buffer var buf bytes.Buffer
if err := html.Render(&buf, Span("foo bar")); err != nil { if err := html.WriteRaw(&buf, Span("foo bar")); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -52,7 +52,7 @@ func TestEscape(t *testing.T) {
t.Run("single space", func(t *testing.T) { t.Run("single space", func(t *testing.T) {
var buf bytes.Buffer var buf bytes.Buffer
if err := html.Render(&buf, Span("foo bar")); err != nil { if err := html.WriteRaw(&buf, Span("foo bar")); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -63,7 +63,7 @@ func TestEscape(t *testing.T) {
t.Run("tailing space", func(t *testing.T) { t.Run("tailing space", func(t *testing.T) {
var buf bytes.Buffer var buf bytes.Buffer
if err := html.Render(&buf, Span("foo ")); err != nil { if err := html.WriteRaw(&buf, Span("foo ")); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -74,7 +74,7 @@ func TestEscape(t *testing.T) {
t.Run("unicode non-break space", func(t *testing.T) { t.Run("unicode non-break space", func(t *testing.T) {
var buf bytes.Buffer var buf bytes.Buffer
if err := html.Render(&buf, Span(string([]rune{0xa0}))); err != nil { if err := html.WriteRaw(&buf, Span(string([]rune{0xa0}))); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -85,7 +85,7 @@ func TestEscape(t *testing.T) {
t.Run("html characters", func(t *testing.T) { t.Run("html characters", func(t *testing.T) {
var buf bytes.Buffer var buf bytes.Buffer
if err := html.Render(&buf, Span("<foo&bar>")); err != nil { if err := html.WriteRaw(&buf, Span("<foo&bar>")); err != nil {
t.Fatal(err) t.Fatal(err)
} }

29
lib.go
View File

@ -169,11 +169,11 @@ func Doctype(children ...any) Tag {
// String returns the rendered HTML text. // String returns the rendered HTML text.
// //
// It is meant to be used for debugging. Use the Render function to avoid buffering up an entire HTML document // It is meant to be used for debugging. Use the Write functions to avoid buffering up an entire HTML document
// as string. // as string.
func (t Tag) String() string { func (t Tag) String() string {
buf := bytes.NewBuffer(nil) buf := bytes.NewBuffer(nil)
Render(buf, t) WriteRaw(buf, t)
return buf.String() return buf.String()
} }
@ -295,6 +295,14 @@ func Children(t Tag) []any {
return c return c
} }
// Preformatted creates a new tag from t that will prevent changing the whitespaces of text content enclosed by
// a tag.
//
// The input tag remains unchanged.
func Preformatted(t Tag) Tag {
return t()(renderGuide{preformatted: true})
}
// Verbatim creates a new tag from t marking the new one verbatim. The content of verbatim tags is rendered // Verbatim creates a new tag from t marking the new one verbatim. The content of verbatim tags is rendered
// without HTML escaping. This may cause security issues when using it in an incosiderate way. Verbatim content // without HTML escaping. This may cause security issues when using it in an incosiderate way. Verbatim content
// gets indented when rendering with indentation. // gets indented when rendering with indentation.
@ -341,12 +349,12 @@ func Indent() Indentation {
return Indentation{Indent: "\t"} return Indentation{Indent: "\t"}
} }
// RenderIndent renders html with t as the root nodes using the specified indentation and wrapping. // WriteIndent renders html with t as the root nodes using the specified indentation and wrapping.
// //
// Non-tag child nodes are rendered via fmt.Sprint. Consecutive spaces are considered to be so on purpose, and // Non-tag child nodes are rendered via fmt.Sprint. Consecutive spaces are considered to be so on purpose, and
// are converted into &nbsp;. Spaces around tags, in special cases, can behave different from when using // are converted into &nbsp;. Spaces around tags, in special cases, can behave different from when using
// unindented rendering. // unindented rendering.
func RenderIndent(out io.Writer, indent Indentation, t ...Tag) error { func WriteIndent(out io.Writer, indent Indentation, t ...Tag) error {
if indent.PWidth < indent.MinPWidth { if indent.PWidth < indent.MinPWidth {
indent.PWidth = indent.MinPWidth indent.PWidth = indent.MinPWidth
} }
@ -378,9 +386,14 @@ func RenderIndent(out io.Writer, indent Indentation, t ...Tag) error {
return nil return nil
} }
// Render renders html with t as the root nodes without indentation or wrapping. // Write renders html with t as the root nodes with the default indentation and wrapping.
func Render(out io.Writer, t ...Tag) error { func Write(out io.Writer, t ...Tag) error {
return RenderIndent(out, Indentation{}, t...) return WriteIndent(out, Indent(), t...)
}
// WriteRaw renders html with t as the root nodes without indentation or wrapping.
func WriteRaw(out io.Writer, t ...Tag) error {
return WriteIndent(out, Indentation{}, t...)
} }
// Eq returns if one or more tags are considered equivalent. Equivalent nodes, in the most cases, will result in // Eq returns if one or more tags are considered equivalent. Equivalent nodes, in the most cases, will result in
@ -452,7 +465,7 @@ func MapChildren[Data any](data []Data, tag Tag) []any {
// Escape escapes HTML. // Escape escapes HTML.
func Escape(s string) string { func Escape(s string) string {
return escape(s) return escape(s, true)
} }
// EscapeAttribute escape attribute values. It does not escape single-quotes, because it assumes attribute // EscapeAttribute escape attribute values. It does not escape single-quotes, because it assumes attribute

View File

@ -42,7 +42,7 @@ func TestLib(t *testing.T) {
foo := html.Define("foo+bar") foo := html.Define("foo+bar")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, foo); err == nil { if err := html.WriteRaw(&b, foo); err == nil {
t.Fatal("failed to fail") t.Fatal("failed to fail")
} }
}) })
@ -143,7 +143,7 @@ func TestLib(t *testing.T) {
t.Run("invalid attribute name", func(t *testing.T) { t.Run("invalid attribute name", func(t *testing.T) {
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, Div(Attr("foo+bar", "baz"))); err == nil { if err := html.WriteRaw(&b, Div(Attr("foo+bar", "baz"))); err == nil {
t.Fatal() t.Fatal()
} }
}) })
@ -225,7 +225,7 @@ func TestLib(t *testing.T) {
} }
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, Div(tagChildren...)); err != nil { if err := html.WriteRaw(&b, Div(tagChildren...)); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -238,7 +238,7 @@ func TestLib(t *testing.T) {
tags := html.MapChildren([]string{"foo", "bar", "baz"}, Div) tags := html.MapChildren([]string{"foo", "bar", "baz"}, Div)
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, Div(tags...)); err != nil { if err := html.WriteRaw(&b, Div(tags...)); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -252,7 +252,7 @@ func TestLib(t *testing.T) {
div1 := div0("bar") div1 := div0("bar")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, Div(div0, div1)); err != nil { if err := html.WriteRaw(&b, Div(div0, div1)); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -265,7 +265,7 @@ func TestLib(t *testing.T) {
t.Run("render", func(t *testing.T) { t.Run("render", func(t *testing.T) {
t.Run("block", func(t *testing.T) { t.Run("block", func(t *testing.T) {
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), Div("foo")); err != nil { if err := html.Write(&b, Div("foo")); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -276,7 +276,7 @@ func TestLib(t *testing.T) {
t.Run("inline", func(t *testing.T) { t.Run("inline", func(t *testing.T) {
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), Span("foo")); err != nil { if err := html.Write(&b, Span("foo")); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -287,7 +287,7 @@ func TestLib(t *testing.T) {
t.Run("inline children", func(t *testing.T) { t.Run("inline children", func(t *testing.T) {
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), Div(P("foo"), P("bar"))); err != nil { if err := html.Write(&b, Div(P("foo"), P("bar"))); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -300,7 +300,7 @@ func TestLib(t *testing.T) {
inlineP := html.Inline(P) inlineP := html.Inline(P)
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), Div(inlineP("foo"), inlineP("bar"))); err != nil { if err := html.Write(&b, Div(inlineP("foo"), inlineP("bar"))); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -311,7 +311,7 @@ func TestLib(t *testing.T) {
t.Run("void", func(t *testing.T) { t.Run("void", func(t *testing.T) {
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, Br); err != nil { if err := html.WriteRaw(&b, Br); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -322,7 +322,7 @@ func TestLib(t *testing.T) {
t.Run("void with children", func(t *testing.T) { t.Run("void with children", func(t *testing.T) {
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, Br("foo")); err == nil { if err := html.WriteRaw(&b, Br("foo")); err == nil {
t.Fatal() t.Fatal()
} }
}) })
@ -331,7 +331,7 @@ func TestLib(t *testing.T) {
div := html.Verbatim(Div("foo &\nbar")) div := html.Verbatim(Div("foo &\nbar"))
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, div); err != nil { if err := html.WriteRaw(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -344,7 +344,7 @@ func TestLib(t *testing.T) {
div := html.Verbatim(Div("foo &\nbar")) div := html.Verbatim(Div("foo &\nbar"))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), div); err != nil { if err := html.Write(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -357,7 +357,7 @@ func TestLib(t *testing.T) {
script := Script("let foo = 42\nlet bar = 84") script := Script("let foo = 42\nlet bar = 84")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, script); err != nil { if err := html.WriteRaw(&b, script); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -370,7 +370,7 @@ func TestLib(t *testing.T) {
script := Script("let foo = 42\nlet bar = 84") script := Script("let foo = 42\nlet bar = 84")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), script); err != nil { if err := html.Write(&b, script); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -383,7 +383,7 @@ func TestLib(t *testing.T) {
script := html.Verbatim(Script("let foo = 42\nlet bar = 84")) script := html.Verbatim(Script("let foo = 42\nlet bar = 84"))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), script); err != nil { if err := html.Write(&b, script); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -398,7 +398,7 @@ func TestLib(t *testing.T) {
div := Div(div0, div1) div := Div(div0, div1)
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), div); err != nil { if err := html.Write(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -411,7 +411,7 @@ func TestLib(t *testing.T) {
p := P("foo bar baz") p := P("foo bar baz")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indentation{PWidth: 8, MinPWidth: 12}, p); err != nil { if err := html.WriteIndent(&b, html.Indentation{PWidth: 8, MinPWidth: 12}, p); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -424,7 +424,7 @@ func TestLib(t *testing.T) {
doc := Html(Body(P("foo bar baz"))) doc := Html(Body(P("foo bar baz")))
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, Doctype("html"), doc); err != nil { if err := html.WriteRaw(&b, Doctype("html"), doc); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -437,7 +437,7 @@ func TestLib(t *testing.T) {
doc := Html(Body(P("foo bar baz"))) doc := Html(Body(P("foo bar baz")))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), Doctype("html"), doc); err != nil { if err := html.Write(&b, Doctype("html"), doc); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -452,7 +452,7 @@ func TestLib(t *testing.T) {
double := func(i int) html.Tag { return Div(2 * i) } double := func(i int) html.Tag { return Div(2 * i) }
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, double(42)); err != nil { if err := html.WriteRaw(&b, double(42)); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -510,7 +510,7 @@ func TestLib(t *testing.T) {
} }
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), teamHTML(myTeam)); err != nil { if err := html.Write(&b, teamHTML(myTeam)); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -558,7 +558,7 @@ func TestLib(t *testing.T) {
double = double("foo") double = double("foo")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, double); err != nil { if err := html.WriteRaw(&b, double); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -572,7 +572,7 @@ func TestLib(t *testing.T) {
double = double(42, 84) double = double(42, 84)
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, double); err != nil { if err := html.WriteRaw(&b, double); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -587,7 +587,7 @@ func TestLib(t *testing.T) {
double1 := double0("foo") double1 := double0("foo")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, Div(double0, double1)); err != nil { if err := html.WriteRaw(&b, Div(double0, double1)); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -602,7 +602,7 @@ func TestLib(t *testing.T) {
comment := Comment("foo &\nbar") comment := Comment("foo &\nbar")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), comment); err != nil { if err := html.Write(&b, comment); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -615,7 +615,7 @@ func TestLib(t *testing.T) {
doctype := Doctype("html") doctype := Doctype("html")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), doctype); err != nil { if err := html.Write(&b, doctype); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -628,7 +628,7 @@ func TestLib(t *testing.T) {
doctype := Doctype("html", "public", "-//W3C//DTD HTML 4.01//EN", "http://www.w3.org/TR/html4/strict.dtd") doctype := Doctype("html", "public", "-//W3C//DTD HTML 4.01//EN", "http://www.w3.org/TR/html4/strict.dtd")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), doctype); err != nil { if err := html.Write(&b, doctype); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -645,7 +645,7 @@ func TestLib(t *testing.T) {
cdata := html.FromTemplate(cdataTemplate) cdata := html.FromTemplate(cdataTemplate)
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, cdata("foo &\nbar")); err != nil { if err := html.WriteRaw(&b, cdata("foo &\nbar")); err != nil {
t.Fatal(err) t.Fatal(err)
} }

View File

@ -21,7 +21,7 @@ func TestQuery(t *testing.T) {
} }
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, inlineDiv); err != nil { if err := html.WriteRaw(&b, inlineDiv); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -109,7 +109,7 @@ func TestQuery(t *testing.T) {
div := Div(Span("foo")) div := Div(Span("foo"))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), div); err != nil { if err := html.Write(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -123,7 +123,7 @@ func TestQuery(t *testing.T) {
script := Script(`function() { return "Hello, world!" }`) script := Script(`function() { return "Hello, world!" }`)
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, script); err != nil { if err := html.WriteRaw(&b, script); err != nil {
t.Fatal(err) t.Fatal(err)
} }
}) })
@ -132,7 +132,7 @@ func TestQuery(t *testing.T) {
div := Div(Attr("foo+", "bar")) div := Div(Attr("foo+", "bar"))
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, div); err == nil { if err := html.WriteRaw(&b, div); err == nil {
t.Fatal() t.Fatal()
} }
}) })
@ -141,7 +141,7 @@ func TestQuery(t *testing.T) {
div := Div(Div(Attr("foo+", "bar"))) div := Div(Div(Attr("foo+", "bar")))
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, div); err == nil { if err := html.WriteRaw(&b, div); err == nil {
t.Fatal() t.Fatal()
} }
}) })

View File

@ -13,6 +13,7 @@ type renderGuide struct {
inlineChildren bool inlineChildren bool
void bool void bool
script bool script bool
preformatted bool
verbatim bool verbatim bool
} }
@ -32,6 +33,7 @@ func mergeRenderingGuides(rgs []renderGuide) renderGuide {
rg.inlineChildren = rg.inlineChildren || rgi.inlineChildren rg.inlineChildren = rg.inlineChildren || rgi.inlineChildren
rg.void = rg.void || rgi.void rg.void = rg.void || rgi.void
rg.script = rg.script || rgi.script rg.script = rg.script || rgi.script
rg.preformatted = rg.preformatted || rgi.preformatted
rg.verbatim = rg.verbatim || rgi.verbatim rg.verbatim = rg.verbatim || rgi.verbatim
} }
@ -74,12 +76,12 @@ func (r *renderer) clearWrapper() {
r.out = r.originalOut r.out = r.originalOut
} }
func (r *renderer) writeEscaped(s string) { func (r *renderer) writeEscaped(s string, nonbreakSpaces bool) {
if r.err != nil { if r.err != nil {
return return
} }
ew := newEscapeWriter(r.out) ew := newEscapeWriter(r.out, nonbreakSpaces)
if _, r.err = ew.Write([]byte(s)); r.err != nil { if _, r.err = ew.Write([]byte(s)); r.err != nil {
return return
} }
@ -87,12 +89,12 @@ func (r *renderer) writeEscaped(s string) {
r.err = ew.Flush() r.err = ew.Flush()
} }
func (r *renderer) copyEscaped(rd io.Reader) { func (r *renderer) copyEscaped(rd io.Reader, nonbreakSpaces bool) {
if r.err != nil { if r.err != nil {
return return
} }
ew := newEscapeWriter(r.out) ew := newEscapeWriter(r.out, nonbreakSpaces)
if _, r.err = io.Copy(ew, rd); r.err != nil { if _, r.err = io.Copy(ew, rd); r.err != nil {
return return
} }
@ -185,11 +187,15 @@ func (r *renderer) renderUnindented(name string, rg renderGuide, a []Attributes,
} }
if isReader { if isReader {
r.copyEscaped(rd) r.copyEscaped(rd, !rg.preformatted)
continue continue
} }
if ct, ok := c.(Tag); ok { if ct, ok := c.(Tag); ok {
if rg.preformatted {
ct = Preformatted(ct)
}
ct(r) ct(r)
continue continue
} }
@ -204,14 +210,21 @@ func (r *renderer) renderUnindented(name string, rg renderGuide, a []Attributes,
continue continue
} }
r.writeEscaped(s) r.writeEscaped(s, !rg.preformatted)
} }
printf("</%s>", name) printf("</%s>", name)
} }
func (r *renderer) renderChildTag(tagName string, block, lastBlock bool, ct Tag) (bool, bool) { func (r *renderer) renderChildTag(tagName string, rg renderGuide, lastBlock bool, ct Tag) (bool, bool) {
printf := r.getPrintf(tagName) printf := r.getPrintf(tagName)
if rg.preformatted {
cr := new(renderer)
*cr = *r
cr.indent = Indentation{}
Preformatted(ct)(cr)
return false, false
}
var rgq renderGuidesQuery var rgq renderGuidesQuery
ct(&rgq) ct(&rgq)
@ -229,7 +242,7 @@ func (r *renderer) renderChildTag(tagName string, block, lastBlock bool, ct Tag)
r.clearWrapper() r.clearWrapper()
cr := new(renderer) cr := new(renderer)
*cr = *r *cr = *r
if !block { if rg.inline || rg.inlineChildren {
cr.currentIndent += cr.indent.Indent cr.currentIndent += cr.indent.Indent
cr.pwidth -= indentLen(cr.indent.Indent) cr.pwidth -= indentLen(cr.indent.Indent)
if cr.pwidth < cr.indent.MinPWidth { if cr.pwidth < cr.indent.MinPWidth {
@ -246,19 +259,8 @@ func (r *renderer) renderChildTag(tagName string, block, lastBlock bool, ct Tag)
return true, false return true, false
} }
func (r *renderer) renderReaderChild(tagName string, rg renderGuide, block, lastBlock bool, rd io.Reader) bool { func (r *renderer) renderReaderChild(tagName string, rg renderGuide, lastBlock bool, rd io.Reader) bool {
printf := r.getPrintf(tagName) printf := r.getPrintf(tagName)
if rg.verbatim {
r.clearWrapper()
indent := r.currentIndent
if !block {
indent += r.indent.Indent
}
r.copyIndented(indent, rd)
return false
}
if rg.script { if rg.script {
r.clearWrapper() r.clearWrapper()
printf("\n") printf("\n")
@ -269,12 +271,29 @@ func (r *renderer) renderReaderChild(tagName string, rg renderGuide, block, last
return false return false
} }
if rg.verbatim {
r.clearWrapper()
indent := r.currentIndent
if rg.inline || rg.inlineChildren {
indent += r.indent.Indent
}
r.copyIndented(indent, rd)
return false
}
if rg.preformatted {
r.clearWrapper()
r.copyEscaped(rd, false)
return false
}
if lastBlock { if lastBlock {
printf("\n%s", r.currentIndent) printf("\n%s", r.currentIndent)
} }
newWrapper := r.ensureWrapper() newWrapper := r.ensureWrapper()
r.copyEscaped(rd) r.copyEscaped(rd, true)
return newWrapper return newWrapper
} }
@ -289,34 +308,44 @@ func (r *renderer) renderChildScript(tagName string, c any) {
printf("\n%s", s) printf("\n%s", s)
} }
func (r *renderer) renderVerbatimChild(block bool, c any) { func (r *renderer) renderVerbatimChild(rg renderGuide, c any) {
s := fmt.Sprint(c) s := fmt.Sprint(c)
if s == "" { if s == "" {
return return
} }
r.clearWrapper() r.clearWrapper()
if rg.preformatted {
_, r.err = r.out.Write([]byte(s))
return
}
indent := r.currentIndent indent := r.currentIndent
if !block { if rg.inline || rg.inlineChildren {
indent += r.indent.Indent indent += r.indent.Indent
} }
r.writeIndented(indent, s) r.writeIndented(indent, s)
} }
func (r *renderer) renderChildContent(tagName string, lastBlock bool, c any) bool { func (r *renderer) renderChildContent(tagName string, rg renderGuide, lastBlock bool, c any) bool {
s := fmt.Sprint(c) s := fmt.Sprint(c)
if s == "" { if s == "" {
return false return false
} }
if rg.preformatted {
r.writeEscaped(s, false)
return false
}
if lastBlock { if lastBlock {
printf := r.getPrintf(tagName) printf := r.getPrintf(tagName)
printf("\n%s", r.currentIndent) printf("\n%s", r.currentIndent)
} }
newWrapper := r.ensureWrapper() newWrapper := r.ensureWrapper()
r.writeEscaped(s) r.writeEscaped(s, true)
return newWrapper return newWrapper
} }
@ -358,6 +387,11 @@ func (r *renderer) renderIndented(name string, rg renderGuide, a []Attributes, c
} }
} }
if rg.preformatted {
r.clearWrapper()
printf("\n")
}
for _, c := range children { for _, c := range children {
if c == nil { if c == nil {
continue continue
@ -365,7 +399,7 @@ func (r *renderer) renderIndented(name string, rg renderGuide, a []Attributes, c
if ct, isTag := c.(Tag); isTag { if ct, isTag := c.(Tag); isTag {
var nw bool var nw bool
lastBlock, nw = r.renderChildTag(name, block, lastBlock, ct) lastBlock, nw = r.renderChildTag(name, rg, lastBlock, ct)
if nw { if nw {
newWrapper = true newWrapper = true
} }
@ -374,7 +408,7 @@ func (r *renderer) renderIndented(name string, rg renderGuide, a []Attributes, c
} }
if rd, isReader := c.(io.Reader); isReader { if rd, isReader := c.(io.Reader); isReader {
if r.renderReaderChild(name, rg, block, lastBlock, rd) { if r.renderReaderChild(name, rg, lastBlock, rd) {
newWrapper = true newWrapper = true
} }
@ -389,12 +423,12 @@ func (r *renderer) renderIndented(name string, rg renderGuide, a []Attributes, c
} }
if rg.verbatim { if rg.verbatim {
r.renderVerbatimChild(block, c) r.renderVerbatimChild(rg, c)
lastBlock = true lastBlock = true
continue continue
} }
if r.renderChildContent(name, lastBlock, c) { if r.renderChildContent(name, rg, lastBlock, c) {
newWrapper = true newWrapper = true
} }

View File

@ -14,7 +14,7 @@ func TestRender(t *testing.T) {
foo = foo("<bar><baz></bar>") foo = foo("<bar><baz></bar>")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), foo); err != nil { if err := html.Write(&b, foo); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -28,7 +28,7 @@ func TestRender(t *testing.T) {
span := Span(Attr("foo", "bar=\"&\"")) span := Span(Attr("foo", "bar=\"&\""))
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, span); err != nil { if err := html.WriteRaw(&b, span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -41,7 +41,7 @@ func TestRender(t *testing.T) {
span := Span(Attr("foo", true)) span := Span(Attr("foo", true))
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, span); err != nil { if err := html.WriteRaw(&b, span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -54,7 +54,7 @@ func TestRender(t *testing.T) {
comment := Comment("foo & bar & baz", "qux") comment := Comment("foo & bar & baz", "qux")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, comment); err != nil { if err := html.WriteRaw(&b, comment); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -69,7 +69,7 @@ func TestRender(t *testing.T) {
span := Span("<foo>bar&baz</foo>") span := Span("<foo>bar&baz</foo>")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, span); err != nil { if err := html.WriteRaw(&b, span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -82,7 +82,7 @@ func TestRender(t *testing.T) {
span := Span("consecutive spaces: \" \"") span := Span("consecutive spaces: \" \"")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, span); err != nil { if err := html.WriteRaw(&b, span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -96,7 +96,7 @@ func TestRender(t *testing.T) {
t.Run("fail immediately", func(t *testing.T) { t.Run("fail immediately", func(t *testing.T) {
div := Div(Span("foo")) div := Div(Span("foo"))
w := &errorWriter{} w := &errorWriter{}
if err := html.Render(w, div); err == nil || !strings.Contains(err.Error(), "test write error") { if err := html.WriteRaw(w, div); err == nil || !strings.Contains(err.Error(), "test write error") {
t.Fatal() t.Fatal()
} }
}) })
@ -104,7 +104,7 @@ func TestRender(t *testing.T) {
t.Run("fail in tag", func(t *testing.T) { t.Run("fail in tag", func(t *testing.T) {
div := Div(Span("foo")) div := Div(Span("foo"))
w := &errorWriter{failAfter: 6} w := &errorWriter{failAfter: 6}
if err := html.Render(w, div); err == nil || !strings.Contains(err.Error(), "test write error") { if err := html.WriteRaw(w, div); err == nil || !strings.Contains(err.Error(), "test write error") {
t.Fatal() t.Fatal()
} }
}) })
@ -112,7 +112,7 @@ func TestRender(t *testing.T) {
t.Run("partial text children", func(t *testing.T) { t.Run("partial text children", func(t *testing.T) {
div := Div("foo", Div("bar"), "baz") div := Div("foo", Div("bar"), "baz")
w := &errorWriter{failAfter: 5} w := &errorWriter{failAfter: 5}
if err := html.RenderIndent(w, html.Indent(), div); err == nil || !strings.Contains(err.Error(), "test write error") { if err := html.Write(w, div); err == nil || !strings.Contains(err.Error(), "test write error") {
t.Fatal() t.Fatal()
} }
}) })
@ -120,7 +120,7 @@ func TestRender(t *testing.T) {
t.Run("text children", func(t *testing.T) { t.Run("text children", func(t *testing.T) {
div := Div("foo", "bar", "baz") div := Div("foo", "bar", "baz")
w := &errorWriter{failAfter: 5} w := &errorWriter{failAfter: 5}
if err := html.RenderIndent(w, html.Indent(), div); err == nil || !strings.Contains(err.Error(), "test write error") { if err := html.Write(w, div); err == nil || !strings.Contains(err.Error(), "test write error") {
t.Fatal() t.Fatal()
} }
}) })
@ -131,7 +131,7 @@ func TestRender(t *testing.T) {
div := Div(Span("foo")) div := Div(Span("foo"))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), div); err != nil { if err := html.Write(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -144,7 +144,7 @@ func TestRender(t *testing.T) {
div := Div(Br) div := Div(Br)
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), div); err != nil { if err := html.Write(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -157,7 +157,7 @@ func TestRender(t *testing.T) {
div := Div("foo bar baz", Div("qux quux"), "corge") div := Div("foo bar baz", Div("qux quux"), "corge")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), div); err != nil { if err := html.Write(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -170,7 +170,7 @@ func TestRender(t *testing.T) {
div := Div(Span("foo bar baz", Div("qux quux"), "corge")) div := Div(Span("foo bar baz", Div("qux quux"), "corge"))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), div); err != nil { if err := html.Write(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -184,7 +184,7 @@ func TestRender(t *testing.T) {
foo = foo("bar\nbaz\nqux") foo = foo("bar\nbaz\nqux")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), foo); err != nil { if err := html.Write(&b, foo); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -197,7 +197,7 @@ func TestRender(t *testing.T) {
script := Div(Script("foo()\nbar()\nbaz()")) script := Div(Script("foo()\nbar()\nbaz()"))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), script); err != nil { if err := html.Write(&b, script); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -212,7 +212,7 @@ func TestRender(t *testing.T) {
div := Div("foo") div := Div("foo")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, div); err != nil { if err := html.WriteRaw(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -225,7 +225,7 @@ func TestRender(t *testing.T) {
div := Div(42) div := Div(42)
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, div); err != nil { if err := html.WriteRaw(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -238,7 +238,7 @@ func TestRender(t *testing.T) {
div := Div(Div, "foo") div := Div(Div, "foo")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, div); err != nil { if err := html.WriteRaw(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -251,7 +251,7 @@ func TestRender(t *testing.T) {
div := Div(Span, "foo") div := Div(Span, "foo")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, div); err != nil { if err := html.WriteRaw(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -264,7 +264,7 @@ func TestRender(t *testing.T) {
span := Span("foo") span := Span("foo")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), span); err != nil { if err := html.Write(&b, span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -277,7 +277,7 @@ func TestRender(t *testing.T) {
span := Span(42) span := Span(42)
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), span); err != nil { if err := html.Write(&b, span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -290,7 +290,7 @@ func TestRender(t *testing.T) {
span := Span(Div, "foo") span := Span(Div, "foo")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), span); err != nil { if err := html.Write(&b, span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -303,7 +303,7 @@ func TestRender(t *testing.T) {
span := Span(Span, "foo") span := Span(Span, "foo")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), span); err != nil { if err := html.Write(&b, span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -316,7 +316,7 @@ func TestRender(t *testing.T) {
span := Span(Div, Span("foo")) span := Span(Div, Span("foo"))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), span); err != nil { if err := html.Write(&b, span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -329,7 +329,7 @@ func TestRender(t *testing.T) {
p := P("foo") p := P("foo")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), p); err != nil { if err := html.Write(&b, p); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -342,7 +342,7 @@ func TestRender(t *testing.T) {
p := P(42) p := P(42)
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), p); err != nil { if err := html.Write(&b, p); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -355,7 +355,7 @@ func TestRender(t *testing.T) {
p := P(P, "foo") p := P(P, "foo")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), p); err != nil { if err := html.Write(&b, p); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -368,7 +368,7 @@ func TestRender(t *testing.T) {
div := Div("foo") div := Div("foo")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), div); err != nil { if err := html.Write(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -381,7 +381,7 @@ func TestRender(t *testing.T) {
div := Div(42) div := Div(42)
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), div); err != nil { if err := html.Write(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -394,7 +394,7 @@ func TestRender(t *testing.T) {
div := Div(Div, 42) div := Div(Div, 42)
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), div); err != nil { if err := html.Write(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -407,7 +407,7 @@ func TestRender(t *testing.T) {
div := Div(Span, 42) div := Div(Span, 42)
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), div); err != nil { if err := html.Write(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -422,7 +422,7 @@ func TestRender(t *testing.T) {
div := Div("foo", nil, "bar") div := Div("foo", nil, "bar")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, div); err != nil { if err := html.WriteRaw(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -435,7 +435,7 @@ func TestRender(t *testing.T) {
div := html.Verbatim(Div("foo &", nil, " bar")) div := html.Verbatim(Div("foo &", nil, " bar"))
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, div); err != nil { if err := html.WriteRaw(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -448,7 +448,7 @@ func TestRender(t *testing.T) {
script := Script("let foo =", nil, " bar && baz") script := Script("let foo =", nil, " bar && baz")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, script); err != nil { if err := html.WriteRaw(&b, script); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -461,7 +461,7 @@ func TestRender(t *testing.T) {
span := Span("foo", nil, "bar") span := Span("foo", nil, "bar")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), span); err != nil { if err := html.Write(&b, span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -474,7 +474,7 @@ func TestRender(t *testing.T) {
span := html.Verbatim(Span("foo &", nil, " bar")) span := html.Verbatim(Span("foo &", nil, " bar"))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), span); err != nil { if err := html.Write(&b, span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -487,7 +487,7 @@ func TestRender(t *testing.T) {
script := html.Inline(Script("let foo =", nil, " bar && baz")) script := html.Inline(Script("let foo =", nil, " bar && baz"))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), script); err != nil { if err := html.Write(&b, script); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -500,7 +500,7 @@ func TestRender(t *testing.T) {
div := Div("foo", nil, "bar") div := Div("foo", nil, "bar")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), div); err != nil { if err := html.Write(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -513,7 +513,7 @@ func TestRender(t *testing.T) {
div := html.Verbatim(Div("foo &", nil, " bar")) div := html.Verbatim(Div("foo &", nil, " bar"))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), div); err != nil { if err := html.Write(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -526,7 +526,7 @@ func TestRender(t *testing.T) {
script := Script("let foo =", nil, " bar && baz") script := Script("let foo =", nil, " bar && baz")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), script); err != nil { if err := html.Write(&b, script); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -541,7 +541,7 @@ func TestRender(t *testing.T) {
div := Div("foo", "", "bar") div := Div("foo", "", "bar")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, div); err != nil { if err := html.WriteRaw(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -554,7 +554,7 @@ func TestRender(t *testing.T) {
div := html.Verbatim(Div("foo &", "", " bar")) div := html.Verbatim(Div("foo &", "", " bar"))
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, div); err != nil { if err := html.WriteRaw(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -567,7 +567,7 @@ func TestRender(t *testing.T) {
script := Script("let foo =", "", " bar && baz") script := Script("let foo =", "", " bar && baz")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, script); err != nil { if err := html.WriteRaw(&b, script); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -580,7 +580,7 @@ func TestRender(t *testing.T) {
span := Span("foo", "", "bar") span := Span("foo", "", "bar")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), span); err != nil { if err := html.Write(&b, span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -593,7 +593,7 @@ func TestRender(t *testing.T) {
span := html.Verbatim(Span("foo &", "", " bar")) span := html.Verbatim(Span("foo &", "", " bar"))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), span); err != nil { if err := html.Write(&b, span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -606,7 +606,7 @@ func TestRender(t *testing.T) {
script := html.Inline(Script("let foo =", "", " bar && baz")) script := html.Inline(Script("let foo =", "", " bar && baz"))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), script); err != nil { if err := html.Write(&b, script); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -619,7 +619,7 @@ func TestRender(t *testing.T) {
div := Div("foo", "", "bar") div := Div("foo", "", "bar")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), div); err != nil { if err := html.Write(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -632,7 +632,7 @@ func TestRender(t *testing.T) {
div := html.Verbatim(Div("foo &", "", " bar")) div := html.Verbatim(Div("foo &", "", " bar"))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), div); err != nil { if err := html.Write(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -645,7 +645,7 @@ func TestRender(t *testing.T) {
script := Script("let foo =", "", " bar && baz") script := Script("let foo =", "", " bar && baz")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), script); err != nil { if err := html.Write(&b, script); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -661,7 +661,7 @@ func TestRender(t *testing.T) {
div := Div(rd) div := Div(rd)
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, div); err != nil { if err := html.WriteRaw(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -675,7 +675,7 @@ func TestRender(t *testing.T) {
div := html.Verbatim(Div(rd)) div := html.Verbatim(Div(rd))
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, div); err != nil { if err := html.WriteRaw(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -689,7 +689,7 @@ func TestRender(t *testing.T) {
script := Script(rd) script := Script(rd)
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, script); err != nil { if err := html.WriteRaw(&b, script); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -703,7 +703,7 @@ func TestRender(t *testing.T) {
span := Span(rd) span := Span(rd)
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), span); err != nil { if err := html.Write(&b, span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -717,7 +717,7 @@ func TestRender(t *testing.T) {
span := html.Verbatim(Span(rd)) span := html.Verbatim(Span(rd))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), span); err != nil { if err := html.Write(&b, span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -731,7 +731,7 @@ func TestRender(t *testing.T) {
script := html.Inline(Script(rd)) script := html.Inline(Script(rd))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), script); err != nil { if err := html.Write(&b, script); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -745,7 +745,7 @@ func TestRender(t *testing.T) {
span := Span(Div, rd) span := Span(Div, rd)
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), span); err != nil { if err := html.Write(&b, span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -759,7 +759,7 @@ func TestRender(t *testing.T) {
div := Div(rd) div := Div(rd)
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), div); err != nil { if err := html.Write(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -773,7 +773,7 @@ func TestRender(t *testing.T) {
div := html.Verbatim(Div(rd)) div := html.Verbatim(Div(rd))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), div); err != nil { if err := html.Write(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -787,7 +787,7 @@ func TestRender(t *testing.T) {
script := Script(rd) script := Script(rd)
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), script); err != nil { if err := html.Write(&b, script); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -800,7 +800,7 @@ func TestRender(t *testing.T) {
t.Run("void", func(t *testing.T) { t.Run("void", func(t *testing.T) {
t.Run("unindented", func(t *testing.T) { t.Run("unindented", func(t *testing.T) {
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, Br); err != nil { if err := html.WriteRaw(&b, Br); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -811,7 +811,7 @@ func TestRender(t *testing.T) {
t.Run("inline", func(t *testing.T) { t.Run("inline", func(t *testing.T) {
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), Br); err != nil { if err := html.Write(&b, Br); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -822,7 +822,7 @@ func TestRender(t *testing.T) {
t.Run("block", func(t *testing.T) { t.Run("block", func(t *testing.T) {
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), Hr); err != nil { if err := html.Write(&b, Hr); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -835,7 +835,7 @@ func TestRender(t *testing.T) {
t.Run("no children", func(t *testing.T) { t.Run("no children", func(t *testing.T) {
t.Run("unindented", func(t *testing.T) { t.Run("unindented", func(t *testing.T) {
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, Div); err != nil { if err := html.WriteRaw(&b, Div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -846,7 +846,7 @@ func TestRender(t *testing.T) {
t.Run("inline", func(t *testing.T) { t.Run("inline", func(t *testing.T) {
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), Span); err != nil { if err := html.Write(&b, Span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -857,7 +857,7 @@ func TestRender(t *testing.T) {
t.Run("block", func(t *testing.T) { t.Run("block", func(t *testing.T) {
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), Div); err != nil { if err := html.Write(&b, Div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -872,7 +872,7 @@ func TestRender(t *testing.T) {
div := html.Verbatim(Div("foo & bar")) div := html.Verbatim(Div("foo & bar"))
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, div); err != nil { if err := html.WriteRaw(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -885,7 +885,7 @@ func TestRender(t *testing.T) {
span := html.Verbatim(Span("foo & bar")) span := html.Verbatim(Span("foo & bar"))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), span); err != nil { if err := html.Write(&b, span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -898,7 +898,7 @@ func TestRender(t *testing.T) {
div := html.Verbatim(Div("foo & bar")) div := html.Verbatim(Div("foo & bar"))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), div); err != nil { if err := html.Write(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -908,12 +908,108 @@ func TestRender(t *testing.T) {
}) })
}) })
t.Run("preformatted", func(t *testing.T) {
t.Run("simple", func(t *testing.T) {
pre := Pre("foo\nbar")
var b bytes.Buffer
if err := html.Write(&b, pre); err != nil {
t.Fatal(err)
}
if b.String() != "<pre>\nfoo\nbar\n</pre>" {
t.Fatal(b.String())
}
})
t.Run("indented", func(t *testing.T) {
div := Div(Pre("foo\nbar"))
var b bytes.Buffer
if err := html.Write(&b, div); err != nil {
t.Fatal(err)
}
if b.String() != "<div>\n\t<pre>\nfoo\nbar\n\t</pre>\n</div>" {
t.Fatal(b.String())
}
})
t.Run("child elements", func(t *testing.T) {
div := Div(Pre("foo", Div("bar\n\t", Span("baz\n"), " "), "\t"))
var b bytes.Buffer
if err := html.Write(&b, div); err != nil {
t.Fatal(err)
}
const expect = "<div>\n\t<pre>\nfoo<div>bar\n\t<span>baz\n</span> </div>\t\n\t</pre>\n</div>"
if b.String() != expect {
t.Fatal(b.String())
}
})
t.Run("escaping", func(t *testing.T) {
pre := Pre("foo & ", Span("baz & "), "qux")
var b bytes.Buffer
if err := html.Write(&b, pre); err != nil {
t.Fatal(err)
}
if b.String() != "<pre>\nfoo &amp; <span>baz &amp; </span>qux\n</pre>" {
t.Fatal(b.String())
}
})
t.Run("verbatim child element", func(t *testing.T) {
div := html.Verbatim(Div)
pre := Pre("foo", div("<span>\n\tbar\t\n</span>"), "baz")
var b bytes.Buffer
if err := html.Write(&b, pre); err != nil {
t.Fatal(err)
}
if b.String() != "<pre>\nfoo<div><span>\n\tbar\t\n</span></div>baz\n</pre>" {
t.Fatal(b.String())
}
})
t.Run("verbatim", func(t *testing.T) {
pre := html.Verbatim(Pre)
pre = pre("<div>\n <span>foo</span>\n</div>")
var b bytes.Buffer
if err := html.Write(&b, pre); err != nil {
t.Fatal(err)
}
if b.String() != "<pre>\n<div>\n <span>foo</span>\n</div>\n</pre>" {
t.Fatal(b.String())
}
})
t.Run("reader child", func(t *testing.T) {
pre := Pre(bytes.NewBufferString("foo &\nbar &\nbaz"))
var b bytes.Buffer
if err := html.Write(&b, pre); err != nil {
t.Fatal(err)
}
if b.String() != "<pre>\nfoo &amp;\nbar &amp;\nbaz\n</pre>" {
t.Fatal(b.String())
}
})
})
t.Run("script", func(t *testing.T) { t.Run("script", func(t *testing.T) {
t.Run("unindented", func(t *testing.T) { t.Run("unindented", func(t *testing.T) {
script := Script("let foo = bar && baz") script := Script("let foo = bar && baz")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, script); err != nil { if err := html.WriteRaw(&b, script); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -926,7 +1022,7 @@ func TestRender(t *testing.T) {
script := html.Inline(Script("let foo = bar && baz")) script := html.Inline(Script("let foo = bar && baz"))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), script); err != nil { if err := html.Write(&b, script); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -939,7 +1035,7 @@ func TestRender(t *testing.T) {
script := Script("let foo = bar && baz") script := Script("let foo = bar && baz")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indent(), script); err != nil { if err := html.Write(&b, script); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -954,7 +1050,7 @@ func TestRender(t *testing.T) {
p := P("foo bar baz qux quux corge") p := P("foo bar baz qux quux corge")
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indentation{Indent: "\t", PWidth: 15}, p); err != nil { if err := html.WriteIndent(&b, html.Indentation{Indent: "\t", PWidth: 15}, p); err != nil {
t.Error(err) t.Error(err)
} }
@ -967,7 +1063,7 @@ func TestRender(t *testing.T) {
div := Div(P("foo bar baz qux quux corge")) div := Div(P("foo bar baz qux quux corge"))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indentation{Indent: "\t", PWidth: 21, MinPWidth: 18}, div); err != nil { if err := html.WriteIndent(&b, html.Indentation{Indent: "\t", PWidth: 21, MinPWidth: 18}, div); err != nil {
t.Error(err) t.Error(err)
} }
@ -980,7 +1076,7 @@ func TestRender(t *testing.T) {
span := Span(P("foo bar baz qux quux corge")) span := Span(P("foo bar baz qux quux corge"))
var b bytes.Buffer var b bytes.Buffer
if err := html.RenderIndent(&b, html.Indentation{Indent: "\t", PWidth: 21, MinPWidth: 18}, span); err != nil { if err := html.WriteIndent(&b, html.Indentation{Indent: "\t", PWidth: 21, MinPWidth: 18}, span); err != nil {
t.Error(err) t.Error(err)
} }

View File

@ -34,7 +34,6 @@ noscript
ol ol
optgroup optgroup
picture picture
pre
q q
search search
section section

1
tag.preformatted.txt Normal file
View File

@ -0,0 +1 @@
pre

View File

@ -40,7 +40,6 @@ var Noscript = html.Define("noscript")
var Ol = html.Define("ol") var Ol = html.Define("ol")
var Optgroup = html.Define("optgroup") var Optgroup = html.Define("optgroup")
var Picture = html.Define("picture") var Picture = html.Define("picture")
var Pre = html.Define("pre")
var Q = html.Define("q") var Q = html.Define("q")
var Search = html.Define("search") var Search = html.Define("search")
var Section = html.Define("section") var Section = html.Define("section")

7
tag/preformatted.gen.go Normal file
View File

@ -0,0 +1,7 @@
// generated by ../script/generate-tags.go
package tag
import "code.squareroundforest.org/arpio/html"
var Pre = html.Preformatted(html.Define("pre"))

View File

@ -13,7 +13,7 @@ func TestValidate(t *testing.T) {
mytag := html.Define("foo+bar") mytag := html.Define("foo+bar")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, mytag); err == nil { if err := html.WriteRaw(&b, mytag); err == nil {
t.Fatal() t.Fatal()
} }
}) })
@ -22,7 +22,7 @@ func TestValidate(t *testing.T) {
mytag := html.Define("0foo") mytag := html.Define("0foo")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, mytag); err == nil { if err := html.WriteRaw(&b, mytag); err == nil {
t.Fatal() t.Fatal()
} }
}) })
@ -31,7 +31,7 @@ func TestValidate(t *testing.T) {
mytag := html.Define("-foo") mytag := html.Define("-foo")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, mytag); err == nil { if err := html.WriteRaw(&b, mytag); err == nil {
t.Fatal() t.Fatal()
} }
}) })
@ -40,7 +40,7 @@ func TestValidate(t *testing.T) {
mytag := html.Define("foo") mytag := html.Define("foo")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, mytag); err != nil { if err := html.WriteRaw(&b, mytag); err != nil {
t.Fatal(err) t.Fatal(err)
} }
}) })
@ -49,7 +49,7 @@ func TestValidate(t *testing.T) {
mytag := html.Define("foo-bar-1") mytag := html.Define("foo-bar-1")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, mytag); err != nil { if err := html.WriteRaw(&b, mytag); err != nil {
t.Fatal(err) t.Fatal(err)
} }
}) })
@ -59,7 +59,7 @@ func TestValidate(t *testing.T) {
div := Div(Attr("foo+", "bar")) div := Div(Attr("foo+", "bar"))
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, div); err == nil { if err := html.WriteRaw(&b, div); err == nil {
t.Fatal() t.Fatal()
} }
}) })
@ -68,7 +68,7 @@ func TestValidate(t *testing.T) {
br := Br("foo") br := Br("foo")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, br); err == nil { if err := html.WriteRaw(&b, br); err == nil {
t.Fatal() t.Fatal()
} }
}) })
@ -77,7 +77,7 @@ func TestValidate(t *testing.T) {
div := html.Verbatim(Div(Br())) div := html.Verbatim(Div(Br()))
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, div); err != nil { if err := html.WriteRaw(&b, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
}) })
@ -86,7 +86,7 @@ func TestValidate(t *testing.T) {
script := Script(Br()) script := Script(Br())
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, script); err == nil { if err := html.WriteRaw(&b, script); err == nil {
t.Fatal() t.Fatal()
} }
}) })
@ -95,7 +95,7 @@ func TestValidate(t *testing.T) {
div := Div(Div(Attr("foo+", "bar"))) div := Div(Div(Attr("foo+", "bar")))
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, div); err == nil { if err := html.WriteRaw(&b, div); err == nil {
t.Fatal() t.Fatal()
} }
}) })
@ -104,7 +104,7 @@ func TestValidate(t *testing.T) {
div := Div(Div(Attr("foo", "bar"))) div := Div(Div(Attr("foo", "bar")))
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, div); err != nil { if err := html.WriteRaw(&b, div); err != nil {
t.Fatal() t.Fatal()
} }
}) })
@ -113,7 +113,7 @@ func TestValidate(t *testing.T) {
decl := html.Declaration("foo", "bar", "baz qux") decl := html.Declaration("foo", "bar", "baz qux")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, decl); err != nil { if err := html.WriteRaw(&b, decl); err != nil {
t.Fatal(err) t.Fatal(err)
} }
}) })
@ -122,7 +122,7 @@ func TestValidate(t *testing.T) {
decl := html.Declaration("#", "foo") decl := html.Declaration("#", "foo")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, decl); err != nil { if err := html.WriteRaw(&b, decl); err != nil {
t.Fatal(err) t.Fatal(err)
} }
}) })
@ -132,7 +132,7 @@ func TestValidate(t *testing.T) {
decl = decl("bar") decl = decl("bar")
var b bytes.Buffer var b bytes.Buffer
if err := html.Render(&b, decl); err == nil { if err := html.WriteRaw(&b, decl); err == nil {
t.Fatal("failed to fail") t.Fatal("failed to fail")
} }
}) })

View File

@ -10,7 +10,7 @@ import (
func TestWrap(t *testing.T) { func TestWrap(t *testing.T) {
t.Run("write error", func(t *testing.T) { t.Run("write error", func(t *testing.T) {
ew := &errorWriter{failAfter: 9} ew := &errorWriter{failAfter: 9}
if err := html.RenderIndent( if err := html.WriteIndent(
ew, ew,
html.Indentation{Indent: "\t", PWidth: 12}, html.Indentation{Indent: "\t", PWidth: 12},
Span(Span("foo"), Span("bar"), Span("baz")), Span(Span("foo"), Span("bar"), Span("baz")),
@ -21,7 +21,7 @@ func TestWrap(t *testing.T) {
t.Run("write error in text", func(t *testing.T) { t.Run("write error in text", func(t *testing.T) {
ew := &errorWriter{} ew := &errorWriter{}
if err := html.RenderIndent( if err := html.WriteIndent(
ew, ew,
html.Indentation{Indent: "\t", PWidth: 2}, html.Indentation{Indent: "\t", PWidth: 2},
Span("foo", "bar", "baz"), Span("foo", "bar", "baz"),
@ -32,7 +32,7 @@ func TestWrap(t *testing.T) {
t.Run("write error on line feed", func(t *testing.T) { t.Run("write error on line feed", func(t *testing.T) {
ew := &errorWriter{failAfter: 7} ew := &errorWriter{failAfter: 7}
if err := html.RenderIndent( if err := html.WriteIndent(
ew, ew,
html.Indentation{Indent: "\t", PWidth: 3}, html.Indentation{Indent: "\t", PWidth: 3},
Span("foo"), Span("foo"),
@ -43,7 +43,7 @@ func TestWrap(t *testing.T) {
t.Run("write error on indentation", func(t *testing.T) { t.Run("write error on indentation", func(t *testing.T) {
ew := &errorWriter{failAfter: 15} ew := &errorWriter{failAfter: 15}
if err := html.RenderIndent( if err := html.WriteIndent(
ew, ew,
html.Indentation{Indent: "\t", PWidth: 3}, html.Indentation{Indent: "\t", PWidth: 3},
Div(Span("foo")), Div(Span("foo")),
@ -54,9 +54,8 @@ func TestWrap(t *testing.T) {
t.Run("write error on flush", func(t *testing.T) { t.Run("write error on flush", func(t *testing.T) {
ew := &errorWriter{} ew := &errorWriter{}
if err := html.RenderIndent( if err := html.Write(
ew, ew,
html.Indent(),
Span(Span("foo"), Span("bar"), Span("baz")), Span(Span("foo"), Span("bar"), Span("baz")),
); err == nil { ); err == nil {
t.Fatal() t.Fatal()
@ -65,7 +64,7 @@ func TestWrap(t *testing.T) {
t.Run("write error on flush during line feed", func(t *testing.T) { t.Run("write error on flush during line feed", func(t *testing.T) {
ew := &errorWriter{} ew := &errorWriter{}
if err := html.RenderIndent( if err := html.WriteIndent(
ew, ew,
html.Indentation{Indent: "\t", PWidth: 10}, html.Indentation{Indent: "\t", PWidth: 10},
Span("foo bar", Div), Span("foo bar", Div),
@ -76,7 +75,7 @@ func TestWrap(t *testing.T) {
t.Run("null write", func(t *testing.T) { t.Run("null write", func(t *testing.T) {
var buf bytes.Buffer var buf bytes.Buffer
if err := html.Render(&buf, Div("")); err != nil { if err := html.WriteRaw(&buf, Div("")); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -89,7 +88,7 @@ func TestWrap(t *testing.T) {
span := Span("foo bar baz") span := Span("foo bar baz")
var buf bytes.Buffer var buf bytes.Buffer
if err := html.RenderIndent(&buf, html.Indentation{Indent: "\t", PWidth: 2}, span); err != nil { if err := html.WriteIndent(&buf, html.Indentation{Indent: "\t", PWidth: 2}, span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -104,7 +103,7 @@ func TestWrap(t *testing.T) {
span := Span("foo ", Span("bar", Attr("qux", 42)), " baz") span := Span("foo ", Span("bar", Attr("qux", 42)), " baz")
var buf bytes.Buffer var buf bytes.Buffer
if err := html.RenderIndent(&buf, html.Indentation{Indent: "X", PWidth: 2}, span); err != nil { if err := html.WriteIndent(&buf, html.Indentation{Indent: "X", PWidth: 2}, span); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -117,7 +116,7 @@ func TestWrap(t *testing.T) {
div := Div(Span("foo bar baz qux quux corge")) div := Div(Span("foo bar baz qux quux corge"))
var buf bytes.Buffer var buf bytes.Buffer
if err := html.RenderIndent(&buf, html.Indentation{Indent: "\t", PWidth: 15}, div); err != nil { if err := html.WriteIndent(&buf, html.Indentation{Indent: "\t", PWidth: 15}, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -130,7 +129,7 @@ func TestWrap(t *testing.T) {
div := Div(Span("foo"), " ", Span("bar")) div := Div(Span("foo"), " ", Span("bar"))
var buf bytes.Buffer var buf bytes.Buffer
if err := html.RenderIndent(&buf, html.Indent(), div); err != nil { if err := html.Write(&buf, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -143,7 +142,7 @@ func TestWrap(t *testing.T) {
div := Div("foo\nbar\tbaz") div := Div("foo\nbar\tbaz")
var buf bytes.Buffer var buf bytes.Buffer
if err := html.RenderIndent(&buf, html.Indent(), div); err != nil { if err := html.Write(&buf, div); err != nil {
t.Fatal(err) t.Fatal(err)
} }