package element import ( "git.nspix.com/golang/pgenr/internal/pool" "golang.org/x/net/html/atom" "html" ) type ( Option func(t *element) Element interface { Html() string } Attrs map[string]string element struct { Name atom.Atom Attr Attrs Content string } ) func renderTag(tag string, attrs Attrs, content string) string { br := pool.Get() defer pool.Put(br) br.WriteString("<" + tag) if len(attrs) > 0 { for k, v := range attrs { if atom.Lookup([]byte(k)) == 0 { continue } br.WriteString(" " + k + "=\"" + v + "\" ") } } br.WriteString(">") br.WriteString(content) br.WriteString("") return br.String() } func beginTag(tag string, attrs Attrs) string { br := pool.Get() defer pool.Put(br) br.WriteString("<" + tag) if len(attrs) > 0 { for k, v := range attrs { if atom.Lookup([]byte(k)) == 0 { continue } br.WriteString(" " + k + "=\"" + v + "\" ") } } br.WriteString(">") return br.String() } func endTag(tag string) string { br := pool.Get() defer pool.Put(br) br.WriteString("") return br.String() } func WithAttribute(label string, value string) Option { return func(t *element) { if t.Attr == nil { t.Attr = make(map[string]string) } t.Attr[label] = value } } func (element *element) Html() string { return element.String() } func (element *element) String() string { return renderTag(element.Name.String(), element.Attr, html.EscapeString(element.Content)) } func NewElement(atom atom.Atom, content string, opts ...Option) *element { e := &element{Name: atom, Content: content} for _, cb := range opts { cb(e) } return e }