DynoMark
Dynomark 致力于成为一个 Markdown 查询语言引擎,类似于 obsidian 的 Dataview 插件。
该程序可与 neovim、vscode 和 emacs 等编辑器配合使用,以提供 类似于 Dataview 的体验(但目前功能非常基础)。
安装
您可以在此处下载可执行文件:
或者如果您想自行构建:
要求:
- Go (1.22.5)
# Clone the repository
git clone https://github.com/k-lar/dynomark
cd dynomark/
# Compile the program
make
# Install the program
sudo make install
# If you want to uninstall the program
sudo make uninstall
[!NOTE] 对于 MacOS 用户:
如果你想像brew那样将程序安装到/usr/local/bin/, 你需要像这样将PREFIX变量设置为/usr/local:sudo make PREFIX=/usr/local install以及卸载:
sudo make PREFIX=/usr/local uninstall
[!NOTE] 对于 Windows 用户:
编译该程序最简单的方法是使用go build命令:go build -o dynomark.exe然后你可以使用
.\dynomark.exe运行该程序。 如果你希望 dynomark 在终端中作为命令可用,你必须将 dynomark.exe 添加到你的 PATH 环境变量中。
Roadmap
- 已完成引擎
- LIST 支持
- TASKS 支持
- PARAGRAPH 支持
- ORDEREDLIST 支持
- UNORDEREDLIST 支持
- FENCEDCODE 支持
- 限制
- 条件语句
- AND
- OR
- IS 语句 (equals / ==)
- SORT (Order by)
- ASCENDING
- DESCENDING
- GROUP BY (metadata)
- 限制最大分组数
- 限制每个分组下的结果
- 元数据解析
- 同时查询多个文件/目录
- 支持基于元数据/标签的条件 (e.g. TABLE author, published FROM example.md WHERE [author] IS "Shakespeare")
- TABLE 支持
- TABLE NO ID 支持 (A TABLE query without ID/File column)
- 支持 AS 语句 (e.g. TABLE author AS "Author", published AS "Date published" FROM ...)
- 🎉 Neovim 插件 🎉
- 🎉 Visual Studio Code 扩展 🎉 - Github 仓库
- 🎉 Emacs 包 🎉
- 查询语法文档
示例
以下是一个示例 Markdown 文档:
# Test Markdown File
This is a test markdown file to test the Dynomark parser.
## Tasks
- [ ] Implement DynoMark parser
- [x] Create test markdown file
- [ ] Write unit tests
- [x] Design CLI interface
## Lists
### Unordered List
- Item 1
- Item 2
- Item 3 that's
like really
really
really
long
- Item 4
### Ordered List
1. First item
2. Second item
3. Third item that's
kinda
sorta
long-ish
4. Fourth item
## Code
Here's a sample code block:
```go
func main() {
fmt.Println("Hello, DynoMark!")
}
```
以下是一些查询及其结果:
examples/ 目录中的文件列表:
查询:LIST FROM "examples/"
结果:
- movie_reviews.md
- tasks.md
- test.md
来自 examples/movie_reviews.md 和 examples/tasks.md 文件的段落:
查询:PARAGRAPH FROM examples/movie_reviews.md, examples/tasks.md
结果:
Some movie review stuff here.
This is a test markdown file to test the Dynomark parser.
examples/test.md 文件中的任务列表:
查询:TASK FROM "examples/test.md" WHERE NOT CHECKED
结果:
- [ ] Implement DynoMark parser
- [ ] Write unit tests
todos/ 目录内所有 .md 文件中未完成任务的列表,按文件路径分组:
查询:TASK FROM todos/ WHERE NOT CHECKED GROUP BY [file.path]
结果:
- todos/todo-1.md
- [ ] Task 1
- [ ] Task 3
- todos/todo-2.md
- [ ] Item 1
- todos/todo-3.md
- [ ] Other task 1
- [ ] Other task 2
todos/ 目录内所有 .md 文件中的任务列表,按文件名分组(最多 2 组,每组最多 3 条结果):
查询:TASK FROM todos/ GROUP BY 2 [file.path] LIMIT 3
结果:
- todo-1.md
- [ ] Task 1
- [X] Task 2
- [ ] Task 3
- todo-2.md
- [ ] Item 1
- [X] Item 2
- [X] Item 3
examples/test.md 中的所有无序列表:
查询:UNORDEREDLIST FROM "examples/test.md"
结果:
- Item 1
- Item 2
- Item 3 that's
like really
really
really
long
- Item 4
examples/test.md 中所有包含单词 "really" 的无序列表项:
查询:UNORDEREDLIST FROM "examples/test.md" WHERE CONTAINS "really"
结果:
- Item 3 that's
like really
really
really
long
examples/test.md 中所有包含单词 "kinda" 的有序列表项:
查询:ORDEREDLIST FROM "examples/test.md" WHERE CONTAINS "kinda"
结果:
3. Third item that's
kinda
sorta
long-ish
examples/test.md 中的所有任务,但将结果限制为前 2 个:
查询:TASK FROM "examples/test.md" LIMIT 2
结果:
- [ ] Implement DynoMark parser
- [x] Create test markdown file
examples/test.md 中所有任务,其中任务包含单词 "unit" 或 "CLI":
查询:TASK FROM "examples/test.md" WHERE CONTAINS "CLI" OR CONTAINS "unit"
结果:
- [ ] Write unit tests
- [x] Design CLI interface
examples/test.md 中所有任务,其中任务包含单词 "unit"
或 "CLI",且任务未被勾选:
查询:TASK FROM "examples/test.md" WHERE CONTAINS "CLI" OR CONTAINS "unit" AND NOT CHECKED
结果:
- [ ] Write unit tests
examples/test.md 中所有带围栏的代码块:
查询:FENCEDCODE FROM "examples/test.md"
结果:
func main() {
fmt.Println("Hello, DynoMark!")
}
排序
自版本 0.2.0 起,dynomark 支持按元数据字段对表格结果进行排序,
以及按字母顺序(升序和降序)对常规查询进行排序。
examples/test.md 中的所有任务均按其勾选状态以升序排序:
查询:TASK FROM "examples/test.md" WHERE NOT CHECKED SORT ASC
结果:
- [ ] Implement DynoMark parser
- [ ] Implement DynoMark parser but better
- [ ] Task 1
- [ ] Task 3
- [ ] Task 6
- [ ] Task 7
- [ ] Test 1
- [ ] Write unit tests
元数据支持
Dynomark 支持以键值对形式存储的元数据。目前,您可以使用
dataview 语法
为 Markdown 文件添加元数据。当前仅支持标准元数据
语法,不支持替代的“隐藏”语法(也许未来会支持)。
要在查询中引用元数据,您必须使用以下语法:
[metadata_key]
唯一不需要使用该语法的地方是 TABLE 查询,
在那里您可以直接使用元数据键,如下面的示例所示。
每个处理的文件默认定义了 10 个元数据字段:
file.path: 文件的相对路径file.name: 文件名,包括文件扩展名file.shortname: 不含文件扩展名的文件名file.folder: 文件所在的文件夹file.link: 指向该文件的 Markdown 链接(相对于当前工作目录)file.size: 文件的字节大小file.cday: 文件的创建日期,采用 ISO8601 格式file.mday: 文件的修改日期,采用 ISO8601 格式file.ctime: 文件的创建时间,采用 ISO8601 格式file.mtime: 文件的修改时间,采用 ISO8601 格式
注意:
IS 是 CONTAINS 语句的严格版本,仅当
元数据值与 IS 后的参数完全相同时才会匹配。它也可以
用于普通查询,在 CONTAINS 不够用的情况下,
但这很少见,因为您需要知道所查找结果的
确切值。
您可以在查询中使用元数据,如下所示:
PARAGRAPH FROM "examples/" WHERE [author] IS "Shakespeare"
这将返回 examples/ 中所有 .md 文件的所有段落,
其中元数据键 author 为 Shakespeare。
表格
Dynomark 支持以表格格式查询文件中的元数据。
以下是一个示例查询,按创建日期和标题查询 todos/
目录中的所有文件:
TABLE file.cday AS "Date created", title AS "Title" FROM todos/
这将返回如下表格:
| File | Date created | Title |
|-----------|--------------|---------|
| todo-1.md | 2024-08-17 | Title 1 |
| todo-2.md | 2024-08-18 | Title 2 |
| todo-3.md | 2024-08-19 | Title 3 |
| todo-4.md | 2024-08-20 | Title 4 |
| todo-5.md | 2024-08-21 | Title 5 |
您还可以使用 TABLE NO ID 语句创建不包含 ID/文件列的表格:
TABLE NO ID file.cday AS "Date created", title AS "Title" FROM todos/
这将返回如下表格:
| Date created | Title |
|--------------|---------|
| 2024-08-17 | Title 1 |
| 2024-08-18 | Title 2 |
| 2024-08-19 | Title 3 |
| 2024-08-20 | Title 4 |
| 2024-08-21 | Title 5 |
以及一个包含元数据条件的示例:
TABLE NO ID file.cday AS "Date created", title AS "Title" FROM todos/ WHERE [title] IS "Title 2"
这将返回如下表格:
| Date created | Title |
|--------------|---------|
| 2024-08-18 | Title 2 |
AS 语句是可选的。如果您不提供别名,则元数据 键将用作列名。
表格也支持排序。您可以按任何存在的元数据键 以升序或降序排序。
我们将采用之前的示例,并按标题降序排序:
TABLE NO ID file.cday AS "Date created", title AS "Title" FROM todos/ SORT [title] DESC
这将返回如下表格:
| Date created | Title |
|--------------|---------|
| 2024-08-21 | Title 5 |
| 2024-08-20 | Title 4 |
| 2024-08-19 | Title 3 |
| 2024-08-18 | Title 2 |
| 2024-08-17 | Title 1 |
如果要按多列排序,可以通过逗号分隔各列来实现:
TABLE NO ID file.cday AS "Date created", title AS "Title" FROM todos/ SORT [title] ASC, [file.cday] DESC
弃用
[!WARNING] 在 TABLE NO ID 之前,存在 TABLE_NO_ID,该语法现已弃用。 如果您尝试使用 TABLE_NO_ID,将显示警告,但仍会显示结果。 该语法将在稍后移除,因此请在此之前更新您的查询!**