feat(parser): add ToRemind method to Task for Remind-compatible string output
Implements Task.ToRemind(), which generates a Remind-formatted string including due date, metadata, projects, contexts, completion status, and priority.
This commit is contained in:
@@ -25,6 +25,75 @@ type Task struct {
|
||||
Metadata map[string]string `json:"metadata"`
|
||||
}
|
||||
|
||||
func (t Task) ToRemind() string {
|
||||
var sb strings.Builder
|
||||
sb.WriteString("REM TODO ")
|
||||
if t.DueDate == nil {
|
||||
return ""
|
||||
}
|
||||
sb.WriteString(t.DueDate.Format("2006-01-02"))
|
||||
|
||||
sb.WriteString(" ++5 INFO \"Calendar: TODO.TX\" ")
|
||||
|
||||
if len(t.Metadata) > 0 {
|
||||
for k, v := range t.Metadata {
|
||||
if k == "due" {
|
||||
continue
|
||||
}
|
||||
// k must have the first letter uppercase for Remind
|
||||
k = strings.ToUpper(k[:1]) + k[1:]
|
||||
sb.WriteString(fmt.Sprintf("INFO \"%s: %s\" ", k, v))
|
||||
}
|
||||
}
|
||||
|
||||
if len(t.Projects) > 0 {
|
||||
for _, p := range t.Projects {
|
||||
sb.WriteString(fmt.Sprintf("INFO \"List: %s\" ", p))
|
||||
}
|
||||
}
|
||||
|
||||
if len(t.Contexts) > 0 {
|
||||
for _, c := range t.Contexts {
|
||||
sb.WriteString(fmt.Sprintf("INFO \"Tag: %s\" ", c))
|
||||
}
|
||||
}
|
||||
|
||||
if t.Completed {
|
||||
sb.WriteString(fmt.Sprintf("COMPLETE-THROUGH %s ", t.DueDate.Format("2006-01-02")))
|
||||
}
|
||||
|
||||
if t.Priority != nil {
|
||||
sb.WriteString(fmt.Sprintf("PRIORITY %d ", t.PriorityAsRemind()))
|
||||
}
|
||||
|
||||
sb.WriteString("MSG")
|
||||
|
||||
if len(t.Projects) > 0 {
|
||||
sb.WriteString(" %<List>:")
|
||||
}
|
||||
|
||||
sb.WriteString(fmt.Sprintf(" %s", t.Description))
|
||||
|
||||
if t.Completed {
|
||||
sb.WriteString("%:")
|
||||
} else {
|
||||
sb.WriteString(" (%b)")
|
||||
}
|
||||
|
||||
if len(t.Metadata) > 0 {
|
||||
for k := range t.Metadata {
|
||||
if k == "due" {
|
||||
continue
|
||||
}
|
||||
// uppercase first letter for Remind
|
||||
k = strings.ToUpper(k[:1]) + k[1:]
|
||||
sb.WriteString(fmt.Sprintf("%%_%s: %%<%s>", k, k))
|
||||
}
|
||||
}
|
||||
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
// PriorityAsRemind returns an integer representing the priority for sorting.
|
||||
// A = 9999 (highest), Z = 0 (lowest), absent = 5000.
|
||||
func (t Task) PriorityAsRemind() int {
|
||||
|
||||
Reference in New Issue
Block a user