parent
7c0f2e4cbb
commit
ba0d83f4fb
@ -1,6 +1,7 @@
|
||||
package components_test
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
g "github.com/maragudk/gomponents"
|
||||
@ -30,3 +31,9 @@ func TestClasses(t *testing.T) {
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func ExampleClasses() {
|
||||
e := g.El("div", c.Classes{"party-hat": true, "boring-hat": false})
|
||||
_ = e.Render(os.Stdout)
|
||||
// Output: <div class="party-hat"></div>
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Package gomponents provides declarative view components in Go, that can render to HTML5.
|
||||
// Package gomponents provides view components in Go, that render to HTML 5.
|
||||
// The primary interface is a Node, which has a single function Render, which should render
|
||||
// the Node to a string. Furthermore, NodeFunc is a function which implements the Node interface
|
||||
// by calling itself on Render.
|
||||
@ -219,14 +219,6 @@ func Group(children []Node) Node {
|
||||
}
|
||||
|
||||
// Map something enumerable to a list of Nodes.
|
||||
// Example:
|
||||
// items := []string{"hat", "partyhat"}
|
||||
//
|
||||
// lis := Map(len(items), func(i int) Node {
|
||||
// return El("li", Text(items[i]))
|
||||
// })
|
||||
//
|
||||
// list := El("ul", lis...)
|
||||
func Map(length int, cb func(i int) Node) []Node {
|
||||
var nodes []Node
|
||||
for i := 0; i < length; i++ {
|
||||
@ -237,10 +229,6 @@ func Map(length int, cb func(i int) Node) []Node {
|
||||
|
||||
// If condition is true, return the given Node. Otherwise, return nil.
|
||||
// This helper function is good for inlining elements conditionally.
|
||||
// Example:
|
||||
// El("div",
|
||||
// If(showMessage, El("span", "You lost your hat.")),
|
||||
// )
|
||||
func If(condition bool, n Node) Node {
|
||||
if condition {
|
||||
return n
|
||||
|
@ -4,6 +4,7 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
@ -77,6 +78,18 @@ func BenchmarkAttr(b *testing.B) {
|
||||
})
|
||||
}
|
||||
|
||||
func ExampleAttr_bool() {
|
||||
e := g.El("input", g.Attr("required"))
|
||||
_ = e.Render(os.Stdout)
|
||||
// Output: <input required>
|
||||
}
|
||||
|
||||
func ExampleAttr_name_value() {
|
||||
e := g.El("div", g.Attr("id", "hat"))
|
||||
_ = e.Render(os.Stdout)
|
||||
// Output: <div id="hat"></div>
|
||||
}
|
||||
|
||||
type outsider struct{}
|
||||
|
||||
func (o outsider) String() string {
|
||||
@ -146,6 +159,12 @@ func BenchmarkEl(b *testing.B) {
|
||||
})
|
||||
}
|
||||
|
||||
func ExampleEl() {
|
||||
e := g.El("div", g.El("span"))
|
||||
_ = e.Render(os.Stdout)
|
||||
// Output: <div><span></span></div>
|
||||
}
|
||||
|
||||
type erroringWriter struct{}
|
||||
|
||||
func (w *erroringWriter) Write(p []byte) (n int, err error) {
|
||||
@ -159,6 +178,12 @@ func TestText(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func ExampleText() {
|
||||
e := g.El("span", g.Text("Party hats > normal hats."))
|
||||
_ = e.Render(os.Stdout)
|
||||
// Output: <span>Party hats > normal hats.</span>
|
||||
}
|
||||
|
||||
func TestTextf(t *testing.T) {
|
||||
t.Run("renders interpolated and escaped text", func(t *testing.T) {
|
||||
e := g.Textf("<%v>", "div")
|
||||
@ -166,6 +191,12 @@ func TestTextf(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func ExampleTextf() {
|
||||
e := g.El("span", g.Textf("%v party hats > %v normal hats.", 2, 3))
|
||||
_ = e.Render(os.Stdout)
|
||||
// Output: <span>2 party hats > 3 normal hats.</span>
|
||||
}
|
||||
|
||||
func TestRaw(t *testing.T) {
|
||||
t.Run("renders raw text", func(t *testing.T) {
|
||||
e := g.Raw("<div>")
|
||||
@ -173,6 +204,12 @@ func TestRaw(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func ExampleRaw() {
|
||||
e := g.El("span", g.Raw("<strong>Party</strong> hats > normal hats."))
|
||||
_ = e.Render(os.Stdout)
|
||||
// Output: <span><strong>Party</strong> hats > normal hats.</span>
|
||||
}
|
||||
|
||||
func TestGroup(t *testing.T) {
|
||||
t.Run("groups multiple nodes into one", func(t *testing.T) {
|
||||
children := []g.Node{g.El("br", g.Attr("id", "hat")), g.El("hr")}
|
||||
@ -222,6 +259,15 @@ func TestMap(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func ExampleMap() {
|
||||
items := []string{"party hat", "super hat"}
|
||||
e := g.El("ul", g.Group(g.Map(len(items), func(i int) g.Node {
|
||||
return g.El("li", g.Text(items[i]))
|
||||
})))
|
||||
_ = e.Render(os.Stdout)
|
||||
// Output: <ul><li>party hat</li><li>super hat</li></ul>
|
||||
}
|
||||
|
||||
func TestIf(t *testing.T) {
|
||||
t.Run("returns node if condition is true", func(t *testing.T) {
|
||||
n := g.El("div", g.If(true, g.El("span")))
|
||||
@ -233,3 +279,13 @@ func TestIf(t *testing.T) {
|
||||
assert.Equal(t, "<div></div>", n)
|
||||
})
|
||||
}
|
||||
|
||||
func ExampleIf() {
|
||||
showMessage := true
|
||||
e := g.El("div",
|
||||
g.If(showMessage, g.El("span", g.Text("You lost your hat!"))),
|
||||
g.If(!showMessage, g.El("span", g.Text("No messages."))),
|
||||
)
|
||||
_ = e.Render(os.Stdout)
|
||||
// Output: <div><span>You lost your hat!</span></div>
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user