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 KeyValue lipgloss.Style
22}
23
24type TaskStyle struct {
25 Todo lipgloss.Style
26 Completed lipgloss.Style
27}
28
29type PriorityStyle struct {
30 A lipgloss.Style
31 B lipgloss.Style
32 C lipgloss.Style
33}
34
35func NewTextStyle() Style {
36
37 taskStyle := TaskStyle{
38 Todo: lipgloss.NewStyle().Foreground(lipgloss.Color(Catppuccin.Text().Hex)),
39 Completed: lipgloss.NewStyle().Strikethrough(true).Foreground(lipgloss.Color(Catppuccin.Overlay2().Hex)),
40 }
41
42 priorityStyle := PriorityStyle{
43 A: lipgloss.NewStyle().Foreground(lipgloss.Color(Catppuccin.Red().Hex)),
44 B: lipgloss.NewStyle().Foreground(lipgloss.Color(Catppuccin.Peach().Hex)),
45 C: lipgloss.NewStyle().Foreground(lipgloss.Color(Catppuccin.Green().Hex)),
46 }
47
48 style := Style{
49 Priority: priorityStyle,
50 Task: taskStyle,
51 Check: lipgloss.NewStyle().Foreground(lipgloss.Color(Catppuccin.Blue().Hex)),
52 Context: lipgloss.NewStyle().Foreground(lipgloss.Color(Catppuccin.Blue().Hex)),
53 Project: lipgloss.NewStyle().Foreground(lipgloss.Color(Catppuccin.Mauve().Hex)),
54 KeyValue: lipgloss.NewStyle().Foreground(lipgloss.Color(Catppuccin.Flamingo().Hex)),
55 }
56 return style
57}
58
59func (s Style) getTaskStyle(task todo.Task, checked bool) string {
60
61 todoText := task.Original
62
63 checkedRegex := regexp.MustCompile(`^x (\d{4}-\d{2}-\d{2} )? ?`)
64 priorityRegex := regexp.MustCompile(`^\([A-Z]\) `)
65 contextRegex := regexp.MustCompile(`@\w+`)
66 projectRegex := regexp.MustCompile(`\+\w+`)
67 keyValueRegex := regexp.MustCompile(`.+:.+`)
68
69 todoText = checkedRegex.ReplaceAllString(todoText, "")
70 todoText = priorityRegex.ReplaceAllString(todoText, "")
71
72 checkString := " "
73 if checked {
74 checkString = "✓"
75 }
76
77 switch task.Completed {
78 case true:
79 dateStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("#6c7086"))
80 dateString := dateStyle.Render(task.CompletedDate.Local().Format("02-01-2006 15:03"))
81 return fmt.Sprintf("%s %s %s %s", s.Check.Render(checkString), s.getPriorityStyle(task.Priority), s.Task.Completed.Render(todoText), dateString)
82 default:
83 todoText = contextRegex.ReplaceAllStringFunc(todoText, func(match string) string {
84 return s.Context.Render(match)
85 })
86 todoText = projectRegex.ReplaceAllStringFunc(todoText, func(match string) string {
87 return s.Project.Render(match)
88 })
89 todoText = keyValueRegex.ReplaceAllStringFunc(todoText, func(match string) string {
90 return s.Project.Render(match)
91 })
92 return fmt.Sprintf("%s %s %s", s.Check.Render(checkString), s.getPriorityStyle(task.Priority), s.Task.Todo.Render(todoText))
93 }
94}
95
96func (s Style) getPriorityStyle(priority string) string {
97 switch priority {
98 case "":
99 return " "
100 case "A":
101 return s.Priority.A.Render(priority)
102 case "B":
103 return s.Priority.B.Render(priority)
104 case "C":
105 return s.Priority.C.Render(priority)
106 default:
107 return priority
108 }
109}