12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- package element
- import (
- "git.nspix.com/golang/pgenr/internal/pool"
- "golang.org/x/net/html/atom"
- "html"
- "strconv"
- "strings"
- )
- 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 !strings.HasPrefix(k, "data-") {
- if atom.Lookup([]byte(k)) == 0 {
- continue
- }
- }
- br.WriteString(" " + k + "=" + strconv.Quote(v))
- }
- }
- br.WriteString(">")
- br.WriteString(content)
- br.WriteString("</" + tag + ">")
- 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("</" + tag + ">")
- 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
- }
|