123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- 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("</" + 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
- }
|