all repos — todo.txt-go @ a3a0af12af18ee20ca24340a6684f489dfcf206a

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}
 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}