package editor
import (
"bytes"
"html"
"strings"
)
type element struct {
TagName string
Attrs map[string]string
Name string
label string
data string
viewBuf *bytes.Buffer
}
func newElement(tagName, label, fieldName string, p interface{}, attrs map[string]string) *element {
return &element{
TagName: tagName,
Attrs: attrs,
Name: tagNameFromStructField(fieldName, p),
label: label,
data: valueFromStructField(fieldName, p),
viewBuf: &bytes.Buffer{},
}
}
// domElementSelfClose is a special DOM element which is parsed as a
// self-closing tag and thus needs to be created differently
func domElementSelfClose(e *element) []byte {
e.viewBuf.Write([]byte(`
`))
if e.label != "" {
e.viewBuf.Write([]byte(``))
}
e.viewBuf.Write([]byte(`<` + e.TagName + ` value="`))
e.viewBuf.Write([]byte(html.EscapeString(e.data) + `" `))
for attr, value := range e.Attrs {
e.viewBuf.Write([]byte(attr + `="` + value + `" `))
}
e.viewBuf.Write([]byte(` name="` + e.Name + `"`))
e.viewBuf.Write([]byte(` />`))
e.viewBuf.Write([]byte(`
`))
return e.viewBuf.Bytes()
}
// domElementCheckbox is a special DOM element which is parsed as a
// checkbox input tag and thus needs to be created differently
func domElementCheckbox(e *element) []byte {
e.viewBuf.Write([]byte(`
`))
e.viewBuf.Write([]byte(`<` + e.TagName + ` `))
for attr, value := range e.Attrs {
e.viewBuf.Write([]byte(attr + `="` + value + `" `))
}
e.viewBuf.Write([]byte(` name="` + e.Name + `"`))
e.viewBuf.Write([]byte(` /> `))
if e.label != "" {
e.viewBuf.Write([]byte(``))
}
e.viewBuf.Write([]byte(`
`))
return e.viewBuf.Bytes()
}
// domElement creates a DOM element
func domElement(e *element) []byte {
e.viewBuf.Write([]byte(`
`))
e.viewBuf.Write([]byte(`<` + e.TagName + ` `))
for attr, value := range e.Attrs {
e.viewBuf.Write([]byte(attr + `="` + string(value) + `" `))
}
e.viewBuf.Write([]byte(` name="` + e.Name + `"`))
e.viewBuf.Write([]byte(` >`))
// loop over children and create domElement for each child
for _, child := range children {
e.viewBuf.Write(domElement(child))
}
e.viewBuf.Write([]byte(`` + e.TagName + `>`))
if e.label != "" {
e.viewBuf.Write([]byte(``))
}
e.viewBuf.Write([]byte(`
`))
return e.viewBuf.Bytes()
}
func domElementWithChildrenCheckbox(e *element, children []*element) []byte {
e.viewBuf.Write([]byte(`<` + e.TagName + ` `))
for attr, value := range e.Attrs {
e.viewBuf.Write([]byte(attr + `="` + value + `" `))
}
e.viewBuf.Write([]byte(` >`))
if e.label != "" {
e.viewBuf.Write([]byte(``))
}
// loop over children and create domElement for each child
for _, child := range children {
e.viewBuf.Write(domElementCheckbox(child))
}
e.viewBuf.Write([]byte(`` + e.TagName + `>