about summary refs log tree commit diff stats
path: root/el
diff options
context:
space:
mode:
authorMarkus Wüstenberg2020-09-18 15:01:10 +0200
committerGitHub2020-09-18 15:01:10 +0200
commit4d9f1c2aedf43dbd0989f4c8165a18ed6a5a33ed (patch)
tree5086e91883dfd7dd197c0a761049471c390f0b5a /el
parentf7812a9f06d2b97f413b6b33deecba170e05d184 (diff)
downloadgomponents-4d9f1c2aedf43dbd0989f4c8165a18ed6a5a33ed.tar.lz
gomponents-4d9f1c2aedf43dbd0989f4c8165a18ed6a5a33ed.tar.zst
gomponents-4d9f1c2aedf43dbd0989f4c8165a18ed6a5a33ed.zip
Add package el with element helpers (#8)
Diffstat (limited to 'el')
-rw-r--r--el/elements.go41
-rw-r--r--el/elements_test.go39
2 files changed, 80 insertions, 0 deletions
diff --git a/el/elements.go b/el/elements.go
new file mode 100644
index 0000000..ecff7e8
--- /dev/null
+++ b/el/elements.go
@@ -0,0 +1,41 @@
+// Package el provides shortcuts and helpers to common HTML elements.
+// See https://developer.mozilla.org/en-US/docs/Web/HTML/Element for a list of elements.
+package el
+
+import (
+	"strings"
+
+	g "github.com/maragudk/gomponents"
+)
+
+// Document returns an special kind of Node that prefixes its children with the string "<!doctype html>".
+func Document(children ...g.Node) g.NodeFunc {
+	return func() string {
+		var b strings.Builder
+		b.WriteString("<!doctype html>")
+		for _, c := range children {
+			b.WriteString(c.Render())
+		}
+		return b.String()
+	}
+}
+
+// HTML returns an element with name "html" and the given children.
+func HTML(children ...g.Node) g.NodeFunc {
+	return g.El("html", children...)
+}
+
+// Head returns an element with name "head" and the given children.
+func Head(children ...g.Node) g.NodeFunc {
+	return g.El("head", children...)
+}
+
+// Body returns an element with name "body" and the given children.
+func Body(children ...g.Node) g.NodeFunc {
+	return g.El("body", children...)
+}
+
+// Title returns an element with name "title" and a single Text child.
+func Title(title string) g.NodeFunc {
+	return g.El("title", g.Text(title))
+}
diff --git a/el/elements_test.go b/el/elements_test.go
new file mode 100644
index 0000000..eb0db47
--- /dev/null
+++ b/el/elements_test.go
@@ -0,0 +1,39 @@
+package el_test
+
+import (
+	"testing"
+
+	g "github.com/maragudk/gomponents"
+	"github.com/maragudk/gomponents/assert"
+	"github.com/maragudk/gomponents/el"
+)
+
+func TestDocument(t *testing.T) {
+	t.Run("returns doctype and children", func(t *testing.T) {
+		assert.Equal(t, `<!doctype html><html/>`, el.Document(g.El("html")))
+	})
+}
+
+func TestHTML(t *testing.T) {
+	t.Run("returns an html element", func(t *testing.T) {
+		assert.Equal(t, "<html><div/><span/></html>", el.HTML(g.El("div"), g.El("span")))
+	})
+}
+
+func TestHead(t *testing.T) {
+	t.Run("returns a head element", func(t *testing.T) {
+		assert.Equal(t, "<head><title/><link/></head>", el.Head(g.El("title"), g.El("link")))
+	})
+}
+
+func TestBody(t *testing.T) {
+	t.Run("returns a body element", func(t *testing.T) {
+		assert.Equal(t, "<body><div/><span/></body>", el.Body(g.El("div"), g.El("span")))
+	})
+}
+
+func TestTitle(t *testing.T) {
+	t.Run("returns a title element with text content", func(t *testing.T) {
+		assert.Equal(t, "<title>hat</title>", el.Title("hat"))
+	})
+}