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/screen_printer.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/screen_printer.go')
| -rw-r--r-- | todolist/screen_printer.go | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/todolist/screen_printer.go b/todolist/screen_printer.go new file mode 100644 index 0000000..eab0c39 --- /dev/null +++ b/todolist/screen_printer.go @@ -0,0 +1,131 @@ +package todolist + +import ( + "fmt" + "os" + "regexp" + "sort" + "strconv" + "strings" + "text/tabwriter" + "time" + + "github.com/fatih/color" +) + +type ScreenPrinter struct { + Writer *tabwriter.Writer +} + +func NewScreenPrinter() *ScreenPrinter { + w := new(tabwriter.Writer) + w.Init(os.Stdout, 0, 8, 0, '\t', 0) + formatter := &ScreenPrinter{Writer: w} + return formatter +} + +func (f *ScreenPrinter) Print(groupedTodos *GroupedTodos, printNotes bool) { + cyan := color.New(color.FgCyan).SprintFunc() + + var keys []string + for key := range 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 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 *ScreenPrinter) 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 *ScreenPrinter) 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 (f *ScreenPrinter) 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 *ScreenPrinter) formatCompleted(completed bool) string { + if completed { + return "[x]" + } else { + return "[ ]" + } +} |
