golang解析和操作todo.txt任务列表插件库todotxt的使用

golang解析和操作todo.txt任务列表插件库todotxt的使用

todotxt是一个用于处理Gina Trapani的todo.txt文件的Go语言库。

特性

基于Fabio Berchtold的go-todotxt,并增加了以下功能:

  • Go模块支持
  • 任务字符串分段
  • 今天到期的任务不算逾期
  • 逾期任务的Due()返回负值
  • 支持多种排序和过滤选项
  • 更多排序选项:按ID、文本、上下文、项目排序
  • 预设过滤器

使用示例

下面是一个完整的示例代码,展示如何使用todotxt库解析和操作todo.txt文件:

package main

import (
	"fmt"
	"log"
	todo "github.com/1set/todotxt"
)

func main() {
	// 从文件加载任务列表
	tasklist, err := todo.LoadFromPath("todo.txt")
	if err != nil {
		log.Fatal(err)
	}

	// 过滤任务:未完成、今天到期且有优先级的任务
	tasks := tasklist.Filter(todo.FilterNotCompleted).
		Filter(todo.FilterDueToday, todo.FilterHasPriority)

	// 排序任务:按优先级升序,然后按项目升序
	_ = tasks.Sort(todo.SortPriorityAsc, todo.SortProjectAsc)

	// 遍历并处理任务
	for i, t := range tasks {
		// 打印任务内容
		fmt.Printf("任务 %d: %s\n", i+1, t.Todo)
		fmt.Printf("  优先级: %s\n", t.Priority)
		fmt.Printf("  项目: %v\n", t.Projects)
		fmt.Printf("  上下文: %v\n", t.Contexts)
		fmt.Printf("  创建日期: %v\n", t.CreatedDate)
		fmt.Printf("  到期日期: %v\n", t.DueDate)

		// 标记任务为已完成
		tasks[i].Complete()
	}

	// 将修改后的任务列表写入新文件
	if err = tasks.WriteToPath("today-todo.txt"); err != nil {
		log.Fatal(err)
	}

	fmt.Println("任务处理完成并已保存到 today-todo.txt")
}

更多操作示例

创建新任务

// 创建新任务
newTask := todo.Task{
    Todo:       "编写项目文档 +project @work due:2023-12-31",
    Priority:   "A",
    CreatedDate: time.Now(),
}

// 添加到任务列表
tasklist = append(tasklist, &newTask)

修改任务属性

// 修改任务优先级
tasklist[0].Priority = "B"

// 添加项目标签
tasklist[0].Projects = append(tasklist[0].Projects, "newproject")

// 设置到期日期
dueDate, _ := time.Parse("2006-01-02", "2023-12-25")
tasklist[0].DueDate = &dueDate

过滤和排序

// 过滤出包含特定项目的未完成任务
projectTasks := tasklist.Filter(todo.FilterNotCompleted, func(t *todo.Task) bool {
    for _, project := range t.Projects {
        if project == "important" {
            return true
        }
    }
    return false
})

// 按创建日期降序排序
_ = projectTasks.Sort(todo.SortCreatedDesc)

注意事项

  1. 日期格式应为"YYYY-MM-DD"
  2. 项目标签以"+“开头,上下文标签以”@"开头
  3. 使用Complete()方法标记任务为已完成时,会自动添加完成日期

这个库提供了丰富的功能来处理todo.txt格式的任务列表,包括加载、保存、过滤、排序和修改任务等操作。


更多关于golang解析和操作todo.txt任务列表插件库todotxt的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang解析和操作todo.txt任务列表插件库todotxt的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用Go语言操作todo.txt任务列表

todo.txt是一种简单的纯文本格式,用于管理任务列表。在Go语言中,我们可以使用todotxt库来解析和操作todo.txt文件。

安装todotxt库

首先需要安装todotxt库:

go get github.com/1set/todotxt

基本用法

1. 解析todo.txt文件

package main

import (
	"fmt"
	"log"
	"github.com/1set/todotxt"
)

func main() {
	// 从文件加载任务列表
	taskList, err := todotxt.LoadFromPath("todo.txt")
	if err != nil {
		log.Fatal(err)
	}

	// 遍历所有任务
	for i, task := range taskList {
		fmt.Printf("任务 #%d: %s\n", i+1, task.Todo)
		fmt.Printf("  完成状态: %t\n", task.Completed)
		fmt.Printf("  优先级: %s\n", task.Priority)
		fmt.Printf("  创建日期: %s\n", task.CreatedDate)
		fmt.Printf("  完成日期: %s\n", task.CompletedDate)
		fmt.Printf("  项目: %v\n", task.Projects)
		fmt.Printf("  上下文: %v\n", task.Contexts)
		fmt.Printf("  其他标签: %v\n", task.AdditionalTags)
		fmt.Println("---")
	}
}

2. 创建新任务

func addNewTask() {
	taskList := todotxt.TaskList{}

	// 添加新任务
	newTask := todotxt.Task{
		Todo:        "写Go代码示例",
		Priority:    "A",
		Projects:    []string{"work", "go"},
		Contexts:    []string{"office"},
		CreatedDate: time.Now(),
	}
	taskList.AddTask(&newTask)

	// 保存到文件
	if err := taskList.WriteToPath("todo.txt"); err != nil {
		log.Fatal(err)
	}
}

3. 修改任务

func modifyTask() {
	taskList, err := todotxt.LoadFromPath("todo.txt")
	if err != nil {
		log.Fatal(err)
	}

	// 修改第一个任务
	if len(taskList) > 0 {
		task := taskList[0]
		task.Priority = "B"
		task.Projects = append(task.Projects, "urgent")
	}

	// 保存修改
	if err := taskList.WriteToPath("todo.txt"); err != nil {
		log.Fatal(err)
	}
}

4. 标记任务为完成

func completeTask() {
	taskList, err := todotxt.LoadFromPath("todo.txt")
	if err != nil {
		log.Fatal(err)
	}

	// 标记第一个任务为完成
	if len(taskList) > 0 {
		task := taskList[0]
		task.Completed = true
		task.CompletedDate = time.Now()
	}

	// 保存修改
	if err := taskList.WriteToPath("todo.txt"); err != nil {
		log.Fatal(err)
	}
}

5. 过滤任务

func filterTasks() {
	taskList, err := todotxt.LoadFromPath("todo.txt")
	if err != nil {
		log.Fatal(err)
	}

	// 过滤未完成的任务
	incomplete := taskList.Filter(func(task *todotxt.Task) bool {
		return !task.Completed
	})

	// 过滤特定项目的任务
	workTasks := taskList.Filter(func(task *todotxt.Task) bool {
		for _, project := range task.Projects {
			if project == "work" {
				return true
			}
		}
		return false
	})

	fmt.Printf("未完成任务: %d\n", len(incomplete))
	fmt.Printf("工作相关任务: %d\n", len(workTasks))
}

高级用法

1. 自定义解析器

func customParser() {
	// 创建自定义解析器
	parser := todotxt.NewParser()
	parser.DisableAutoAddCreationDate = true // 禁用自动添加创建日期

	content := `(A) 这是一个高优先级任务 @work +project1
x 已完成任务 2023-01-01 2023-01-02
普通任务`

	taskList, err := parser.Parse(content)
	if err != nil {
		log.Fatal(err)
	}

	for _, task := range taskList {
		fmt.Println(task.Todo)
	}
}

2. 批量操作

func batchOperations() {
	taskList, err := todotxt.LoadFromPath("todo.txt")
	if err != nil {
		log.Fatal(err)
	}

	// 批量提高优先级
	for _, task := range taskList {
		if task.Priority == "B" {
			task.Priority = "A"
		}
	}

	// 批量添加项目标签
	for _, task := range taskList {
		if !task.Completed {
			task.Projects = append(task.Projects, "active")
		}
	}

	// 保存修改
	if err := taskList.WriteToPath("todo.txt"); err != nil {
		log.Fatal(err)
	}
}

注意事项

  1. todo.txt文件格式遵循特定规则:

    • 已完成任务以"x"开头
    • 优先级用(A)表示,A-Z
    • 项目用+project表示
    • 上下文用@context表示
  2. todotxt库会自动处理日期格式和任务解析,但最好保持文件格式规范。

  3. 对于大型任务列表,考虑使用Filter方法而不是直接遍历所有任务。

  4. 修改任务后需要显式调用WriteToPath保存更改。

通过todotxt库,Go程序可以轻松地与todo.txt格式交互,实现任务管理的自动化。

回到顶部