在线思维导图工具(缩进文本 ↔ 树结构)

把已经写好的缩进大纲直接翻译成思维导图树:以首个非零缩进的宽度推断每级缩进单位,不做按平均值取整的猜测,算出每个节点的层级与父节点,再导出能渲染的 Mermaid mindmap 源码、能直接喂给程序的 JSON 树。页面不做画布拖拽。

层级 = ⌊缩进宽度 ÷ 2⌋,Tab 折算为 2 个空格宽
节点总数 8,最大深度 3 层,叶子节点 5 个 缩进单位:自动检测,首个非零缩进 2 空格 -- 大纲树预览 -- 产品规划 市场调研 用户访谈 竞品分析 技术方案 前端 后端 上线计划 -- 导出:Mermaid mindmap -- mindmap root((产品规划)) 市场调研 用户访谈 竞品分析 技术方案 前端 后端 上线计划

默认示例为 8 行产品规划大纲。改单位、改 Tab 展开宽度或换导出格式都会重算,大纲框里按 Ctrl+Enter(Mac 上 Cmd+Enter)也能解析。

使用方法

  1. 大纲框默认放着一段产品规划示例:产品规划是根,市场调研、技术方案、上线计划是二级,用户访谈、竞品分析、前端、后端是三级。打开即解析,按 Ctrl+Enter(Mac 上 Cmd+Enter)触发;被清空后点「解析大纲」会填回。
  2. 「缩进单位」默认自动检测,另有 2 空格、4 空格、Tab 三档可以手动指定。整份大纲内部一致时自动检测够用,混了不同宽度才需要手动锁死。
  3. 「Tab 展开宽度」默认 2,取值 1 到 8,决定一个 Tab 折成几个空格宽度;从编辑器复制出来的文本常用 4。
  4. 「导出格式」默认 Mermaid mindmap,可切成 JSON 树或 Markdown 嵌套列表,结果区下方的清单跟着切换。
  5. 结果区第一行给出节点总数、最大深度与叶子节点数,默认示例分别是 8、3、5;下方统计卡给出根节点、缩进单位与单位宽度。
  6. 节点表逐行列出每个节点的层级、父节点、子节点数与是否叶子,默认显示 6 行,点「加载更多」展开全部。
  7. 「复制结果」复制整段结论,「复制节点表」复制成制表符分隔的文本,「下载 JSON」保存不含字节序标记的文件,「导出 CSV」保存带字节序标记的表格。
  8. 文本为空、出现第二个根节点、缩进一次跨两级、层级超过 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产品规划01—3否
2市场调研22产品规划2否
3用户访谈43市场调研0是
4竞品分析43市场调研0是
5技术方案22产品规划2否
6前端43技术方案0是
7后端43技术方案0是
8上线计划22产品规划0是

四种缩进单位模式的判据与场景。

模式单位如何确定适用场景
自动检测取首个非零缩进的宽度整份文本缩进风格统一,绝大多数情况
2 空格一级固定 2首处缩进不可信,或宽度 3、5 的行应归到相邻层
4 空格一级固定 4从 Python 编辑器、YAML 文档复制来的大纲
Tab 一级取「Tab 展开宽度」输入框的数值整份文本用 Tab 缩进,或 Tab 与空格混用

三种导出格式的写法差别。

格式根节点写法层级如何表达用途
Mermaid mindmaproot((产品规划))每层多两个空格贴进支持 Mermaid 的文档系统渲染
JSON 树text 键在最外层children 数组嵌套交给前端导图库或后端接口
Markdown 嵌套列表- 产品规划每层多两个空格后接项目符号写回文档继续编辑

结果边界与适用说明

常见问题

为什么两行看起来缩进一样,结果一个成了父节点一个成了子节点?

因为层级取自宽度除以单位再向下取整,差一个空格就可能差一级。单位是 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 字段时再自行补充。

这个工具免费吗?

免费,无需注册即可使用。

输入的数据安全吗?

安全。解析在当前浏览器本地完成,大纲文本不会上传到服务器,也不会写入本地存储。

相关工具