etch

package module
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 5, 2024 License: MIT Imports: 6 Imported by: 0

README

Etch

Etch is a html generator that aims to be simple and reasonably fast.

If you need to render some html but you don't want to learn yet another templating language and their idiosyncharies. Etch uses plain old go functions to define and render html. That means that everything is (reasonably) type-safe and there's no additional compilations step.

Use

go get -u https://github.com/getwhitespace/etch

Usage

func LoginForm() Component {
    return Form(Class("settings-form"),
        Label(
            Text("Email:"),
            Input(Attr("type", "email"))
        ),
        Label(
            Text("Password:"),
            Input(Attr("type", "password"))
        ),
    )
}

str, err := RenderString(LoginForm())

fmt.Println(str)

// <form class="settings-form">
//   <label>Email:<input type="email" /></label>
//   <label>Password:<input type="password" /></label>
// </form>

Since everything is just a function, splitting up a component into smaller components is easy. This snippet renders the same html has the previous one.

func FormInput(label, typ string) Component {
    return Label(Text(label, ":"), Input(Attr("type", typ))),
}


func LoginForm() Component {
    return Form(Class("settings-form"),
        FormInput("Email", "email"),
        FormInput("Password", "password"),
    )
}

Design decisions

The api to build components should make the resulting go code look as close to the html it is representing as possible. This means that the api must be minimal.

For example, this creates a label with a text node and an input node as children.

Label(
    Text("Email:"),
    Input(Attr("type", "email")),
)

This is fairly close to the html it is producing.

<label>
  Email:
  <input type="email" />
</label>

This api enables Etch to make a single pass through the component tree to render the html.

To make the single pass render work there's a limitation that all attributes must be put before nodes in the argument list.


// ✅ OK
Label(Attr("class", "input-label"), Text("Email:"))

// ❌ Not OK
Label(Text("Email:"), Attr("class", "input-label"))

// an error will be returned and the attribute will be ignored

Component

HTML

See: nodes.go

Every element in https://developer.mozilla.org/en-US/docs/Web/HTML/Element

SVG

See: svg/nodes.go

Every element in https://developer.mozilla.org/en-US/docs/Web/SVG/Element

Helpers

// render multiple attributes
func Attrs(values ...any) Component

// render `x` if `cond` == true otherwise render `y`
func If[T any](cond bool, x, y T) T

// render `x`` if `cond` == true otherwise nothing
func When[T any](cond bool, x T) *T

// iterate over a slice and render the return value of `fn`
func For[T any](items []T, fn func(item T) Component) Component

// iterate over a slice with indices and render the return value of `fn`
func ForIndex[T any](items []T, fn func(i int) Component) Component

// iterate `count` times
func Times(count int, fn func(i int) Component) Component

// sugar for Attr("class", values)
func Class(values ...any) Component

// sugar for Attr("id", values)
func Id(values ...any) Component

Roadmap-ish

  • Optionally indent output
  • Add more relevant helpers
  • Add partial rendering. Useful for frontend libraries like htmx.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Escape

func Escape(a any) string

func If

func If[T any](cond bool, x, y T) T

func Render

func Render(c Component, w io.Writer) error

func RenderBytes

func RenderBytes(c Component) ([]byte, error)

func RenderString

func RenderString(c Component) (string, error)

func When

func When[T any](cond bool, x T) *T

Types

type Component

type Component = func(sb *Renderer)

func A

func A(args ...Component) Component

generated html nodes

func Abbr

func Abbr(args ...Component) Component

func Acronym

func Acronym(args ...Component) Component

func Address

func Address(args ...Component) Component

func Area

func Area(args ...Component) Component

func Article

func Article(args ...Component) Component

func Aside

func Aside(args ...Component) Component

func Attr

func Attr(name string, values ...any) Component

func AttrNS

func AttrNS(namespace string, name string, values ...any) Component

func Attrs

func Attrs(values ...any) Component

func Audio

func Audio(args ...Component) Component

func B

func B(args ...Component) Component

func Base

func Base(args ...Component) Component

func Bdi

func Bdi(args ...Component) Component

func Bdo

func Bdo(args ...Component) Component

func Big

func Big(args ...Component) Component

func Blockquote

func Blockquote(args ...Component) Component

func Body

func Body(args ...Component) Component

func Br

func Br(args ...Component) Component

func Button

func Button(args ...Component) Component

func Canvas

func Canvas(args ...Component) Component

func Caption

func Caption(args ...Component) Component

func Center

func Center(args ...Component) Component

func Cite

func Cite(args ...Component) Component

func Class

func Class(values ...any) Component

func Code

func Code(args ...Component) Component

func Col

func Col(args ...Component) Component

func Colgroup

func Colgroup(args ...Component) Component

func Data

func Data(args ...Component) Component

func Datalist

func Datalist(args ...Component) Component

func Dd

func Dd(args ...Component) Component

func Del

func Del(args ...Component) Component

func Details

func Details(args ...Component) Component

func Dfn

func Dfn(args ...Component) Component

func Dialog

func Dialog(args ...Component) Component

func Dir

func Dir(args ...Component) Component

func Div

func Div(args ...Component) Component

func Dl

func Dl(args ...Component) Component

func Dt

func Dt(args ...Component) Component

func Em

func Em(args ...Component) Component

func Embed

func Embed(args ...Component) Component

func Fieldset

func Fieldset(args ...Component) Component

func Figcaption

func Figcaption(args ...Component) Component

func Figure

func Figure(args ...Component) Component

func Font

func Font(args ...Component) Component
func Footer(args ...Component) Component

func For

func For[T any](items []T, fn func(item T) Component) Component

func ForIndex

func ForIndex[T any](items []T, fn func(i int) Component) Component

func Form

func Form(args ...Component) Component

func Fragment

func Fragment(args ...Component) Component

func Frame

func Frame(args ...Component) Component

func Frameset

func Frameset(args ...Component) Component

func H1

func H1(args ...Component) Component

func H2

func H2(args ...Component) Component

func H3

func H3(args ...Component) Component

func H4

func H4(args ...Component) Component

func H5

func H5(args ...Component) Component

func H6

func H6(args ...Component) Component
func Head(args ...Component) Component
func Header(args ...Component) Component

func Hgroup

func Hgroup(args ...Component) Component

func Hr

func Hr(args ...Component) Component

func Html

func Html(args ...Component) Component

func I

func I(args ...Component) Component

func Id

func Id(values ...any) Component

func Iframe

func Iframe(args ...Component) Component

func Image

func Image(args ...Component) Component

func Img

func Img(args ...Component) Component

func Input

func Input(args ...Component) Component

func Ins

func Ins(args ...Component) Component

func Kbd

func Kbd(args ...Component) Component

func Label

func Label(args ...Component) Component

func Legend

func Legend(args ...Component) Component

func Li

func Li(args ...Component) Component
func Link(args ...Component) Component

func Main

func Main(args ...Component) Component

func Map

func Map(args ...Component) Component

func Mark

func Mark(args ...Component) Component

func Marquee

func Marquee(args ...Component) Component
func Menu(args ...Component) Component
func Menuitem(args ...Component) Component

func Meta

func Meta(args ...Component) Component

func Meter

func Meter(args ...Component) Component
func Nav(args ...Component) Component

func Nobr

func Nobr(args ...Component) Component

func Node

func Node(tag string, args []Component) Component

func Noembed

func Noembed(args ...Component) Component

func Noframes

func Noframes(args ...Component) Component

func Noscript

func Noscript(args ...Component) Component

func Object

func Object(args ...Component) Component

func Ol

func Ol(args ...Component) Component

func Optgroup

func Optgroup(args ...Component) Component

func Option

func Option(args ...Component) Component

func Output

func Output(args ...Component) Component

func P

func P(args ...Component) Component

func Param

func Param(args ...Component) Component

func Picture

func Picture(args ...Component) Component

func Plaintext

func Plaintext(args ...Component) Component

func Portal

func Portal(args ...Component) Component

func Pre

func Pre(args ...Component) Component

func Progress

func Progress(args ...Component) Component

func Q

func Q(args ...Component) Component

func Raw

func Raw(args ...any) Component

func Rb

func Rb(args ...Component) Component

func Rp

func Rp(args ...Component) Component

func Rt

func Rt(args ...Component) Component

func Rtc

func Rtc(args ...Component) Component

func Ruby

func Ruby(args ...Component) Component

func S

func S(args ...Component) Component

func Samp

func Samp(args ...Component) Component

func Script

func Script(args ...Component) Component
func Search(args ...Component) Component

func Section

func Section(args ...Component) Component

func Select

func Select(args ...Component) Component

func Slot

func Slot(args ...Component) Component

func Small

func Small(args ...Component) Component

func Source

func Source(args ...Component) Component

func Span

func Span(args ...Component) Component

func Strike

func Strike(args ...Component) Component

func Strong

func Strong(args ...Component) Component

func Style

func Style(args ...Component) Component

func Sub

func Sub(args ...Component) Component

func Summary

func Summary(args ...Component) Component

func Sup

func Sup(args ...Component) Component

func Table

func Table(args ...Component) Component

func Tbody

func Tbody(args ...Component) Component

func Td

func Td(args ...Component) Component

func Template

func Template(args ...Component) Component

func Text

func Text(args ...any) Component

func Textarea

func Textarea(args ...Component) Component

func Tfoot

func Tfoot(args ...Component) Component

func Th

func Th(args ...Component) Component

func Thead

func Thead(args ...Component) Component

func Time

func Time(args ...Component) Component

func Times

func Times(count int, fn func(i int) Component) Component

func Title

func Title(args ...Component) Component

func Tr

func Tr(args ...Component) Component

func Track

func Track(args ...Component) Component

func Tt

func Tt(args ...Component) Component

func U

func U(args ...Component) Component

func Ul

func Ul(args ...Component) Component

func Var

func Var(args ...Component) Component

func Video

func Video(args ...Component) Component

func Wbr

func Wbr(args ...Component) Component

func Xmp

func Xmp(args ...Component) Component

type Renderer

type Renderer struct {
	// contains filtered or unexported fields
}

func NewRenderer

func NewRenderer() *Renderer

func (*Renderer) Render

func (r *Renderer) Render(c Component, w io.Writer) error

func (*Renderer) RenderBytes

func (r *Renderer) RenderBytes(c Component) ([]byte, error)

func (*Renderer) RenderString

func (r *Renderer) RenderString(c Component) (string, error)

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL