diff options
Diffstat (limited to 'editor')
-rw-r--r-- | editor/editor.go | 41 | ||||
-rw-r--r-- | editor/element.go | 115 |
2 files changed, 0 insertions, 156 deletions
diff --git a/editor/editor.go b/editor/editor.go deleted file mode 100644 index 11dc064..0000000 --- a/editor/editor.go +++ /dev/null @@ -1,41 +0,0 @@ -// Package editor enables users to create edit views from their content -// structs so that admins can manage content -package editor - -import "bytes" - -// Editable ensures data is editable -type Editable interface { - Editor() *Editor - NewViewBuffer() - Render() []byte -} - -// Editor is a view containing fields to manage content -type Editor struct { - ViewBuf *bytes.Buffer -} - -// Field is used to create the editable view for a field -// within a particular content struct -type Field struct { - View []byte -} - -// New takes editable content and any number of Field funcs to describe the edit -// page for any content struct added by a user -func New(post Editable, fields ...Field) ([]byte, error) { - post.NewViewBuffer() - - editor := post.Editor() - - for _, f := range fields { - addFieldToEditorView(editor, f) - } - - return post.Render(), nil -} - -func addFieldToEditorView(e *Editor, f Field) { - e.ViewBuf.Write(f.View) -} diff --git a/editor/element.go b/editor/element.go deleted file mode 100644 index 519ce5d..0000000 --- a/editor/element.go +++ /dev/null @@ -1,115 +0,0 @@ -package editor - -import ( - "bytes" - "reflect" -) - -// Input returns the []byte of an <input> HTML element with a label. -// IMPORTANT: -// 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 -func Input(fieldName string, p interface{}, attrs map[string]string) []byte { - var wrapInLabel = true - label, found := attrs["label"] - if !found { - wrapInLabel = false - label = "" - } - - e := newElement("input", label, fieldName, p, attrs) - - return domElementSelfClose(e, wrapInLabel) -} - -// Textarea returns the []byte of a <textarea> HTML element with a label. -// IMPORTANT: -// 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 -func Textarea(fieldName string, p interface{}, attrs map[string]string) []byte { - var wrapInLabel = true - label, found := attrs["label"] - if !found { - wrapInLabel = false - label = "" - } - - e := newElement("textarea", label, fieldName, p, attrs) - - return domElement(e, wrapInLabel) -} - -type element struct { - TagName string - Attrs map[string]string - Name string - label string - data []byte - 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, wrapInLabel bool) []byte { - if wrapInLabel { - e.viewBuf.Write([]byte(`<label>` + e.label + `</label>`)) - } - e.viewBuf.Write([]byte(`<` + e.TagName + ` value="`)) - e.viewBuf.Write(append(e.data, []byte(`" `)...)) - - for attr, value := range e.Attrs { - e.viewBuf.Write([]byte(attr + `="` + string(value) + `"`)) - } - e.viewBuf.Write([]byte(` />`)) - - return e.viewBuf.Bytes() -} - -// domElement creates a DOM element -func domElement(e *element, wrapInLabel bool) []byte { - if wrapInLabel { - e.viewBuf.Write([]byte(`<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(` >`)) - - e.viewBuf.Write([]byte(e.data)) - e.viewBuf.Write([]byte(`</` + e.TagName + `>`)) - - return e.viewBuf.Bytes() -} - -func tagNameFromStructField(name string, post interface{}) string { - field, ok := reflect.TypeOf(post).Elem().FieldByName(name) - if !ok { - panic("Couldn't get struct field for: " + name + ". Make sure you pass the right field name to editor field elements.") - } - - tag, ok := field.Tag.Lookup("json") - if !ok { - panic("Couldn't get json struct tag for: " + name + ". Struct fields for content types must have 'json' tags.") - } - - return tag -} - -func valueFromStructField(name string, post interface{}) []byte { - field := reflect.Indirect(reflect.ValueOf(post)).FieldByName(name) - - return field.Bytes() -} - -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{}, - } -} |