使用方法
- 大纲框默认放着一段产品规划示例:产品规划是根,市场调研、技术方案、上线计划是二级,用户访谈、竞品分析、前端、后端是三级。打开即解析,按 Ctrl+Enter(Mac 上 Cmd+Enter)触发;被清空后点「解析大纲」会填回。
- 「缩进单位」默认自动检测,另有 2 空格、4 空格、Tab 三档可以手动指定。整份大纲内部一致时自动检测够用,混了不同宽度才需要手动锁死。
- 「Tab 展开宽度」默认 2,取值 1 到 8,决定一个 Tab 折成几个空格宽度;从编辑器复制出来的文本常用 4。
- 「导出格式」默认 Mermaid mindmap,可切成 JSON 树或 Markdown 嵌套列表,结果区下方的清单跟着切换。
- 结果区第一行给出节点总数、最大深度与叶子节点数,默认示例分别是 8、3、5;下方统计卡给出根节点、缩进单位与单位宽度。
- 节点表逐行列出每个节点的层级、父节点、子节点数与是否叶子,默认显示 6 行,点「加载更多」展开全部。
- 「复制结果」复制整段结论,「复制节点表」复制成制表符分隔的文本,「下载 JSON」保存不含字节序标记的文件,「导出 CSV」保存带字节序标记的表格。
- 文本为空、出现第二个根节点、缩进一次跨两级、层级超过 12 层、行数超过 1000,都会给出带行号的提示,页面不会拿上一次的树充当本次结果。
用它能处理哪些大纲问题
第一类场景是先有文字后需要图。开会记要点、写方案列条目时最顺手的形式就是缩进文本,等到要同步给别人才需要层级分明的导图。本页把缩进层级直接翻译成父子关系,不需要先摆框再连线。
第二类是把大纲搬进支持 Mermaid 渲染的文档系统。这类系统读源码渲染,把生成的 mindmap 源码贴进去就能出图;比起截图,源码改一个字就能重生成,也能随文档走版本管理。
第三类是给程序喂结构化数据。导出的 JSON 按 text 与 children 两个键组织,层级由数组的嵌套深度表达,不含坐标与连线字段,前端导图库通常直接认这种入口。
第四类是校验别人交来的大纲。多个根节点、层级跳段、缩进单位不一致这三类毛病在纯文本里很难一眼看出:视觉上只差一两个空格,实际结构却完全不同。本页把它们变成带行号的报错。
本页不做画布拖拽与手动连线,那是「从零画一张图」的交互路径;这里的任务是文本与结构之间的解析与导出。这个工具在本站也叫「在线思维导图工具」。
缩进是怎么变成层级的
核心只有一行式子:层级 = ⌊缩进宽度 ÷ 单位⌋。缩进宽度是行首空白折算成的空格数,一个半角空格算 1,一个全角空格 U+3000 算 2,Tab 先按「Tab 展开宽度」折成若干个空格再计入。举例来说,宽度为 4、单位为 2 时,⌊4 ÷ 2⌋ = 2。
自动检测取「首个非零缩进的宽度」当单位:示例里第一个有缩进的行宽度是 2,单位定为 2,宽度 4 的行落在第 2 层。这样即便整份大纲用 3 空格或 6 空格,只要内部一致都能判对;代价是首处缩进写错会把整棵树带偏,此时改手动指定。
挂靠由一条路径数组完成。数组 path 的第 d 项记录当前第 d 层最新处理到的节点;处理新的一行时,先把 path 截断到长度 lv,再把这一行挂到 path[lv-1] 名下,lv 为 0 时它就是根节点。缩进回退到更浅的层时,截断动作自然把后面几层丢掉,新节点就挂回了对应的父级。
用示例前四行走一遍:第 1 行产品规划宽度 0,lv = 0,成为根,path = [产品规划]。第 2 行市场调研宽度 2,lv = 1,截断到长度 1 后挂在根下,path = [产品规划, 市场调研]。第 3 行用户访谈宽度 4,lv = 2,挂在市场调研下。第 4 行竞品分析宽度同为 4,lv = 2,截断到长度 2 得 [产品规划, 市场调研],于是与用户访谈同层。
三个统计的口径。节点总数按非空行数统计;最大深度从根算起,根本身是第 1 层,示例为 3;叶子指没有任何子节点的节点,上线计划虽是二级节点但没有子节点,也计入叶子,所以 8 个节点里有 5 个叶子。
Mermaid mindmap 的写法。首行固定是 mindmap,第二行写根节点,格式是 root((名称)),双括号表示圆形根节点;之后的每一行前面空出「层数 × 2」个空格,层级就由这些空格表达。源文件里没有任何坐标、宽高与连线描述,改一行只影响那一行。
JSON 树的形状。每个节点由 text 与 children 两个键组成,children 只在有子节点时出现,叶子只有 text,所以示例里用户访谈导出来只有一个键。整棵树输出为一行紧凑文本。
完整示例(数据仅作演示)
默认示例共 8 行,解析出 8 个节点:产品规划在第 1 层;市场调研、技术方案、上线计划在第 2 层;用户访谈、竞品分析、前端、后端在第 3 层。叶子是用户访谈、竞品分析、前端、后端、上线计划这 5 个,最大深度 3 层。
按 Mermaid 导出得到 8 行源码,第一行是声明行 mindmap,第二行是根节点,其余六行列节点:
mindmap
root((产品规划))
市场调研
用户访谈
竞品分析
技术方案
前端
后端
上线计划
按 JSON 导出得到一行紧凑结构,根节点带 children,三级节点只有 text:
{"text":"产品规划","children":[{"text":"市场调研","children":[{"text":"用户访谈"},{"text":"竞品分析"}]},{"text":"技术方案","children":[{"text":"前端"},{"text":"后端"}]},{"text":"上线计划"}]}
换成 4 空格单位解析同一段文本会怎样:宽度依次是 0、2、4、4、2、4、4、2,单位取 4 时 ⌊2 ÷ 4⌋ = 0,市场调研与上线计划都被判成第 1 层,走到第 2 行就报出多个根节点。这也说明自动检测为什么只认首个非零缩进:整份文本只用一把尺子量。
节点层级与导出格式对照表
下表逐行拆开默认示例,宽度按单位 2 折算。
| 行号 | 节点 | 缩进宽度 | 层级 | 父节点 | 子节点数 | 是否叶子 |
|---|---|---|---|---|---|---|
| 1 | 产品规划 | 0 | 1 | — | 3 | 否 |
| 2 | 市场调研 | 2 | 2 | 产品规划 | 2 | 否 |
| 3 | 用户访谈 | 4 | 3 | 市场调研 | 0 | 是 |
| 4 | 竞品分析 | 4 | 3 | 市场调研 | 0 | 是 |
| 5 | 技术方案 | 2 | 2 | 产品规划 | 2 | 否 |
| 6 | 前端 | 4 | 3 | 技术方案 | 0 | 是 |
| 7 | 后端 | 4 | 3 | 技术方案 | 0 | 是 |
| 8 | 上线计划 | 2 | 2 | 产品规划 | 0 | 是 |
四种缩进单位模式的判据与场景。
| 模式 | 单位如何确定 | 适用场景 |
|---|---|---|
| 自动检测 | 取首个非零缩进的宽度 | 整份文本缩进风格统一,绝大多数情况 |
| 2 空格一级 | 固定 2 | 首处缩进不可信,或宽度 3、5 的行应归到相邻层 |
| 4 空格一级 | 固定 4 | 从 Python 编辑器、YAML 文档复制来的大纲 |
| Tab 一级 | 取「Tab 展开宽度」输入框的数值 | 整份文本用 Tab 缩进,或 Tab 与空格混用 |
三种导出格式的写法差别。
| 格式 | 根节点写法 | 层级如何表达 | 用途 |
|---|---|---|---|
| Mermaid mindmap | root((产品规划)) | 每层多两个空格 | 贴进支持 Mermaid 的文档系统渲染 |
| JSON 树 | text 键在最外层 | children 数组嵌套 | 交给前端导图库或后端接口 |
| Markdown 嵌套列表 | - 产品规划 | 每层多两个空格后接项目符号 | 写回文档继续编辑 |
结果边界与适用说明
- 空行直接忽略,只有一行也算一棵树,统计为节点总数 1、最大深度 1、叶子节点 1。
- 自动检测只认首个非零缩进:若第一处缩进只有一个空格,单位判成 1,后面写 2 个空格的行会被当成第 3 层,此时改选「2 空格一级」。
- 缩进一次只能深一级。从第 1 层直接到第 3 层会被拦下,报错里带出具体行号与跳了几级。
- 只有一行可以缩进为 0。出现第二个缩进为 0 的行时,页面认为存在多个根节点,并报出那一行的内容。
- 层级上限 12,行数上限 1000,超出时报出到达的行号与实际数值,在此之前不静默截断。
- 全角空格按 2 个宽度计入,Tab 按展开宽度折算,两者混用时按折算后的总宽度计算层级。
- 节点名原样保留,不做去重与排序;同一父级下出现两个同名节点时,它们在树里仍是两个独立节点。
- 下载的 JSON 不带字节序标记,导出的 CSV 带 UTF-8 字节序标记;页面不联网、不写入本地存储,大纲文本只用于本次解析。
常见问题
为什么两行看起来缩进一样,结果一个成了父节点一个成了子节点?
因为层级取自宽度除以单位再向下取整,差一个空格就可能差一级。单位是 2 时,宽度 3 的行算 ⌊3 ÷ 2⌋ = 1,宽度 4 的行算 2,两者在屏幕上常常只差一个空格。手动指定「缩进单位」,或先统一文本里的空格数再解析。
复制来的大纲混用了 Tab 和空格怎么办?
选「Tab 一级」并把「Tab 展开宽度」调成这份文本里一个 Tab 折合的空格数,一般是 2 或 4。页面先把 Tab 折成空格再统计宽度,混合缩进按折算后的总宽度计算。
「上线计划」明明是二级标题,为什么算作叶子节点?
叶子的定义是没有子节点,与它自己在第几层无关。上线计划下面没有更深的缩进行,所以它没有子节点,按照定义计入叶子。默认示例里 8 个节点中有 5 个属于这种情况。
最大深度是怎么数的?
从根节点算起,根节点本身是第 1 层。默认示例走到用户访谈、竞品分析、前端、后端这几行时到达第 3 层,所以最大深度是 3;只看一级标题的层数会比这个数字少 1。
Mermaid 里的节点名带括号会有问题吗?
会有。mindmap 用符号标记节点形状,圆形根节点写作 root((名称)),方括号、圆括号在语法里各有含义。节点名里出现这些符号时,先在原文换成中文括号或书名号再解析。
导出的 JSON 能直接给前端导图库用吗?
多数可以。每个节点带 text 与 children 两个键,children 里放子节点,叶子不带 children,层级由嵌套深度表达,不含坐标与连线字段。个别库要求 id 或 expanded 字段时再自行补充。
这个工具免费吗?
免费,无需注册即可使用。
输入的数据安全吗?
安全。解析在当前浏览器本地完成,大纲文本不会上传到服务器,也不会写入本地存储。
相关工具
- 商业计划书大纲生成器:先搭层级骨架,再拿回本页转成导图。
- Markdown 表格生成器:把节点表整理成表格写进文档。
- 在线 Markdown 编辑器:贴入 Mermaid 源码预览渲染效果。
- Markdown 转 HTML 转换器:嵌套列表导出后转成网页片段。
- 博客大纲生成器:文章选题先列层级骨架,同样适用本页规则。