28个版本 (4个重大更新)

0.5.0 2023年5月21日
0.3.10 2023年4月14日
0.3.1 2023年3月30日
0.1.0 2022年12月31日

#581 in 文本处理


timeblok-cli 中使用

MIT/Apache

87KB
2.5K SLoC

TimeBlok

Crates.io discord invitation link

cargo install timeblok-cli  # install timeblok 
timeblok -no            # create&write a new blok file, and open it in your calendar app! 

什么是TimeBlok?

TimeBlok是一个简单、声明式的DSL,它结合了纯文本的灵活性和可扩展性以及数字日历的便利性,用于个人日历规划。

灵感来源于Cal Newport的文本文件时间阻挡,TimeBlok提供了一种简约的语法,用于在纯文本文件中组织你的日程,同时还可以编译为.ics文件,以便在任何日历应用中使用。

加入我们的Discord服务器!

示例

每日计划

这是最简单的用例

2023-1-1
7:30am wake up & eat beakfast
8am~11:30 work on TimeBlok
- Write Technical Documentation
2pm~6pm Study for exams
8pm~10pm Reading
- Finish an entire book

编译成.ics文件后,可以导入到你的日历中。

月度计划

/region CN                                        // Sets the region to China
2023-1-                                           // Locks in the following events to 2023-1
{--1~--10 and CNworkday}                          // workdays from jan 1 to jan 10 in China
7:30am wake up to a new day
10am ~ 11am work on EvilCorp

{sun}
4pm weekly review                                 //weekly review every sunday

--11
8am~10am Resign from EvilCorp
- Make sure you still have access to the servers


-2-                                               // This overrides the month information from line 1.
--1
3pm~4pm Initiate operation "Hack the planet"

处理后,可以导入到你的日历中:

安装

目前需要安装Rust

从cargo安装

$ cargo install timeblok-cli

使用

导出到文件

$ timeblok input.txt -f output.ics

导出并在默认日历应用中打开

$ timeblok input.txt -o

创建一个新的计划文件并在你的日历应用中打开它

$ timeblok --new -o
$ timeblok -no # shorthand

帮助

$ timeblok --help

集成

  • VSCode(语法高亮) 市场

规范

TimeBlock语言包含以下语句

  • 事件
  • 场合
  • 备注
  • 过滤器
  • 命令

Occasion 表示一个时间点,通常以 YYYY-MM-DD 格式表示日期。它可以是一个日期、一个时间,或者是一个日期和时间。Occasion 将会继承最近一次未指定字段。插入到作用域中的第一个 occasion 将是目标文件的创建日期。例如,如果上一个 occasion 是 2024-3-,那么 --3 将被解释为 2024-3-3

Event 是一行以 OccasionRange 开头,并跟随着表示事件名称的文本。

Note 只是一行文本,如果它发生在 Event 之后,它被认为是该事件的备注,这将与 ics 条目的 DESCRIPTION 字段相对应。

Range 简单地是一对 occasion,由一个 ~ 分隔,表示一个时间范围。

Command 是一行以 / 开头,后跟一个命令名称和参数,允许进行额外的扩展。

过滤器

Filters 是一种特殊的语句,可以用来过滤指定范围内的日期、事件、数字。Filters 可以嵌套和组合,以表示复杂的逻辑和重复的事件。在语法上,它们被大括号 {} 包围。

在解析过程中,Filters 绑定到最后指定的 Occasion,遍历所有适合 occasion 的可能值,并选择那些符合 filter 条件的值。

例如,考虑以下 filter

-2-
{--1~--10 and workday}

这个 filter 绑定到 occasion -2-,其中 occasion 的年份可以从先前的 occasion 继承(默认为文件的创建日期),日期未指定。因此,filter 将遍历所有可能的日期。由于两个子 filter 通过一个 and 子句连接,filter 将只选择那些同时在 --1~--10 范围内并且是工作日的日期。

以下 filter 目前受支持

  • 基本逻辑 filter:andornot
  • 范围 filter:过滤指定范围内的所有日期,例如 --1~--10 过滤出推断出的年份和月份中日期值为 1 到 10 的所有日期。
  • 星期过滤器:workdayweekendsundaymondaytuesdaywednesdaythursdayfridaysaturday(支持简写mon ~ sun
  • "灵活日期过滤器":基本上是范围过滤器的缩写,例如:--{1~10} 等同于 --1~--10

命令(实验性)

格式:/command_name [arg1] [arg2] ...

目前,命令是可以更改程序作用域或命名空间的语句,或执行任意操作。将来,命令还将支持创建OCCASIONSEVENTS,以及插件系统。

目前可用的命令包括

  • /region [region_name]:根据惊人的workalendar项目设置区域以解决工作日。有关所有支持区域名称的参考,请参阅此处。注意:目前仅支持ISO 3166-1ISO 3166-2代码(例如CN,US),但我们将支持更多灵活的区域名称。
  • /set [key] [value]:将命名空间中的名称设置为值。这对于创建自定义过滤器很有用。例如:/set semester {-2-17~-6-30}
  • /print [key]:打印命名空间中名称的值。
  • /tz [timezone] /timezone [timezone]:设置输出ics文件的时区。例如:/tz utc
  • /t [todo]:创建待办事件。例如:/t buy milk

依赖项

~15–31MB
~487K SLoC