Repository: maragudk/gomponents
Pull request #8 (2020-09-18 13:00:10)

Add package el with element helpers

codecov[bot]: # [Codecov](https://codecov.io/gh/maragudk/gomponents/pull/8?src=pr&el=h1) Report
> Merging [#8](https://codecov.io/gh/maragudk/gomponents/pull/8?src=pr&el=desc) into [master](https://codecov.io/gh/maragudk/gomponents/commit/f7812a9f06d2b97f413b6b33deecba170e05d184?el=desc) will **increase** coverage by `0.35%`.
> The diff coverage is `100.00%`.

[![Impacted file tree graph](https://codecov.io/gh/maragudk/gomponents/pull/8/graphs/tree.svg?width=650&height=150&src=pr&token=JYN032TYAC)](https://codecov.io/gh/maragudk/gomponents/pull/8?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master       #8      +/-   ##
==========================================
+ Coverage   97.82%   98.18%   +0.35%     
==========================================
  Files           2        3       +1     
  Lines          46       55       +9     
==========================================
+ Hits           45       54       +9     
  Misses          1        1              
```


| [Impacted Files](https://codecov.io/gh/maragudk/gomponents/pull/8?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [el/elements.go](https://codecov.io/gh/maragudk/gomponents/pull/8/diff?src=pr&el=tree#diff-ZWwvZWxlbWVudHMuZ28=) | `100.00% <100.00%> (ø)` | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/maragudk/gomponents/pull/8?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/maragudk/gomponents/pull/8?src=pr&el=footer). Last update [f7812a9...eb2b795](https://codecov.io/gh/maragudk/gomponents/pull/8?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).


Patch:
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))
+}


Test patch:
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"))
+	})
+}