all repos — gomponents @ 8de5a685efbc6f13e606dcd70d15b757e3f9ad9a

HTML components in pure Go

Add a lot of common elements (#10) Especially add elements that are either used in every document, that nearly always have text content, or that are almost always used with certain attributes.

Markus Wüstenberg
commit

8de5a685efbc6f13e606dcd70d15b757e3f9ad9a

parent

02d963de1090382d820aa371fd265452f5e5542c

2 files changed, 216 insertions(+), 0 deletions(-)

changed files
M el/elements.goel/elements.go
@@ -39,3 +39,93 @@ // 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)) } + +func Meta(children ...g.Node) g.NodeFunc { + return g.El("meta", children...) +} + +func Link(children ...g.Node) g.NodeFunc { + return g.El("link", children...) +} + +func Style(children ...g.Node) g.NodeFunc { + return g.El("style", children...) +} + +func Div(children ...g.Node) g.NodeFunc { + return g.El("div", children...) +} + +func Span(children ...g.Node) g.NodeFunc { + return g.El("span", children...) +} + +func A(href string, children ...g.Node) g.NodeFunc { + return g.El("a", prepend(g.Attr("href", href), children)...) +} + +func P(children ...g.Node) g.NodeFunc { + return g.El("p", children...) +} + +func H1(text string) g.NodeFunc { + return g.El("h1", g.Text(text)) +} + +func H2(text string) g.NodeFunc { + return g.El("h2", g.Text(text)) +} + +func H3(text string) g.NodeFunc { + return g.El("h3", g.Text(text)) +} + +func H4(text string) g.NodeFunc { + return g.El("h4", g.Text(text)) +} + +func H5(text string) g.NodeFunc { + return g.El("h5", g.Text(text)) +} + +func H6(text string) g.NodeFunc { + return g.El("h6", g.Text(text)) +} + +func Ol(children ...g.Node) g.NodeFunc { + return g.El("ol", children...) +} + +func Ul(children ...g.Node) g.NodeFunc { + return g.El("ul", children...) +} + +func Li(children ...g.Node) g.NodeFunc { + return g.El("li", children...) +} + +func B(text string) g.NodeFunc { + return g.El("b", g.Text(text)) +} + +func Strong(text string) g.NodeFunc { + return g.El("strong", g.Text(text)) +} + +func I(text string) g.NodeFunc { + return g.El("i", g.Text(text)) +} + +func Em(text string) g.NodeFunc { + return g.El("em", g.Text(text)) +} + +func Img(src, alt string) g.NodeFunc { + return g.El("img", g.Attr("src", src), g.Attr("alt", alt)) +} + +func prepend(node g.Node, nodes []g.Node) []g.Node { + newNodes := []g.Node{node} + newNodes = append(newNodes, nodes...) + return newNodes +}
M el/elements_test.goel/elements_test.go
@@ -37,3 +37,129 @@ t.Run("returns a title element with text content", func(t *testing.T) {
assert.Equal(t, "<title>hat</title>", el.Title("hat")) }) } + +func TestMeta(t *testing.T) { + t.Run("returns a meta element", func(t *testing.T) { + assert.Equal(t, `<meta charset="utf-8"/>`, el.Meta(g.Attr("charset", "utf-8"))) + }) +} + +func TestLink(t *testing.T) { + t.Run("returns a link element", func(t *testing.T) { + assert.Equal(t, `<link rel="stylesheet"/>`, el.Link(g.Attr("rel", "stylesheet"))) + }) +} + +func TestStyle(t *testing.T) { + t.Run("returns a style element", func(t *testing.T) { + assert.Equal(t, `<style type="text/css"/>`, el.Style(g.Attr("type", "text/css"))) + }) +} + +func TestDiv(t *testing.T) { + t.Run("returns a div element", func(t *testing.T) { + assert.Equal(t, `<div><span/></div>`, el.Div(el.Span())) + }) +} + +func TestSpan(t *testing.T) { + t.Run("returns a span element", func(t *testing.T) { + assert.Equal(t, `<span>hat</span>`, el.Span(g.Text("hat"))) + }) +} + +func TestA(t *testing.T) { + t.Run("returns an a element with a href attribute", func(t *testing.T) { + assert.Equal(t, `<a href="#">hat</a>`, el.A("#", g.Text("hat"))) + }) +} + +func TestP(t *testing.T) { + t.Run("returns a p element", func(t *testing.T) { + assert.Equal(t, `<p>hat</p>`, el.P(g.Text("hat"))) + }) +} + +func TestH1(t *testing.T) { + t.Run("returns an h1 element", func(t *testing.T) { + assert.Equal(t, `<h1>hat</h1>`, el.H1("hat")) + }) +} + +func TestH2(t *testing.T) { + t.Run("returns an h2 element", func(t *testing.T) { + assert.Equal(t, `<h2>hat</h2>`, el.H2("hat")) + }) +} + +func TestH3(t *testing.T) { + t.Run("returns an h3 element", func(t *testing.T) { + assert.Equal(t, `<h3>hat</h3>`, el.H3("hat")) + }) +} + +func TestH4(t *testing.T) { + t.Run("returns an h4 element", func(t *testing.T) { + assert.Equal(t, `<h4>hat</h4>`, el.H4("hat")) + }) +} + +func TestH5(t *testing.T) { + t.Run("returns an h5 element", func(t *testing.T) { + assert.Equal(t, `<h5>hat</h5>`, el.H5("hat")) + }) +} + +func TestH6(t *testing.T) { + t.Run("returns an h6 element", func(t *testing.T) { + assert.Equal(t, `<h6>hat</h6>`, el.H6("hat")) + }) +} + +func TestOl(t *testing.T) { + t.Run("returns an ol element", func(t *testing.T) { + assert.Equal(t, `<ol><li/></ol>`, el.Ol(el.Li())) + }) +} + +func TestUl(t *testing.T) { + t.Run("returns a ul element", func(t *testing.T) { + assert.Equal(t, `<ul><li/></ul>`, el.Ul(el.Li())) + }) +} + +func TestLi(t *testing.T) { + t.Run("returns an li element", func(t *testing.T) { + assert.Equal(t, `<li>hat</li>`, el.Li(g.Text("hat"))) + }) +} + +func TestB(t *testing.T) { + t.Run("returns a b element", func(t *testing.T) { + assert.Equal(t, `<b>hat</b>`, el.B("hat")) + }) +} + +func TestStrong(t *testing.T) { + t.Run("returns a strong element", func(t *testing.T) { + assert.Equal(t, `<strong>hat</strong>`, el.Strong("hat")) + }) +} + +func TestI(t *testing.T) { + t.Run("returns an i element", func(t *testing.T) { + assert.Equal(t, `<i>hat</i>`, el.I("hat")) + }) +} + +func TestEm(t *testing.T) { + t.Run("returns an em element", func(t *testing.T) { + assert.Equal(t, `<em>hat</em>`, el.Em("hat")) + }) +} + +func TestImg(t *testing.T) { + t.Run("returns an img element with href and alt attributes", func(t *testing.T) { + assert.Equal(t, `<img src="hat.png" alt="hat"/>`, el.Img("hat.png", "hat")) + }) +}