ITADN
k-lar/dynomark
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

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.mdexamples/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 文件的所有段落, 其中元数据键 authorShakespeare

表格

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,将显示警告,但仍会显示结果。 该语法将在稍后移除,因此请在此之前更新您的查询!**