summaryrefslogtreecommitdiff
path: root/editor
diff options
context:
space:
mode:
authorSteve Manuel <nilslice@gmail.com>2016-09-19 02:09:29 -0700
committerSteve Manuel <nilslice@gmail.com>2016-09-19 02:09:29 -0700
commit2ed153f8d287b3ffb5e8d1667ab51c922d82c504 (patch)
tree8bde4e8865e5502ff72487252bcd5fcc09cd89c2 /editor
parentd62f31d1932125db59c4cf813c54d95a4a0200ee (diff)
reorganizing files and dir structure. adding initial (incomplete) management, types, system and db functionality.
Diffstat (limited to 'editor')
-rw-r--r--editor/editor.go41
-rw-r--r--editor/element.go115
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{},
- }
-}