diff options
author | Steve Manuel <nilslice@gmail.com> | 2016-12-20 09:28:51 -0800 |
---|---|---|
committer | Steve Manuel <nilslice@gmail.com> | 2016-12-20 09:28:51 -0800 |
commit | 02b396de26ca7f58b8e8134fbaa098f5af49b911 (patch) | |
tree | e5e14d0d89947ae6a8704f4e28be379262536494 /management/editor/dom.go | |
parent | 9b7ee17fe3b43cedb151760215644591a6971d5a (diff) |
splitting up elements file into more logical parts, testing godoc feature;
Diffstat (limited to 'management/editor/dom.go')
-rw-r--r-- | management/editor/dom.go | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/management/editor/dom.go b/management/editor/dom.go new file mode 100644 index 0000000..cf36ad9 --- /dev/null +++ b/management/editor/dom.go @@ -0,0 +1,136 @@ +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(`<div class="input-field col s12">`)) + if e.label != "" { + e.viewBuf.Write([]byte(`<label class="active" for="` + strings.Join(strings.Split(e.label, " "), "-") + `">` + e.label + `</label>`)) + } + 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(`</div>`)) + 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(`<p class="col s6">`)) + 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(`<label for="` + strings.Join(strings.Split(e.label, " "), "-") + `">` + e.label + `</label>`)) + } + e.viewBuf.Write([]byte(`</p>`)) + return e.viewBuf.Bytes() +} + +// domElement creates a DOM element +func domElement(e *element) []byte { + e.viewBuf.Write([]byte(`<div class="input-field col s12">`)) + + if e.label != "" { + e.viewBuf.Write([]byte(`<label class="active" for="` + strings.Join(strings.Split(e.label, " "), "-") + `">` + e.label + `</label>`)) + } + 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(` >`)) + + e.viewBuf.Write([]byte(html.EscapeString(e.data))) + e.viewBuf.Write([]byte(`</` + e.TagName + `>`)) + + e.viewBuf.Write([]byte(`</div>`)) + return e.viewBuf.Bytes() +} + +func domElementWithChildrenSelect(e *element, children []*element) []byte { + e.viewBuf.Write([]byte(`<div class="input-field col s6">`)) + + 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(`<label class="active">` + e.label + `</label>`)) + } + + e.viewBuf.Write([]byte(`</div>`)) + 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(`<label class="active">` + e.label + `</label>`)) + } + + // loop over children and create domElement for each child + for _, child := range children { + e.viewBuf.Write(domElementCheckbox(child)) + } + + e.viewBuf.Write([]byte(`</` + e.TagName + `><div class="clear padding"> </div>`)) + + return e.viewBuf.Bytes() +} |