17个版本

0.5.0 2023年5月21日
0.4.5 2023年5月4日
0.3.10 2023年4月14日
0.3.1 2023年3月30日

编程语言 分类中排名 325

Download history 1/week @ 2024-03-10 4/week @ 2024-03-31 345/week @ 2024-04-07 1/week @ 2024-04-21

每月下载量 105

MIT/Apache

38KB
779 代码行

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 只是一行文本,如果它出现在事件之后,它被视为该事件的备注,这将与 ics 条目的 DESCRIPTION 字段相对应。

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

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

过滤器

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

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

例如,考虑以下 filter

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

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

以下 filter 目前支持

  • 基本逻辑 filter:andornot
  • 范围 filter:过滤指定范围内的所有日期,例如 --1~--10 过滤出推断年份和月份中天值为 1 到 10 的所有日期
  • 星期 filter: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

依赖

~0–17MB
~204K SLoC