diff options
Diffstat (limited to 'management')
-rw-r--r-- | management/editor/dom.go | 258 | ||||
-rw-r--r-- | management/editor/editor.go | 54 | ||||
-rw-r--r-- | management/editor/elements.go | 34 | ||||
-rw-r--r-- | management/editor/repeaters.go | 94 |
4 files changed, 343 insertions, 97 deletions
diff --git a/management/editor/dom.go b/management/editor/dom.go index cf36ad9..41aafa7 100644 --- a/management/editor/dom.go +++ b/management/editor/dom.go @@ -3,13 +3,14 @@ package editor import ( "bytes" "html" + "log" "strings" ) type element struct { - TagName string - Attrs map[string]string - Name string + tagName string + attrs map[string]string + name string label string data string viewBuf *bytes.Buffer @@ -17,9 +18,9 @@ type element struct { func newElement(tagName, label, fieldName string, p interface{}, attrs map[string]string) *element { return &element{ - TagName: tagName, - Attrs: attrs, - Name: tagNameFromStructField(fieldName, p), + tagName: tagName, + attrs: attrs, + name: tagNameFromStructField(fieldName, p), label: label, data: valueFromStructField(fieldName, p), viewBuf: &bytes.Buffer{}, @@ -29,108 +30,265 @@ func newElement(tagName, label, fieldName string, p interface{}, attrs map[strin // 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">`)) + _, err := e.viewBuf.WriteString(`<div class="input-field col s12">`) + if err != nil { + log.Println("Error writing HTML string to buffer: domElementSelfClose") + return nil + } + if e.label != "" { - e.viewBuf.Write([]byte(`<label class="active" for="` + strings.Join(strings.Split(e.label, " "), "-") + `">` + e.label + `</label>`)) + _, err = e.viewBuf.WriteString( + `<label class="active" for="` + + strings.Join(strings.Split(e.label, " "), "-") + `">` + e.label + + `</label>`) + 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 } - 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 + `" `)) + _, err = e.viewBuf.WriteString(`</div>`) + if err != nil { + log.Println("Error writing HTML string to buffer: domElementSelfClose") + return nil } - 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 + ` `)) + _, err := e.viewBuf.WriteString(`<p class="col s6">`) + 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 { - e.viewBuf.Write([]byte(attr + `="` + value + `" `)) + 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 + } } - e.viewBuf.Write([]byte(` name="` + e.Name + `"`)) - e.viewBuf.Write([]byte(` /> `)) + _, err = e.viewBuf.WriteString(` name="` + e.name + `" />`) + if err != nil { + log.Println("Error writing HTML string to buffer: domElementCheckbox") + return nil + } + if e.label != "" { - e.viewBuf.Write([]byte(`<label for="` + strings.Join(strings.Split(e.label, " "), "-") + `">` + e.label + `</label>`)) + _, err = e.viewBuf.WriteString( + `<label for="` + + strings.Join(strings.Split(e.label, " "), "-") + `">` + + e.label + `</label>`) + if err != nil { + log.Println("Error writing HTML string to buffer: domElementCheckbox") + return nil + } } - e.viewBuf.Write([]byte(`</p>`)) + + _, err = e.viewBuf.WriteString(`</p>`) + 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 { - e.viewBuf.Write([]byte(`<div class="input-field col s12">`)) + _, err := e.viewBuf.WriteString(`<div class="input-field col s12">`) + if err != nil { + log.Println("Error writing HTML string to buffer: domElement") + return nil + } if e.label != "" { - e.viewBuf.Write([]byte(`<label class="active" for="` + strings.Join(strings.Split(e.label, " "), "-") + `">` + e.label + `</label>`)) + _, err = e.viewBuf.WriteString( + `<label class="active" for="` + + strings.Join(strings.Split(e.label, " "), "-") + `">` + e.label + + `</label>`) + if err != nil { + log.Println("Error writing HTML string to buffer: domElement") + return nil + } } - e.viewBuf.Write([]byte(`<` + e.TagName + ` `)) - for attr, value := range e.Attrs { - e.viewBuf.Write([]byte(attr + `="` + string(value) + `" `)) + _, err = e.viewBuf.WriteString(`<` + e.tagName + ` `) + if err != nil { + log.Println("Error writing HTML string to buffer: domElement") + return nil } - 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 + `>`)) + 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(`</div>`) + if err != nil { + log.Println("Error writing HTML string to buffer: domElement") + return nil + } - 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">`)) + _, err := e.viewBuf.WriteString(`<div class="input-field col s6">`) + if err != nil { + log.Println("Error writing HTML string to buffer: domElementWithChildrenSelect") + return nil + } - e.viewBuf.Write([]byte(`<` + e.TagName + ` `)) + _, 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 { - e.viewBuf.Write([]byte(attr + `="` + string(value) + `" `)) + 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 } - 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)) + _, err = e.viewBuf.Write(domElement(child)) + if err != nil { + log.Println("Error writing HTML domElement to buffer: domElementWithChildrenSelect") + return nil + } } - e.viewBuf.Write([]byte(`</` + e.TagName + `>`)) + _, err = e.viewBuf.WriteString(`</` + e.tagName + `>`) + if err != nil { + log.Println("Error writing HTML string to buffer: domElementWithChildrenSelect") + return nil + } if e.label != "" { - e.viewBuf.Write([]byte(`<label class="active">` + e.label + `</label>`)) + _, err = e.viewBuf.WriteString(`<label class="active">` + e.label + `</label>`) + if err != nil { + log.Println("Error writing HTML string to buffer: domElementWithChildrenSelect") + return nil + } + } + + _, err = e.viewBuf.WriteString(`</div>`) + if err != nil { + log.Println("Error writing HTML string to buffer: domElementWithChildrenSelect") + return nil } - e.viewBuf.Write([]byte(`</div>`)) return e.viewBuf.Bytes() } func domElementWithChildrenCheckbox(e *element, children []*element) []byte { - e.viewBuf.Write([]byte(`<` + e.TagName + ` `)) + _, 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 { - e.viewBuf.Write([]byte(attr + `="` + value + `" `)) + 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 + } } - e.viewBuf.Write([]byte(` >`)) + _, err = e.viewBuf.WriteString(` >`) + if err != nil { + log.Println("Error writing HTML string to buffer: domElementWithChildrenCheckbox") + return nil + } if e.label != "" { - e.viewBuf.Write([]byte(`<label class="active">` + e.label + `</label>`)) + _, err = e.viewBuf.WriteString(`<label class="active">` + e.label + `</label>`) + 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 { - e.viewBuf.Write(domElementCheckbox(child)) + _, err = e.viewBuf.Write(domElementCheckbox(child)) + if err != nil { + log.Println("Error writing HTML domElementCheckbox to buffer: domElementWithChildrenCheckbox") + return nil + } } - e.viewBuf.Write([]byte(`</` + e.TagName + `><div class="clear padding"> </div>`)) + _, err = e.viewBuf.WriteString(`</` + e.tagName + `><div class="clear padding"> </div>`) + if err != nil { + log.Println("Error writing HTML string to buffer: domElementWithChildrenCheckbox") + return nil + } return e.viewBuf.Bytes() } diff --git a/management/editor/editor.go b/management/editor/editor.go index 7194c27..511edb2 100644 --- a/management/editor/editor.go +++ b/management/editor/editor.go @@ -4,6 +4,7 @@ package editor import ( "bytes" + "log" "net/http" ) @@ -38,16 +39,28 @@ func Form(post Editable, fields ...Field) ([]byte, error) { editor := post.Editor() editor.ViewBuf = &bytes.Buffer{} - editor.ViewBuf.Write([]byte(`<table><tbody class="row"><tr class="col s8"><td>`)) + _, err := editor.ViewBuf.WriteString(`<table><tbody class="row"><tr class="col s8"><td>`) + if err != nil { + log.Println("Error writing HTML string to editor Form buffer") + return nil, err + } for _, f := range fields { addFieldToEditorView(editor, f) } - editor.ViewBuf.Write([]byte(`</td></tr>`)) + _, err = editor.ViewBuf.WriteString(`</td></tr>`) + if err != nil { + log.Println("Error writing HTML string to editor Form buffer") + return nil, err + } // content items with Item embedded have some default fields we need to render - editor.ViewBuf.Write([]byte(`<tr class="col s4 default-fields"><td>`)) + _, err = editor.ViewBuf.WriteString(`<tr class="col s4 default-fields"><td>`) + if err != nil { + log.Println("Error writing HTML string to editor Form buffer") + return nil, err + } publishTime := ` <div class="row content-only __ponzu"> @@ -98,9 +111,16 @@ func Form(post Editable, fields ...Field) ([]byte, error) { </div> ` - editor.ViewBuf.Write([]byte(publishTime)) + _, err = editor.ViewBuf.WriteString(publishTime) + if err != nil { + log.Println("Error writing HTML string to editor Form buffer") + return nil, err + } - addPostDefaultFieldsToEditorView(post, editor) + err = addPostDefaultFieldsToEditorView(post, editor) + if err != nil { + return nil, err + } submit := ` <div class="input-field post-controls"> @@ -186,16 +206,26 @@ func Form(post Editable, fields ...Field) ([]byte, error) { }); </script> ` - editor.ViewBuf.Write([]byte(submit + script + `</td></tr></tbody></table>`)) + _, err = editor.ViewBuf.WriteString(submit + script + `</td></tr></tbody></table>`) + if err != nil { + log.Println("Error writing HTML string to editor Form buffer") + return nil, err + } return editor.ViewBuf.Bytes(), nil } -func addFieldToEditorView(e *Editor, f Field) { - e.ViewBuf.Write(f.View) +func addFieldToEditorView(e *Editor, f Field) error { + _, err := e.ViewBuf.Write(f.View) + if err != nil { + log.Println("Error writing field view to editor view buffer") + return err + } + + return nil } -func addPostDefaultFieldsToEditorView(p Editable, e *Editor) { +func addPostDefaultFieldsToEditorView(p Editable, e *Editor) error { defaults := []Field{ Field{ View: Input("Slug", p, map[string]string{ @@ -220,7 +250,11 @@ func addPostDefaultFieldsToEditorView(p Editable, e *Editor) { } for _, f := range defaults { - addFieldToEditorView(e, f) + err := addFieldToEditorView(e, f) + if err != nil { + return err + } } + return nil } diff --git a/management/editor/elements.go b/management/editor/elements.go index 873e81c..b82b220 100644 --- a/management/editor/elements.go +++ b/management/editor/elements.go @@ -11,7 +11,11 @@ import ( // The `fieldName` argument will cause a panic if it is not exactly the string // form of the struct field that this editor input is representing // type Person struct { +// item.Item +// editor editor.Editor +// // Name string `json:"name"` +// //... // } // // func (p *Person) MarshalEditor() ([]byte, error) { @@ -64,9 +68,9 @@ func Timestamp(fieldName string, p interface{}, attrs map[string]string) []byte } e := &element{ - TagName: "input", - Attrs: attrs, - Name: tagNameFromStructField(fieldName, p), + tagName: "input", + attrs: attrs, + name: tagNameFromStructField(fieldName, p), label: attrs["label"], data: data, viewBuf: &bytes.Buffer{}, @@ -161,9 +165,9 @@ func Richtext(fieldName string, p interface{}, attrs map[string]string) []byte { attrs["class"] = "richtext " + fieldName attrs["id"] = "richtext-" + fieldName div := &element{ - TagName: "div", - Attrs: attrs, - Name: "", + tagName: "div", + attrs: attrs, + name: "", label: "", data: "", viewBuf: &bytes.Buffer{}, @@ -261,16 +265,16 @@ func Select(fieldName string, p interface{}, attrs, options map[string]string) [ // provide a call to action for the select element cta := &element{ - TagName: "option", - Attrs: map[string]string{"disabled": "true", "selected": "true"}, + tagName: "option", + attrs: map[string]string{"disabled": "true", "selected": "true"}, data: "Select an option...", viewBuf: &bytes.Buffer{}, } // provide a selection reset (will store empty string in db) reset := &element{ - TagName: "option", - Attrs: map[string]string{"value": ""}, + tagName: "option", + attrs: map[string]string{"value": ""}, data: "None", viewBuf: &bytes.Buffer{}, } @@ -283,8 +287,8 @@ func Select(fieldName string, p interface{}, attrs, options map[string]string) [ optAttrs["selected"] = "true" } opt := &element{ - TagName: "option", - Attrs: optAttrs, + tagName: "option", + attrs: optAttrs, data: v, viewBuf: &bytes.Buffer{}, } @@ -328,9 +332,9 @@ func Checkbox(fieldName string, p interface{}, attrs, options map[string]string) // create a *element manually using the modified tagNameFromStructFieldMulti // func since this is for a multi-value name input := &element{ - TagName: "input", - Attrs: inputAttrs, - Name: tagNameFromStructFieldMulti(fieldName, i, p), + tagName: "input", + attrs: inputAttrs, + name: tagNameFromStructFieldMulti(fieldName, i, p), label: v, data: "", viewBuf: &bytes.Buffer{}, diff --git a/management/editor/repeaters.go b/management/editor/repeaters.go index 37fb982..617caee 100644 --- a/management/editor/repeaters.go +++ b/management/editor/repeaters.go @@ -3,6 +3,7 @@ package editor import ( "bytes" "fmt" + "log" "strings" ) @@ -13,7 +14,11 @@ import ( // The `fieldName` argument will cause a panic if it is not exactly the string // form of the struct field that this editor input is representing // type Person struct { +// item.Item +// editor editor.Editor +// // Names []string `json:"names"` +// //... // } // // func (p *Person) MarshalEditor() ([]byte, error) { @@ -35,12 +40,17 @@ func InputRepeater(fieldName string, p interface{}, attrs map[string]string) []b scope := tagNameFromStructField(fieldName, p) html := bytes.Buffer{} - html.WriteString(`<span class="__ponzu-repeat ` + scope + `">`) + _, err := html.WriteString(`<span class="__ponzu-repeat ` + scope + `">`) + if err != nil { + log.Println("Error writing HTML string to InputRepeater buffer") + return nil + } + for i, val := range vals { el := &element{ - TagName: "input", - Attrs: attrs, - Name: tagNameFromStructFieldMulti(fieldName, i, p), + tagName: "input", + attrs: attrs, + name: tagNameFromStructFieldMulti(fieldName, i, p), data: val, viewBuf: &bytes.Buffer{}, } @@ -50,9 +60,17 @@ func InputRepeater(fieldName string, p interface{}, attrs map[string]string) []b el.label = attrs["label"] } - html.Write(domElementSelfClose(el)) + _, err := html.Write(domElementSelfClose(el)) + if err != nil { + log.Println("Error writing domElementSelfClose to InputRepeater buffer") + return nil + } + } + _, err = html.WriteString(`</span>`) + if err != nil { + log.Println("Error writing HTML string to InputRepeater buffer") + return nil } - html.WriteString(`</span>`) return append(html.Bytes(), RepeatController(fieldName, p, "input", ".input-field")...) } @@ -68,7 +86,11 @@ func SelectRepeater(fieldName string, p interface{}, attrs, options map[string]s // <option value="{map key}">{map value}</option> scope := tagNameFromStructField(fieldName, p) html := bytes.Buffer{} - html.WriteString(`<span class="__ponzu-repeat ` + scope + `">`) + _, err := html.WriteString(`<span class="__ponzu-repeat ` + scope + `">`) + if err != nil { + log.Println("Error writing HTML string to SelectRepeater buffer") + return nil + } // find the field values in p to determine if an option is pre-selected fieldVals := valueFromStructField(fieldName, p) @@ -80,9 +102,9 @@ func SelectRepeater(fieldName string, p interface{}, attrs, options map[string]s if len(vals) > 0 { for i, val := range vals { sel := &element{ - TagName: "select", - Attrs: attrs, - Name: tagNameFromStructFieldMulti(fieldName, i, p), + tagName: "select", + attrs: attrs, + name: tagNameFromStructFieldMulti(fieldName, i, p), viewBuf: &bytes.Buffer{}, } @@ -96,16 +118,16 @@ func SelectRepeater(fieldName string, p interface{}, attrs, options map[string]s // provide a call to action for the select element cta := &element{ - TagName: "option", - Attrs: map[string]string{"disabled": "true", "selected": "true"}, + tagName: "option", + attrs: map[string]string{"disabled": "true", "selected": "true"}, data: "Select an option...", viewBuf: &bytes.Buffer{}, } // provide a selection reset (will store empty string in db) reset := &element{ - TagName: "option", - Attrs: map[string]string{"value": ""}, + tagName: "option", + attrs: map[string]string{"value": ""}, data: "None", viewBuf: &bytes.Buffer{}, } @@ -118,8 +140,8 @@ func SelectRepeater(fieldName string, p interface{}, attrs, options map[string]s optAttrs["selected"] = "true" } opt := &element{ - TagName: "option", - Attrs: optAttrs, + tagName: "option", + attrs: optAttrs, data: v, viewBuf: &bytes.Buffer{}, } @@ -127,11 +149,20 @@ func SelectRepeater(fieldName string, p interface{}, attrs, options map[string]s opts = append(opts, opt) } - html.Write(domElementWithChildrenSelect(sel, opts)) + _, err := html.Write(domElementWithChildrenSelect(sel, opts)) + if err != nil { + log.Println("Error writing domElementWithChildrenSelect to SelectRepeater buffer") + return nil + } } } - html.WriteString(`</span>`) + _, err = html.WriteString(`</span>`) + if err != nil { + log.Println("Error writing HTML string to SelectRepeater buffer") + return nil + } + return append(html.Bytes(), RepeatController(fieldName, p, "select", ".input-field")...) } @@ -223,14 +254,33 @@ func FileRepeater(fieldName string, p interface{}, attrs map[string]string) []by name := tagNameFromStructField(fieldName, p) html := bytes.Buffer{} - html.WriteString(`<span class="__ponzu-repeat ` + name + `">`) + _, err := html.WriteString(`<span class="__ponzu-repeat ` + name + `">`) + if err != nil { + log.Println("Error writing HTML string to FileRepeater buffer") + return nil + } + for i, val := range vals { className := fmt.Sprintf("%s-%d", name, i) nameidx := tagNameFromStructFieldMulti(fieldName, i, p) - html.WriteString(fmt.Sprintf(tmpl, nameidx, addLabelFirst(i, attrs["label"]), val, className, fieldName)) - html.WriteString(fmt.Sprintf(script, nameidx, className)) + + _, err := html.WriteString(fmt.Sprintf(tmpl, nameidx, addLabelFirst(i, attrs["label"]), val, className, fieldName)) + if err != nil { + log.Println("Error writing HTML string to FileRepeater buffer") + return nil + } + + _, err = html.WriteString(fmt.Sprintf(script, nameidx, className)) + if err != nil { + log.Println("Error writing HTML string to FileRepeater buffer") + return nil + } + } + _, err = html.WriteString(`</span>`) + if err != nil { + log.Println("Error writing HTML string to FileRepeater buffer") + return nil } - html.WriteString(`</span>`) return append(html.Bytes(), RepeatController(fieldName, p, "input.upload", "div.file-input."+fieldName)...) } |