github.com/bosssauce/ponzu@v0.11.1-0.20200102001432-9bc41b703131/management/editor/dom.go (about) 1 package editor 2 3 import ( 4 "bytes" 5 "html" 6 "log" 7 "strings" 8 ) 9 10 // Element is a basic struct for representing DOM elements 11 type Element struct { 12 TagName string 13 Attrs map[string]string 14 Name string 15 Label string 16 Data string 17 ViewBuf *bytes.Buffer 18 } 19 20 // NewElement returns an Element with Name and Data already processed from the 21 // fieldName and content interface provided 22 func NewElement(tagName, label, fieldName string, p interface{}, attrs map[string]string) *Element { 23 return &Element{ 24 TagName: tagName, 25 Attrs: attrs, 26 Name: TagNameFromStructField(fieldName, p), 27 Label: label, 28 Data: ValueFromStructField(fieldName, p), 29 ViewBuf: &bytes.Buffer{}, 30 } 31 } 32 33 // DOMElementSelfClose is a special DOM element which is parsed as a 34 // self-closing tag and thus needs to be created differently 35 func DOMElementSelfClose(e *Element) []byte { 36 _, err := e.ViewBuf.WriteString(`<div class="input-field col s12">`) 37 if err != nil { 38 log.Println("Error writing HTML string to buffer: DOMElementSelfClose") 39 return nil 40 } 41 42 if e.Label != "" { 43 _, err = e.ViewBuf.WriteString( 44 `<label class="active" for="` + 45 strings.Join(strings.Split(e.Label, " "), "-") + `">` + e.Label + 46 `</label>`) 47 if err != nil { 48 log.Println("Error writing HTML string to buffer: DOMElementSelfClose") 49 return nil 50 } 51 } 52 53 _, err = e.ViewBuf.WriteString(`<` + e.TagName + ` value="`) 54 if err != nil { 55 log.Println("Error writing HTML string to buffer: DOMElementSelfClose") 56 return nil 57 } 58 59 _, err = e.ViewBuf.WriteString(html.EscapeString(e.Data) + `" `) 60 if err != nil { 61 log.Println("Error writing HTML string to buffer: DOMElementSelfClose") 62 return nil 63 } 64 65 for attr, value := range e.Attrs { 66 _, err := e.ViewBuf.WriteString(attr + `="` + value + `" `) 67 if err != nil { 68 log.Println("Error writing HTML string to buffer: DOMElementSelfClose") 69 return nil 70 } 71 } 72 _, err = e.ViewBuf.WriteString(` name="` + e.Name + `" />`) 73 if err != nil { 74 log.Println("Error writing HTML string to buffer: DOMElementSelfClose") 75 return nil 76 } 77 78 _, err = e.ViewBuf.WriteString(`</div>`) 79 if err != nil { 80 log.Println("Error writing HTML string to buffer: DOMElementSelfClose") 81 return nil 82 } 83 84 return e.ViewBuf.Bytes() 85 } 86 87 // DOMElementCheckbox is a special DOM element which is parsed as a 88 // checkbox input tag and thus needs to be created differently 89 func DOMElementCheckbox(e *Element) []byte { 90 _, err := e.ViewBuf.WriteString(`<p class="col s6">`) 91 if err != nil { 92 log.Println("Error writing HTML string to buffer: DOMElementCheckbox") 93 return nil 94 } 95 96 _, err = e.ViewBuf.WriteString(`<` + e.TagName + ` `) 97 if err != nil { 98 log.Println("Error writing HTML string to buffer: DOMElementCheckbox") 99 return nil 100 } 101 102 for attr, value := range e.Attrs { 103 _, err := e.ViewBuf.WriteString(attr + `="` + value + `" `) 104 if err != nil { 105 log.Println("Error writing HTML string to buffer: DOMElementCheckbox") 106 return nil 107 } 108 } 109 _, err = e.ViewBuf.WriteString(` name="` + e.Name + `" />`) 110 if err != nil { 111 log.Println("Error writing HTML string to buffer: DOMElementCheckbox") 112 return nil 113 } 114 115 if e.Label != "" { 116 _, err = e.ViewBuf.WriteString( 117 `<label for="` + 118 strings.Join(strings.Split(e.Label, " "), "-") + `">` + 119 e.Label + `</label>`) 120 if err != nil { 121 log.Println("Error writing HTML string to buffer: DOMElementCheckbox") 122 return nil 123 } 124 } 125 126 _, err = e.ViewBuf.WriteString(`</p>`) 127 if err != nil { 128 log.Println("Error writing HTML string to buffer: DOMElementCheckbox") 129 return nil 130 } 131 132 return e.ViewBuf.Bytes() 133 } 134 135 // DOMElement creates a DOM element 136 func DOMElement(e *Element) []byte { 137 _, err := e.ViewBuf.WriteString(`<div class="input-field col s12">`) 138 if err != nil { 139 log.Println("Error writing HTML string to buffer: DOMElement") 140 return nil 141 } 142 143 if e.Label != "" { 144 _, err = e.ViewBuf.WriteString( 145 `<label class="active" for="` + 146 strings.Join(strings.Split(e.Label, " "), "-") + `">` + e.Label + 147 `</label>`) 148 if err != nil { 149 log.Println("Error writing HTML string to buffer: DOMElement") 150 return nil 151 } 152 } 153 154 _, err = e.ViewBuf.WriteString(`<` + e.TagName + ` `) 155 if err != nil { 156 log.Println("Error writing HTML string to buffer: DOMElement") 157 return nil 158 } 159 160 for attr, value := range e.Attrs { 161 _, err = e.ViewBuf.WriteString(attr + `="` + string(value) + `" `) 162 if err != nil { 163 log.Println("Error writing HTML string to buffer: DOMElement") 164 return nil 165 } 166 } 167 _, err = e.ViewBuf.WriteString(` name="` + e.Name + `" >`) 168 if err != nil { 169 log.Println("Error writing HTML string to buffer: DOMElement") 170 return nil 171 } 172 173 _, err = e.ViewBuf.WriteString(html.EscapeString(e.Data)) 174 if err != nil { 175 log.Println("Error writing HTML string to buffer: DOMElement") 176 return nil 177 } 178 179 _, err = e.ViewBuf.WriteString(`</` + e.TagName + `>`) 180 if err != nil { 181 log.Println("Error writing HTML string to buffer: DOMElement") 182 return nil 183 } 184 185 _, err = e.ViewBuf.WriteString(`</div>`) 186 if err != nil { 187 log.Println("Error writing HTML string to buffer: DOMElement") 188 return nil 189 } 190 191 return e.ViewBuf.Bytes() 192 } 193 194 func DOMElementWithChildrenSelect(e *Element, children []*Element) []byte { 195 _, err := e.ViewBuf.WriteString(`<div class="input-field col s6">`) 196 if err != nil { 197 log.Println("Error writing HTML string to buffer: DOMElementWithChildrenSelect") 198 return nil 199 } 200 201 _, err = e.ViewBuf.WriteString(`<` + e.TagName + ` `) 202 if err != nil { 203 log.Println("Error writing HTML string to buffer: DOMElementWithChildrenSelect") 204 return nil 205 } 206 207 for attr, value := range e.Attrs { 208 _, err = e.ViewBuf.WriteString(attr + `="` + value + `" `) 209 if err != nil { 210 log.Println("Error writing HTML string to buffer: DOMElementWithChildrenSelect") 211 return nil 212 } 213 } 214 _, err = e.ViewBuf.WriteString(` name="` + e.Name + `" >`) 215 if err != nil { 216 log.Println("Error writing HTML string to buffer: DOMElementWithChildrenSelect") 217 return nil 218 } 219 220 // loop over children and create DOMElement for each child 221 for _, child := range children { 222 _, err = e.ViewBuf.Write(DOMElement(child)) 223 if err != nil { 224 log.Println("Error writing HTML DOMElement to buffer: DOMElementWithChildrenSelect") 225 return nil 226 } 227 } 228 229 _, err = e.ViewBuf.WriteString(`</` + e.TagName + `>`) 230 if err != nil { 231 log.Println("Error writing HTML string to buffer: DOMElementWithChildrenSelect") 232 return nil 233 } 234 235 if e.Label != "" { 236 _, err = e.ViewBuf.WriteString(`<label class="active">` + e.Label + `</label>`) 237 if err != nil { 238 log.Println("Error writing HTML string to buffer: DOMElementWithChildrenSelect") 239 return nil 240 } 241 } 242 243 _, err = e.ViewBuf.WriteString(`</div>`) 244 if err != nil { 245 log.Println("Error writing HTML string to buffer: DOMElementWithChildrenSelect") 246 return nil 247 } 248 249 return e.ViewBuf.Bytes() 250 } 251 252 func DOMElementWithChildrenCheckbox(e *Element, children []*Element) []byte { 253 _, err := e.ViewBuf.WriteString(`<` + e.TagName + ` `) 254 if err != nil { 255 log.Println("Error writing HTML string to buffer: DOMElementWithChildrenCheckbox") 256 return nil 257 } 258 259 for attr, value := range e.Attrs { 260 _, err = e.ViewBuf.WriteString(attr + `="` + value + `" `) 261 if err != nil { 262 log.Println("Error writing HTML string to buffer: DOMElementWithChildrenCheckbox") 263 return nil 264 } 265 } 266 267 _, err = e.ViewBuf.WriteString(` >`) 268 if err != nil { 269 log.Println("Error writing HTML string to buffer: DOMElementWithChildrenCheckbox") 270 return nil 271 } 272 273 if e.Label != "" { 274 _, err = e.ViewBuf.WriteString(`<label class="active">` + e.Label + `</label>`) 275 if err != nil { 276 log.Println("Error writing HTML string to buffer: DOMElementWithChildrenCheckbox") 277 return nil 278 } 279 } 280 281 // loop over children and create DOMElement for each child 282 for _, child := range children { 283 _, err = e.ViewBuf.Write(DOMElementCheckbox(child)) 284 if err != nil { 285 log.Println("Error writing HTML DOMElementCheckbox to buffer: DOMElementWithChildrenCheckbox") 286 return nil 287 } 288 } 289 290 _, err = e.ViewBuf.WriteString(`</` + e.TagName + `><div class="clear padding"> </div>`) 291 if err != nil { 292 log.Println("Error writing HTML string to buffer: DOMElementWithChildrenCheckbox") 293 return nil 294 } 295 296 return e.ViewBuf.Bytes() 297 }