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)
}
}
代码说明
-
导入库:
import todo "github.com/1set/todotxt"
-
加载任务文件:
tasklist, err := todo.LoadFromPath("todo.txt")
-
过滤任务:
tasks := tasklist.Filter( todo.FilterNotCompleted, todo.FilterDueToday, todo.FilterHasPriority, )
-
排序任务:
_ = tasks.Sort( todo.SortPriorityAsc, todo.SortProjectAsc, )
-
操作任务:
tasks[i].Complete() // 标记任务为已完成
-
保存任务文件:
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应用程序中实现任务管理功能。