package editor import ( "bytes" "html" "log" "strings" ) // Element is a basic struct for representing DOM elements type Element struct { TagName string Attrs map[string]string Name string Label string Data string ViewBuf *bytes.Buffer } // NewElement returns an Element with Name and Data already processed from the // fieldName and content interface provided 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(``) 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(``) 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(`
 
`) if err != nil { log.Println("Error writing HTML string to buffer: DOMElementWithChildrenCheckbox") return nil } return e.ViewBuf.Bytes() }