diff options
| author | Grant Ammons <gammons@gmail.com> | 2017-10-04 07:34:43 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-10-04 07:34:43 -0400 |
| commit | b3bd13d469ff1c072e5ff6dfe15267cc51e14db5 (patch) | |
| tree | 49bfa1d32b280be32ac42f1d0ddf1ef07f6809fe /todolist/formatter.go | |
| parent | 0840e7a147d8594acec63fd1ce8aba9e15472839 (diff) | |
| parent | 6193b27cd7c71bcff5b5dd0cafb4f04172a73206 (diff) | |
Merge pull request #109 from gammons/refactor-printer
Refactor the formatter to an interface and rename it
Diffstat (limited to 'todolist/formatter.go')
| -rw-r--r-- | todolist/formatter.go | 152 |
1 files changed, 0 insertions, 152 deletions
diff --git a/todolist/formatter.go b/todolist/formatter.go deleted file mode 100644 index e7863db..0000000 --- a/todolist/formatter.go +++ /dev/null @@ -1,152 +0,0 @@ -package todolist - -import ( - "fmt" - "os" - "regexp" - "sort" - "strconv" - "strings" - "text/tabwriter" - "time" - - "github.com/fatih/color" -) - -type Formatter struct { - GroupedTodos *GroupedTodos - Writer *tabwriter.Writer -} - -func NewFormatter(todos *GroupedTodos) *Formatter { - w := new(tabwriter.Writer) - w.Init(os.Stdout, 0, 8, 0, '\t', 0) - formatter := &Formatter{GroupedTodos: todos, Writer: w} - return formatter -} - -func (f *Formatter) Print(printNotes bool) { - cyan := color.New(color.FgCyan).SprintFunc() - - var keys []string - for key := range f.GroupedTodos.Groups { - keys = append(keys, key) - } - sort.Strings(keys) - - for _, key := range keys { - fmt.Fprintf(f.Writer, "\n %s\n", cyan(key)) - for _, todo := range f.GroupedTodos.Groups[key] { - f.printTodo(todo) - if printNotes { - for nid, note := range todo.Notes { - fmt.Fprintf(f.Writer, " %s\t%s\t\n", - cyan(strconv.Itoa(nid)), note) - } - } - } - } - f.Writer.Flush() -} - -func (f *Formatter) printTodo(todo *Todo) { - yellow := color.New(color.FgYellow) - if todo.IsPriority { - yellow.Add(color.Bold, color.Italic) - } - fmt.Fprintf(f.Writer, " %s\t%s\t%s\t%s\t\n", - yellow.SprintFunc()(strconv.Itoa(todo.Id)), - f.formatCompleted(todo.Completed), - f.formatDue(todo.Due, todo.IsPriority), - f.formatSubject(todo.Subject, todo.IsPriority)) -} - -func (f *Formatter) formatDue(due string, isPriority bool) string { - blue := color.New(color.FgBlue) - red := color.New(color.FgRed) - - if isPriority { - blue.Add(color.Bold, color.Italic) - red.Add(color.Bold, color.Italic) - } - - if due == "" { - return blue.SprintFunc()(" ") - } - dueTime, err := time.Parse("2006-01-02", due) - - if err != nil { - fmt.Println(err) - fmt.Println("This may due to the corruption of .todos.json file.") - os.Exit(-1) - } - - if isToday(dueTime) { - return blue.SprintFunc()("today") - } else if isTomorrow(dueTime) { - return blue.SprintFunc()("tomorrow") - } else if isPastDue(dueTime) { - return red.SprintFunc()(dueTime.Format("Mon Jan 2")) - } else { - return blue.SprintFunc()(dueTime.Format("Mon Jan 2")) - } -} - -func isToday(t time.Time) bool { - nowYear, nowMonth, nowDay := time.Now().Date() - timeYear, timeMonth, timeDay := t.Date() - return nowYear == timeYear && - nowMonth == timeMonth && - nowDay == timeDay -} - -func isTomorrow(t time.Time) bool { - nowYear, nowMonth, nowDay := time.Now().AddDate(0, 0, 1).Date() - timeYear, timeMonth, timeDay := t.Date() - return nowYear == timeYear && - nowMonth == timeMonth && - nowDay == timeDay -} - -func isPastDue(t time.Time) bool { - return time.Now().After(t) -} - -func (f *Formatter) formatSubject(subject string, isPriority bool) string { - - red := color.New(color.FgRed) - magenta := color.New(color.FgMagenta) - white := color.New(color.FgWhite) - - if isPriority { - red.Add(color.Bold, color.Italic) - magenta.Add(color.Bold, color.Italic) - white.Add(color.Bold, color.Italic) - } - - splitted := strings.Split(subject, " ") - projectRegex, _ := regexp.Compile(`\+[\p{L}\d_]+`) - contextRegex, _ := regexp.Compile(`\@[\p{L}\d_]+`) - - coloredWords := []string{} - - for _, word := range splitted { - if projectRegex.MatchString(word) { - coloredWords = append(coloredWords, magenta.SprintFunc()(word)) - } else if contextRegex.MatchString(word) { - coloredWords = append(coloredWords, red.SprintFunc()(word)) - } else { - coloredWords = append(coloredWords, white.SprintFunc()(word)) - } - } - return strings.Join(coloredWords, " ") - -} - -func (f *Formatter) formatCompleted(completed bool) string { - if completed { - return "[x]" - } else { - return "[ ]" - } -} |
