summaryrefslogtreecommitdiff
path: root/cmd/cms/generator.go
blob: 5ea296ce968855cb05804f4f12a452ad2e9ea405 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package main

import (
	"fmt"
	"html/template"
	"os"
	"path/filepath"
	"strings"
)

func generateContentType(name string) error {
	fileName := strings.ToLower(name) + ".go"
	typeName := strings.ToUpper(string(name[0])) + string(name[1:])

	// contain processed name an info for template
	data := map[string]string{
		"name":    typeName,
		"initial": string(fileName[0]),
	}

	// open file in ./content/ dir
	// if exists, alert user of conflict
	pwd, err := os.Getwd()
	if err != nil {
		return err
	}

	contentDir := filepath.Join(pwd, "content")
	filePath := filepath.Join(contentDir, fileName)

	if _, err := os.Stat(filePath); !os.IsNotExist(err) {
		return fmt.Errorf("Please remove '%s' before executing this command.", fileName)
	}

	// no file exists.. ok to write new one
	file, err := os.Create(filePath)
	defer file.Close()
	if err != nil {
		return err
	}

	// execute template
	tmpl := template.Must(template.New("content").Parse(contentTypeTmpl))
	err = tmpl.Execute(file, data)
	if err != nil {
		return err
	}

	return nil
}

const contentTypeTmpl = `
package content

import (
	"fmt"

	"github.com/nilslice/cms/management/editor"
)

// {{ .name }} is the generic content struct
type {{ .name }} struct {
	Item
	editor editor.Editor

/*  
    // all your custom fields must have json tags!
	Title     string ` + "`json:" + `"title"` + "`" + `
	Content   string ` + "`json:" + `"content"` + "`" + `
	Author    string ` + "`json:" + `"author"` + "`" + `
	Timestamp string ` + "`json:" + `"timestamp"` + "`" + `
*/
}

func init() {
	Types["{{ .name }}"] = func() interface{} { return new({{ .name }}) }
}

// SetContentID partially implements editor.Editable
func ({{ .initial }} *{{ .name }}) SetContentID(id int) { {{ .initial }}.ID = id }

// ContentID partially implements editor.Editable
func ({{ .initial }} *{{ .name }}) ContentID() int { return {{ .initial }}.ID }

// ContentName partially implements editor.Editable
func ({{ .initial }} *{{ .name }}) ContentName() string { return {{ .initial }}.Title }

// SetSlug partially implements editor.Editable
func ({{ .initial }} *{{ .name }}) SetSlug(slug string) { {{ .initial }}.Slug = slug }

// Editor partially implements editor.Editable
func ({{ .initial }} *{{ .name }}) Editor() *editor.Editor { return &{{ .initial }}.editor }

// MarshalEditor writes a buffer of html to edit a {{ .name }} and partially implements editor.Editable
func ({{ .initial }} *{{ .name }}) MarshalEditor() ([]byte, error) {
/* EXAMPLE CODE (from post.go, the default content type)
	view, err := editor.Form({{ .initial }},
		editor.Field{
            // Take careful note that the first argument to these Input-like methods 
            // is the string version of each {{ .name }} struct tag, and must follow this pattern
            // for auto-decoding and -encoding reasons.
			View: editor.Input("Slug", {{ .initial }}, map[string]string{
				"label":       "URL Path",
				"type":        "text",
				"disabled":    "true",
				"placeholder": "Will be set automatically",
			}),
		},
		editor.Field{
			View: editor.Input("Title", {{ .initial }}, map[string]string{
				"label":       "{{ .name }} Title",
				"type":        "text",
				"placeholder": "Enter your {{ .name }} Title here",
			}),
		},
		editor.Field{
			View: editor.Textarea("Content", {{ .initial }}, map[string]string{
				"label":       "Content",
				"placeholder": "Add the content of your {{ .name }} here",
			}),
		},
		editor.Field{
			View: editor.Input("Author", {{ .initial }}, map[string]string{
				"label":       "Author",
				"type":        "text",
				"placeholder": "Enter the author name here",
			}),
		},
		editor.Field{
			View: editor.Input("Timestamp", {{ .initial }}, map[string]string{
				"label": "Publish Date",
				"type":  "date",
			}),
		},
	)

	if err != nil {
		return nil, fmt.Errorf("Failed to render {{ .name }} editor view: %s", err.Error())
	}

	return view, nil
*/
}
`