all repos — todo.txt-go @ d9af79b6e98422049364f78888c7d9269e3c660d

CLI tool for todo.txt files written in Go

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}