|
@@ -2,14 +2,24 @@ 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 {
|
|
@@ -18,6 +28,9 @@ func renderTag(tag string, attrs Attrs, content string) string {
|
|
|
br.WriteString("<" + tag)
|
|
|
if len(attrs) > 0 {
|
|
|
for k, v := range attrs {
|
|
|
+ if atom.Lookup([]byte(k)) == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
br.WriteString(" " + k + "=\"" + v + "\" ")
|
|
|
}
|
|
|
}
|
|
@@ -33,6 +46,9 @@ func beginTag(tag string, attrs Attrs) string {
|
|
|
br.WriteString("<" + tag)
|
|
|
if len(attrs) > 0 {
|
|
|
for k, v := range attrs {
|
|
|
+ if atom.Lookup([]byte(k)) == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
br.WriteString(" " + k + "=\"" + v + "\" ")
|
|
|
}
|
|
|
}
|
|
@@ -46,3 +62,29 @@ func endTag(tag string) string {
|
|
|
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
|
|
|
+}
|