style.go (view raw)
1package main
2
3import (
4 "fmt"
5 "regexp"
6
7 todo "github.com/1set/todotxt"
8 "github.com/charmbracelet/lipgloss"
9
10 catppuccin "github.com/catppuccin/go"
11)
12
13var Catppuccin catppuccin.Flavor = catppuccin.Mocha
14
15type Style struct {
16 Task TaskStyle
17 Priority PriorityStyle
18 Check lipgloss.Style
19 Context lipgloss.Style
20 Project lipgloss.Style
21}
22
23type TaskStyle struct {
24 Todo lipgloss.Style
25 Completed lipgloss.Style
26}
27
28type PriorityStyle struct {
29 A lipgloss.Style
30 B lipgloss.Style
31 C lipgloss.Style
32}
33
34func NewTextStyle() Style {
35
36 taskStyle := TaskStyle{
37 Todo: lipgloss.NewStyle().Foreground(lipgloss.Color(Catppuccin.Text().Hex)),
38 Completed: lipgloss.NewStyle().Strikethrough(true).Foreground(lipgloss.Color(Catppuccin.Overlay2().Hex)),
39 }
40
41 priorityStyle := PriorityStyle{
42 A: lipgloss.NewStyle().Foreground(lipgloss.Color(Catppuccin.Red().Hex)),
43 B: lipgloss.NewStyle().Foreground(lipgloss.Color(Catppuccin.Peach().Hex)),
44 C: lipgloss.NewStyle().Foreground(lipgloss.Color(Catppuccin.Green().Hex)),
45 }
46
47 style := Style{
48 Priority: priorityStyle,
49 Task: taskStyle,
50 Check: lipgloss.NewStyle().Foreground(lipgloss.Color(Catppuccin.Blue().Hex)),
51 Context: lipgloss.NewStyle().Foreground(lipgloss.Color(Catppuccin.Blue().Hex)),
52 Project: lipgloss.NewStyle().Foreground(lipgloss.Color(Catppuccin.Mauve().Hex)),
53 }
54 return style
55}
56
57func (s Style) getTaskStyle(task todo.Task, checked bool) string {
58
59 todoText := task.Original
60
61 checkedRegex := regexp.MustCompile(`^x (\d{4}-\d{2}-\d{2} )? ?`)
62 priorityRegex := regexp.MustCompile(`^\([A-Z]\) `)
63 contextRegex := regexp.MustCompile(`#\w+`)
64 projectRegex := regexp.MustCompile(`\+\w+`)
65
66 todoText = checkedRegex.ReplaceAllString(todoText, "")
67 todoText = priorityRegex.ReplaceAllString(todoText, "")
68
69 checkString := " "
70 if checked {
71 checkString = "✓"
72 }
73
74 switch task.Completed {
75 case true:
76 dateStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("#6c7086"))
77 dateString := dateStyle.Render(task.CompletedDate.Local().Format("02-01-2006 15:03"))
78 return fmt.Sprintf("%s %s %s %s", s.Check.Render(checkString), s.getPriorityStyle(task.Priority), s.Task.Completed.Render(todoText), dateString)
79 default:
80 todoText = contextRegex.ReplaceAllStringFunc(todoText, func(match string) string {
81 return s.Context.Render(match)
82 })
83 todoText = projectRegex.ReplaceAllStringFunc(todoText, func(match string) string {
84 return s.Project.Render(match)
85 })
86 return fmt.Sprintf("%s %s %s", s.Check.Render(checkString), s.getPriorityStyle(task.Priority), s.Task.Todo.Render(todoText))
87 }
88}
89
90func (s Style) getPriorityStyle(priority string) string {
91 switch priority {
92 case "":
93 return " "
94 case "A":
95 return s.Priority.A.Render(priority)
96 case "B":
97 return s.Priority.B.Render(priority)
98 case "C":
99 return s.Priority.C.Render(priority)
100 default:
101 return priority
102 }
103}