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,
		todo.FilterDueToday,
		todo.FilterHasPriority,
	)

	// 按优先级升序和项目升序排序
	_ = tasks.Sort(
		todo.SortPriorityAsc,
		todo.SortProjectAsc,
	)

	// 打印并完成任务
	for i, t := range tasks {
		fmt.Println(t.Todo) // 打印任务内容
		tasks[i].Complete() // 标记任务为已完成
	}

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

代码说明

  1. 导入库

    import todo "github.com/1set/todotxt"
    
  2. 加载任务文件

    tasklist, err := todo.LoadFromPath("todo.txt")
    
  3. 过滤任务

    tasks := tasklist.Filter(
        todo.FilterNotCompleted,
        todo.FilterDueToday,
        todo.FilterHasPriority,
    )
    
  4. 排序任务

    _ = tasks.Sort(
        todo.SortPriorityAsc,
        todo.SortProjectAsc,
    )
    
  5. 操作任务

    tasks[i].Complete() // 标记任务为已完成
    
  6. 保存任务文件

    tasks.WriteToPath("today-todo.txt")
    

注意事项

  • 该库提供了多种预设的过滤器和排序选项,可以根据需要组合使用
  • 任务完成状态可以通过Complete()方法设置
  • 修改后的任务列表可以写入新文件或覆盖原文件

致谢

  • 原始go-todotxt库由Fabio Berchtold开发
  • todo.txt的创意来自Gina Trapani

更多关于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任务列表:todotxt库详解

todo.txt是一种简单高效的纯文本任务管理格式,而todotxt是一个Go语言库,用于解析和操作这种格式的任务列表。下面我将详细介绍如何使用这个库。

安装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)
	}

	// 或者从字符串加载
	// content := `(A) 完成项目报告 due:2023-12-31`
	// taskList, err := todotxt.ParseString(content)
	
	fmt.Printf("共找到 %d 个任务\n", taskList.Len())
}

2. 遍历和访问任务

// 遍历所有任务
for _, task := range taskList {
	fmt.Printf("任务: %s\n", task.Todo)
	fmt.Printf("优先级: %s\n", task.Priority)
	fmt.Printf("完成状态: %v\n", task.Completed)
	fmt.Printf("创建日期: %s\n", task.CreatedDate)
	fmt.Printf("完成日期: %s\n", task.CompletedDate)
	
	// 获取所有标签
	fmt.Printf("标签: %v\n", task.Tags())
	
	// 获取特定标签值
	if due, ok := task.TagValue("due"); ok {
		fmt.Printf("截止日期: %s\n", due)
	}
}

3. 创建和添加任务

// 创建新任务
newTask := todotxt.Task{
	Todo:        "写周报 +工作 @办公室",
	Priority:    "B",
	CreatedDate: time.Now(),
}

// 添加任务
taskList.AddTask(&newTask)

// 或者从字符串创建
anotherTask, err := todotxt.ParseTask("(C) 打电话给客户 @phone due:2023-12-15")
if err != nil {
	log.Fatal(err)
}
taskList.AddTask(anotherTask)

4. 修改任务

// 修改任务属性
task := taskList[0]
task.Todo = "更新后的任务描述"
task.Priority = "A"
task.AddTag("due", "2023-12-20")

// 标记任务为完成
task.Complete()

5. 过滤和查询任务

// 按优先级过滤
highPriority := taskList.Filter(todotxt.FilterPriority("A"))

// 按项目过滤
workTasks := taskList.Filter(todotxt.FilterProject("work"))

// 按上下文过滤
officeTasks := taskList.Filter(todotxt.FilterContext("office"))

// 按标签过滤
dueTasks := taskList.Filter(todotxt.FilterTag("due", "2023-12-31"))

// 组合过滤器
importantTasks := taskList.Filter(
	todotxt.And(
		todotxt.FilterPriority("A"),
		todotxt.FilterCompleted(false),
		todotxt.FilterTagExists("due"),
	),
)

6. 保存任务列表

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

// 或者获取字符串表示
content := taskList.String()
fmt.Println(content)

高级功能

1. 自定义排序

// 按优先级排序
taskList.Sort(todotxt.SortByPriority)

// 按截止日期排序
taskList.Sort(todotxt.SortByTag("due"))

// 自定义排序函数
taskList.Sort(func(t1, t2 *todotxt.Task) bool {
	return t1.CreatedDate.Before(t2.CreatedDate)
})

2. 批量操作

// 批量完成所有工作项目任务
for _, task := range taskList.Filter(todotxt.FilterProject("work")) {
	task.Complete()
}

// 批量删除所有已完成任务
taskList.RemoveAll(todotxt.FilterCompleted(true))

3. 任务验证

// 验证任务格式
err := task.Validate()
if err != nil {
	fmt.Printf("任务无效: %v\n", err)
}

完整示例

package main

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

func main() {
	// 创建新任务列表
	taskList := todotxt.TaskList{}

	// 添加几个任务
	taskList.AddTask(&todotxt.Task{
		Todo:        "完成项目报告 +work @office due:2023-12-31",
		Priority:    "A",
		CreatedDate: time.Now(),
	})

	taskList.AddTask(&todotxt.Task{
		Todo:        "购买礼物 @personal",
		Priority:    "B",
		CreatedDate: time.Now(),
	})

	// 标记第一个任务为完成
	taskList[0].Complete()

	// 打印所有未完成的任务
	fmt.Println("未完成的任务:")
	for _, task := range taskList.Filter(todotxt.FilterCompleted(false)) {
		fmt.Printf("- [%s] %s\n", task.Priority, task.Todo)
	}

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

这个库提供了丰富的功能来操作todo.txt格式的任务列表,包括解析、创建、修改、过滤和排序任务等。它的API设计简洁明了,非常适合集成到Go应用程序中实现任务管理功能。

回到顶部