package editor
import (
"bytes"
"html"
"log"
"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 {
_, err := e.viewBuf.WriteString(`
`)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementSelfClose")
return nil
}
if e.label != "" {
_, err = e.viewBuf.WriteString(
``)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementSelfClose")
return nil
}
}
_, err = e.viewBuf.WriteString(`<` + e.tagName + ` value="`)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementSelfClose")
return nil
}
_, err = e.viewBuf.WriteString(html.EscapeString(e.data) + `" `)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementSelfClose")
return nil
}
for attr, value := range e.attrs {
_, err := e.viewBuf.WriteString(attr + `="` + value + `" `)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementSelfClose")
return nil
}
}
_, err = e.viewBuf.WriteString(` name="` + e.name + `" />`)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementSelfClose")
return nil
}
_, err = e.viewBuf.WriteString(`
`)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementSelfClose")
return nil
}
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 {
_, err := e.viewBuf.WriteString(`
`)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementCheckbox")
return nil
}
_, err = e.viewBuf.WriteString(`<` + e.tagName + ` `)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementCheckbox")
return nil
}
for attr, value := range e.attrs {
_, err := e.viewBuf.WriteString(attr + `="` + value + `" `)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementCheckbox")
return nil
}
}
_, err = e.viewBuf.WriteString(` name="` + e.name + `" />`)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementCheckbox")
return nil
}
if e.label != "" {
_, err = e.viewBuf.WriteString(
``)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementCheckbox")
return nil
}
}
_, err = e.viewBuf.WriteString(`
`)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementCheckbox")
return nil
}
return e.viewBuf.Bytes()
}
// domElement creates a DOM element
func domElement(e *element) []byte {
_, err := e.viewBuf.WriteString(`
`)
if err != nil {
log.Println("Error writing HTML string to buffer: domElement")
return nil
}
if e.label != "" {
_, err = e.viewBuf.WriteString(
``)
if err != nil {
log.Println("Error writing HTML string to buffer: domElement")
return nil
}
}
_, err = e.viewBuf.WriteString(`<` + e.tagName + ` `)
if err != nil {
log.Println("Error writing HTML string to buffer: domElement")
return nil
}
for attr, value := range e.attrs {
_, err = e.viewBuf.WriteString(attr + `="` + string(value) + `" `)
if err != nil {
log.Println("Error writing HTML string to buffer: domElement")
return nil
}
}
_, err = e.viewBuf.WriteString(` name="` + e.name + `" > `)
if err != nil {
log.Println("Error writing HTML string to buffer: domElement")
return nil
}
_, err = e.viewBuf.WriteString(html.EscapeString(e.data))
if err != nil {
log.Println("Error writing HTML string to buffer: domElement")
return nil
}
_, err = e.viewBuf.WriteString(`` + e.tagName + `>`)
if err != nil {
log.Println("Error writing HTML string to buffer: domElement")
return nil
}
_, err = e.viewBuf.WriteString(`
`)
if err != nil {
log.Println("Error writing HTML string to buffer: domElement")
return nil
}
return e.viewBuf.Bytes()
}
func domElementWithChildrenSelect(e *element, children []*element) []byte {
_, err := e.viewBuf.WriteString(`
`)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementWithChildrenSelect")
return nil
}
_, err = e.viewBuf.WriteString(`<` + e.tagName + ` `)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementWithChildrenSelect")
return nil
}
for attr, value := range e.attrs {
_, err = e.viewBuf.WriteString(attr + `="` + value + `" `)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementWithChildrenSelect")
return nil
}
}
_, err = e.viewBuf.WriteString(` name="` + e.name + `" >`)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementWithChildrenSelect")
return nil
}
// loop over children and create domElement for each child
for _, child := range children {
_, err = e.viewBuf.Write(domElement(child))
if err != nil {
log.Println("Error writing HTML domElement to buffer: domElementWithChildrenSelect")
return nil
}
}
_, err = e.viewBuf.WriteString(`` + e.tagName + `>`)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementWithChildrenSelect")
return nil
}
if e.label != "" {
_, err = e.viewBuf.WriteString(``)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementWithChildrenSelect")
return nil
}
}
_, err = e.viewBuf.WriteString(`
`)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementWithChildrenSelect")
return nil
}
return e.viewBuf.Bytes()
}
func domElementWithChildrenCheckbox(e *element, children []*element) []byte {
_, err := e.viewBuf.WriteString(`<` + e.tagName + ` `)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementWithChildrenCheckbox")
return nil
}
for attr, value := range e.attrs {
_, err = e.viewBuf.WriteString(attr + `="` + value + `" `)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementWithChildrenCheckbox")
return nil
}
}
_, err = e.viewBuf.WriteString(` >`)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementWithChildrenCheckbox")
return nil
}
if e.label != "" {
_, err = e.viewBuf.WriteString(``)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementWithChildrenCheckbox")
return nil
}
}
// loop over children and create domElement for each child
for _, child := range children {
_, err = e.viewBuf.Write(domElementCheckbox(child))
if err != nil {
log.Println("Error writing HTML domElementCheckbox to buffer: domElementWithChildrenCheckbox")
return nil
}
}
_, err = e.viewBuf.WriteString(`` + e.tagName + `>
`)
if err != nil {
log.Println("Error writing HTML string to buffer: domElementWithChildrenCheckbox")
return nil
}
return e.viewBuf.Bytes()
}