-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnote.go
More file actions
159 lines (130 loc) · 3.48 KB
/
note.go
File metadata and controls
159 lines (130 loc) · 3.48 KB
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package note
import (
"fmt"
"io"
"os"
"path"
"text/template"
"time"
"github.com/gosimple/slug"
"github.com/ukiahsmith/duolog"
)
var log = duolog.New(os.Stdout, "Note", 0)
type Err string
func (e Err) Error() string {
return string(e)
}
const (
ErrNotFound = Err("Error: Not Found")
ErrNoFilenameTemplate = Err("Error: No filename template found in first line")
)
type Data struct {
Date time.Time
Title string
Content string
Meta struct {
FilenameNOX string
}
tmpl *template.Template
}
func (d Data) TitleSlug() string {
return slug.Make(d.Title)
}
// ParseDate validates a user supplied datetime against the three supported
// date formats, and set the date. It defaults to the current datetime if no
// datetime is supplied.
//
// 2006-01-02T15:04:05Z07:00
// 2006-01-02 15:04:05
// 2006-01-02
func (d *Data) ParseDate(usrDate string) error {
var err error
// Default to right about now, the funk soul brother.
d.Date = time.Now()
if usrDate != "" {
var t time.Time
t, err = time.Parse("2006-01-02T15:04:05Z07:00", usrDate)
if err != nil {
t, err = time.Parse("2006-01-02 15:04:05", usrDate)
if err != nil {
t, err = time.Parse("2006-01-02", usrDate)
if err != nil {
log.Infof("error parsing time format 2006-01-02: %s", err)
return fmt.Errorf("error parsing date: %w", err)
}
}
}
// No errors? Use the user supplied date.
if !t.IsZero() {
d.Date = t
}
}
return nil
}
func (d *Data) SetTemplateFile(templateFilename string) error {
var err error
// use the supplied template, or fallback to the default template
if templateFilename == "" {
d.tmpl, err = template.New("note").Funcs(Tfuncs).Parse(DefaultTmpl)
if err != nil {
return err
}
} else {
d.Meta.FilenameNOX, err = FilenameFromFile(templateFilename, *d)
log.Debugf("SetTemplateFile: using custom template with -t, d.Meta.FilenameNOX is \"%s\" after being set with note.FilenameFromFile", d.Meta.FilenameNOX)
if err != nil {
return err
}
d.tmpl, err = template.New(path.Base(templateFilename)).Funcs(Tfuncs).ParseFiles(templateFilename)
if err != nil {
return fmt.Errorf("%s: %w", err, ErrNotFound)
}
}
if d.Meta.FilenameNOX == "" {
d.Meta.FilenameNOX, err = FilenameFromTemplateStr(DefaultFilenameTmpl, *d)
if err != nil {
log.Debugf("error with default filenameTemplate: %s", err)
return err
}
}
return nil
}
func (d Data) GetFilename(filenameTemplate string) (string, error) {
var fname string
var err error
// use the supplied filename-template, then fallback to a filename-template
// in the note template, then fallback to the defaultly formatted filename.
// var fname string
// default names are setup when parsing the template.
if filenameTemplate != "" {
fname, err = FilenameFromTemplateStr(filenameTemplate, d)
if err != nil {
log.Debugf("error with default filenameTemplate: %s", err)
return "", err
}
return fname, nil
}
return d.Meta.FilenameNOX, nil
}
func (d Data) Execute(wr io.Writer) error {
return d.tmpl.Execute(wr, d)
}
func (d Data) WriteFile(fname string) error {
var writer io.WriteCloser
_, err := os.Stat(fname)
switch err.(type) {
case *os.PathError:
writer, err = os.Create(fname)
if err != nil {
return fmt.Errorf("os.PathError with file %s : %w", fname, err)
}
case error:
return fmt.Errorf("error writing the file: %w", err)
}
err = d.Execute(writer)
if err != nil {
return fmt.Errorf("error executing template: %w", err)
}
writer.Close()
return nil
}