about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--gomponents.go7
-rw-r--r--gomponents_test.go7
3 files changed, 15 insertions, 1 deletions
diff --git a/README.md b/README.md
index b817ad0..23b29b7 100644
--- a/README.md
+++ b/README.md
@@ -54,7 +54,7 @@ func Page(title, path string) g.Node {
 			el.Body(
 				Navbar(path),
 				el.H1(title),
-				el.P(g.Text(fmt.Sprintf("Welcome to the page at %v.", path))),
+				el.P(g.Textf("Welcome to the page at %v.", path)),
 			),
 		),
 	)
diff --git a/gomponents.go b/gomponents.go
index d160b54..21d3e75 100644
--- a/gomponents.go
+++ b/gomponents.go
@@ -109,6 +109,13 @@ func Text(t string) NodeFunc {
 	}
 }
 
+// Textf creates a text DOM Node that Renders the interpolated and escaped string t.
+func Textf(format string, a ...interface{}) NodeFunc {
+	return func() string {
+		return template.HTMLEscaper(fmt.Sprintf(format, a...))
+	}
+}
+
 // Raw creates a raw Node that just Renders the unescaped string t.
 func Raw(t string) NodeFunc {
 	return func() string {
diff --git a/gomponents_test.go b/gomponents_test.go
index 78b69f0..ee0b91d 100644
--- a/gomponents_test.go
+++ b/gomponents_test.go
@@ -81,6 +81,13 @@ func TestText(t *testing.T) {
 	})
 }
 
+func TestTextf(t *testing.T) {
+	t.Run("renders interpolated and escaped text", func(t *testing.T) {
+		e := g.Textf("<%v/>", "div")
+		assert.Equal(t, "&lt;div/&gt;", e)
+	})
+}
+
 func TestRaw(t *testing.T) {
 	t.Run("renders raw text", func(t *testing.T) {
 		e := g.Raw("<div/>")