Documentation
¶
Overview ¶
Package gomponents provides HTML components in Go, that render to HTML 5.
The primary interface is a Node. It defines a function Render, which should render the Node to the given writer as a string.
All DOM elements and attributes can be created by using the El and Attr functions.
The functions Text, Textf, Raw, and Rawf can be used to create text nodes, either HTML-escaped or unescaped.
See also helper functions Map, If, and Iff for mapping data to nodes and inserting them conditionally.
There's also the Group type, which is a slice of Node-s that can be rendered as one Node.
For basic HTML elements and attributes, see the package html.
For higher-level HTML components, see the package components.
For HTTP helpers, see the package http.
Index ¶
- Constants
- type Group
- type IterNode
- type Node
- func Attr(name string, value ...string) Node
- func El(name string, children ...Node) Node
- func If(condition bool, n Node, otherwise ...Node) Node
- func Iff(condition bool, f func() Node, otherwise ...func() Node) Node
- func Raw(t string) Node
- func Rawf(format string, a ...any) Node
- func Text(t string) Node
- func Textf(format string, a ...any) Node
- type NodeFunc
- type NodeType
- type NodeWriter
- type NodeWriterFunc
Examples ¶
Constants ¶
const ( ElementType = NodeType(iota) AttributeType )
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Group ¶
type Group []Node
Group a slice of Node-s into one Node, while still being usable like a regular slice of Node-s. A Group can render directly, but if any of the direct children are AttributeType, they will be ignored, to not produce invalid HTML.
Example ¶
package main
import (
"os"
g "alin.ovh/gomponents"
)
func main() {
children := []g.Node{g.El("div"), g.El("span")}
e := g.Group(children)
_ = e.Render(os.Stdout)
}
Output: <div></div><span></span>
Example (Slice) ¶
package main
import (
"os"
g "alin.ovh/gomponents"
)
func main() {
e := g.Group{g.El("div"), g.El("span")}
_ = e.Render(os.Stdout)
}
Output: <div></div><span></span>
func Map ¶
Map a slice of anything to a Group (which is just a slice of Node-s).
Example ¶
package main
import (
"os"
g "alin.ovh/gomponents"
)
func main() {
items := []string{"party hat", "super hat"}
e := g.El("ul", g.Map(items, func(i string) g.Node {
return g.El("li", g.Text(i))
}))
_ = e.Render(os.Stdout)
}
Output: <ul><li>party hat</li><li>super hat</li></ul>
func MapMap ¶
func MapMap[K comparable, T any](ts map[K]T, cb func(K, T) Node) Group
Map a map of anything to a Group (which is just a slice of Node-s).
Example ¶
package main
import (
"os"
g "alin.ovh/gomponents"
)
func main() {
items := map[string]string{"party": "hat"}
e := g.El("ul", g.MapMap(items, func(key string, value string) g.Node {
return g.El("li", g.Textf("%v: %v", key, value))
}))
_ = e.Render(os.Stdout)
}
Output: <ul><li>party: hat</li></ul>
func MapWithIndex ¶
Map a slice of anything to a Group (which is just a slice of Node-s).
Example ¶
package main
import (
"os"
g "alin.ovh/gomponents"
)
func main() {
items := []string{"party hat", "super hat"}
e := g.El("ul", g.MapWithIndex(items, func(index int, item string) g.Node {
return g.El("li", g.Textf("%v: %v", index, item))
}))
_ = e.Render(os.Stdout)
}
Output: <ul><li>0: party hat</li><li>1: super hat</li></ul>
type IterNode ¶
func MapIter ¶
Map an iterator of anything to an IterNode (which is just an iter.Seq of Node-s)
Example ¶
package main
import (
"os"
"slices"
g "alin.ovh/gomponents"
)
func main() {
items := slices.Values([]string{"party hat", "super hat"})
e := g.El("ul", g.MapIter(items, func(value string) g.Node {
return g.El("li", g.Text(value))
}))
_ = e.Render(os.Stdout)
}
Output: <ul><li>party hat</li><li>super hat</li></ul>
func MapIter2 ¶
Map an iterator of pairs of values to an IterNode (which is just an iter.Seq of Node-s)
Example ¶
package main
import (
"maps"
"os"
g "alin.ovh/gomponents"
)
func main() {
items := maps.All(map[string]string{"party": "hat", "super": "hat"})
e := g.El("ul", g.MapIter2(items, func(key string, value string) g.Node {
return g.El("li", g.Textf("%v: %v", key, value))
}))
_ = e.Render(os.Stdout)
}
Output: <ul><li>party: hat</li><li>super: hat</li></ul>
type Node ¶
Node is a DOM node that can Render itself to a io.Writer.
func Attr ¶
Attr creates an attribute DOM Node with a name and optional value. If only a name is passed, it's a name-only (boolean) attribute (like "required"). If a name and value are passed, it's a name-value attribute (like `class="header"`). More than one value make Attr panic. Use this if no convenience creator exists in the html package.
Example (Bool) ¶
package main
import (
"os"
g "alin.ovh/gomponents"
)
func main() {
e := g.El("input", g.Attr("required"))
_ = e.Render(os.Stdout)
}
Output: <input required>
Example (Name_value) ¶
package main
import (
"os"
g "alin.ovh/gomponents"
)
func main() {
e := g.El("div", g.Attr("id", "hat"))
_ = e.Render(os.Stdout)
}
Output: <div id="hat"></div>
func El ¶
El creates an element DOM Node with a name and child Nodes. See https://dev.w3.org/html5/spec-LC/syntax.html#elements-0 for how elements are rendered. No tags are ever omitted from normal tags, even though it's allowed for elements given at https://dev.w3.org/html5/spec-LC/syntax.html#optional-tags If an element is a void element, non-attribute children nodes are ignored. Use this if no convenience creator exists in the html package.
Example ¶
package main
import (
"os"
g "alin.ovh/gomponents"
)
func main() {
e := g.El("div", g.El("span"))
_ = e.Render(os.Stdout)
}
Output: <div><span></span></div>
func If ¶
If condition is true, return the given Node. Otherwise, return nil. This helper function is good for inlining elements conditionally. If it's important that the given Node is only evaluated if condition is true (for example, when using nilable variables), use Iff instead.
Example ¶
package main
import (
"os"
g "alin.ovh/gomponents"
)
func main() {
showMessage := true
e := g.El("div",
g.If(showMessage,
g.El("span", g.Text("You lost your hat!")),
g.El("span", g.Text("No messages.")),
),
)
_ = e.Render(os.Stdout)
}
Output: <div><span>You lost your hat!</span></div>
func Iff ¶
Iff condition is true, call the given function. Otherwise, return nil. This helper function is good for inlining elements conditionally when the node depends on nilable data, or some other code that could potentially panic. If you just need simple conditional rendering, see If.
Example ¶
package main
import (
"os"
g "alin.ovh/gomponents"
)
func main() {
type User struct {
Name string
}
var user *User
e := g.El("div",
// This would panic using just If
g.Iff(
user != nil,
func() g.Node {
return g.Text(user.Name)
},
func() g.Node {
return g.Text("No user")
},
),
)
_ = e.Render(os.Stdout)
}
Output: <div>No user</div>
func Raw ¶
Raw creates a text DOM Node that just Renders the unescaped string t.
Example ¶
package main
import (
"os"
g "alin.ovh/gomponents"
)
func main() {
e := g.El(
"span",
g.Raw(
`<button onclick="javascript:alert('Party time!')">Party hats</button> > normal hats.`,
),
)
_ = e.Render(os.Stdout)
}
Output: <span><button onclick="javascript:alert('Party time!')">Party hats</button> > normal hats.</span>
func Rawf ¶
Rawf creates a text DOM Node that just Renders the interpolated and unescaped string format.
Example ¶
package main
import (
"os"
g "alin.ovh/gomponents"
)
func main() {
e := g.El(
"span",
g.Rawf(
`<button onclick="javascript:alert('%v')">Party hats</button> > normal hats.`,
"Party time!",
),
)
_ = e.Render(os.Stdout)
}
Output: <span><button onclick="javascript:alert('Party time!')">Party hats</button> > normal hats.</span>
func Text ¶
Text creates a text DOM Node that Renders the escaped string t.
Example ¶
package main
import (
"os"
g "alin.ovh/gomponents"
)
func main() {
e := g.El("span", g.Text("Party hats > normal hats."))
_ = e.Render(os.Stdout)
}
Output: <span>Party hats > normal hats.</span>
func Textf ¶
Textf creates a text DOM Node that Renders the interpolated and escaped string format.
Example ¶
package main
import (
"os"
g "alin.ovh/gomponents"
)
func main() {
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>
type NodeFunc ¶
NodeFunc is a render function that is also a Node of ElementType.
type NodeType ¶
type NodeType int
NodeType describes what type of Node it is, currently either an ElementType or an AttributeType. This decides where a Node should be rendered. Nodes default to being ElementType.
type NodeWriter ¶ added in v1.8.0
NodeWriter is a Node that can also be used as an io.WriterTo
type NodeWriterFunc ¶ added in v1.8.0
NodeWriterFunc is a render function that is also a Node of ElementType.
func (NodeWriterFunc) Render ¶ added in v1.8.0
func (n NodeWriterFunc) Render(w io.Writer) error
Render satisfies Node.
func (NodeWriterFunc) String ¶ added in v1.8.0
func (n NodeWriterFunc) String() string
String satisfies fmt.Stringer.
func (NodeWriterFunc) Type ¶ added in v1.8.0
func (n NodeWriterFunc) Type() NodeType
Type satisfies [nodeTypeDescriber].
func (NodeWriterFunc) WriteTo ¶ added in v1.8.0
func (n NodeWriterFunc) WriteTo(w io.Writer) (int64, error)
WriteTo satisfies io.WriterTo.
Directories
¶
| Path | Synopsis |
|---|---|
|
Package components provides high-level components and helpers that are composed of low-level elements and attributes.
|
Package components provides high-level components and helpers that are composed of low-level elements and attributes. |
|
Package html provides common HTML elements and attributes.
|
Package html provides common HTML elements and attributes. |
|
Package http provides adapters to render gomponents in http handlers.
|
Package http provides adapters to render gomponents in http handlers. |
|
internal
|
|
|
assert
Package assert provides testing helpers.
|
Package assert provides testing helpers. |