#directory-structure #folder #tree #representation #json #cli #read

bin+lib ruut

使易于输入和易于获取的文件夹结构易于阅读

10 个版本 (破坏性)

0.8.0 2023 年 5 月 1 日
0.7.0 2022 年 7 月 30 日
0.6.1 2020 年 7 月 21 日
0.6.0 2020 年 3 月 9 日

#160值格式化

每月 45 次下载

MIT 许可证

40KB
998

ruut

Run tests Crates.io

为什么

我在 DocSend 的工作中经常处理文件夹结构。我也非常喜欢使用 tree(1) 来讨论文件夹结构。

不幸的是,大多数时候我并不是在文件系统上讨论文件夹结构,所以为了使用 tree(1) 获取美观的输出,我必须在计算机上创建目录和/或文件,这似乎有些荒谬。

这就是我创建 ruut 的原因。它将一个相当易于输入的表达式,比如这样

Parent (Child 1, Child 2 (Grandchild 1, Grandchild 2), Child 3)

转换成一个更漂亮的样子

Parent
├── Child 1
├── Child 2
│   ├── Grandchild 1
│   └── Grandchild 2
└── Child 3

它也适合打印树结构的序列化表示(见下面的 format 选项)。

注意:如果您只想从 Rust 程序中渲染上面显示的树样式,请查看 render_as_tree

用法

ruut 可以通过参数或从 stdin 接收 "结构"。

$ ruut 'Parent (Child 1, Child 2 (Grandchild 1, Grandchild 2), Child 3)'
# Equivalent to
$ echo 'Parent (Child 1, Child 2 (Grandchild 1, Grandchild 2), Child 3)' | ruut

安装

从 GitHub 下载

从本仓库的 版本发布部分 获取最新发布的版本。

使用 cargo

  1. 使用 rustup 安装 rust
  2. 运行 cargo install ruut

格式

本节中的所有示例都生成以下输出

Parent
├── Child 1
├── Child 2
│   ├── Grandchild 1
│   └── Grandchild 2
└── Child 3
    └── Grandchild 3

括号 (-f parens,默认)

Parent (Child 1, Child 2 (Grandchild 1, Grandchild 2), Child 3 (Grandchild 3))

本页设计便于输入。请注意,文件夹名称中间的空格会被保留。

以下是语法的正式描述

<name of folder> [(<name of subfolder 1> [(<name of subsubfolder1>[, <name of
subsubfolder2>[, ...]])][, <name of subfolder 2> [, ...]])]

使用<>包围的部分,需要您自行填写这些值。使用[]包围的部分是可选的。

JSON (-f json)

{
  "Parent": {
    "Child 1": null,
    "Child 2": {
      "Grandchild 1": null,
      "Grandchild 2": {},
    },
    "Child 3": {
      "Grandchild 3": "doesn't matter",
    }
  }
}

这里真正相关的是键名。注意,除了对象和空对象以外的实体都会被忽略。

注意,所有JSON5语法都被接受。JSON5是JSON的超集,支持不同类型的引号、注释等,因此您可以更容易地从实际的JavaScript环境中复制。有关详细信息,请参阅JSON5网站

带属性的JSON (-f jsonprop)

{
  "name": "Parent",
  "children": [
    {
      "name": "Child 1"
    },
    { 
      "name": "Child 2",
      "children": [
        {
          "name": "Grandchild 1"
        },
        {
          "name": "Grandchild 2",
          "children": []
        }
      ]
    },
    {
      "name": "Child 3",
      "children": [
        {
          "name": "Grandchild 3",
          "children": null
        }
      ]
    }
  ]
}

如果您是从外部源提取结构化树而不是手动编写,这通常很有用。请注意,children也可以是一个对象——在这种情况下,该对象的属性将被迭代,并忽略键名。

{
  "name": "Parent",
  "children": {
    "whatever_1": {
      "name": "Child 1"
    },
    "whatever_2": { 
      "name": "Child 2",
      "children": {
        "pls_ignore": {
          "name": "Grandchild 1"
        },
        "test_post": {
          "name": "Grandchild 2",
          "children": {}
        }
      }
    },
    "whatever_3": {
      "name": "Child 3",
      "children": {
        "it_me": {
          "name": "Grandchild 3",
          "children": null
        }
      }
    }
  }
}

注意,所有JSON5语法都被接受。JSON5是JSON的超集,支持不同类型的引号、注释等,因此您可以更容易地从实际的JavaScript环境中复制。有关详细信息,请参阅JSON5网站

默认情况下,此格式查找属性name用于打印每个项目的内容,并查找属性children以确定直接子项。要更改此设置,您可以使用--template--children选项,分别。缺失的值将被文本<missing>填充——这可以通过--raise-on-missing标志来覆盖。

-t/--模板<模板字符串>

此选项允许您使用简单的花括号模板语法从每个JSON节点中抓取任何属性。例如,对于一个具有属性id = 3type = "Folder"的节点,您可以编写模板字符串Id: {id}, Type: {type},这将产生Id: 3, Type: Folder

-c/--子项<子项属性>

此选项允许您指定包含子JSON节点的属性的名称,默认为children

-r/--引发--缺失

此标志会导致ruut在模板中的任何占位符缺失时立即报错。

版本管理

此项目遵循语义版本控制

依赖项

~4.5–5.5MB
~101K SLoC