没有不值得去解决的问题,也没有不值得去学习的技术!

Mermaid 11.9.0 报错 Syntax error in text:最终解决方案是给节点文本加双引号

图1:文章前台显示 Syntax error in text,Mermaid 版本为 11.9.0

作者:

最近在整理 WordPress 历史文章时,我遇到了一个 Mermaid 流程图语法问题。

文章中的流程图已经迁移到了 MerPress 的 Mermaid 区块中,但前台并没有正常显示,而是直接出现:

Plaintext
Syntax error in text
mermaid version 11.9.0
图1:文章前台显示 Syntax error in text,Mermaid 版本为 11.9.0
图1:文章前台显示 Syntax error in text,Mermaid 版本为 11.9.0

一开始我以为只是流程图声明写错了,但实际排查下来发现,真正关键的问题并不只在第一行。

最终有效的解决方式是:

Plaintext
A["节点文本"]

而不是:

Plaintext
A[节点文本]

尤其是节点中包含 test()main()go test() 这类函数名和中英文混合文本时,这个区别非常重要。

一、最开始发现的第一个问题:流程图 TD

原始 Mermaid 内容中,第一行写成了:

Plaintext
流程图 TD

这当然不是合法的 Mermaid 流程图声明。

Mermaid 应该使用:

Plaintext
flowchart TD

或者:

Plaintext
graph TD

因此最开始我把:

Plaintext
流程图 TD

修改成了:

Plaintext
flowchart TD

例如原来的代码:

Plaintext
流程图 TD
    A[程序启动] --> B[主协程启动,执行go test()]
    B --> C[子协程test()启动,就绪态]
    B --> D[主协程执行自身for循环]

修改为:

Plaintext
flowchart TD
    A[程序启动] --> B[主协程启动,执行go test()]
    B --> C[子协程test()启动,就绪态]
    B --> D[主协程执行自身for循环]

这个修改本身是正确的。

但是保存后再看前台,结果仍然是:

Plaintext
Syntax error in text
mermaid version 11.9.0

也就是说:

流程图 TD 确实有问题,但并不是这张流程图里唯一的问题。

二、flowchart TD 已经正确,为什么还是报错?

继续看流程图代码,可以发现很多节点都采用了这种写法:

Plaintext
B[主协程启动,执行go test()]

以及:

Plaintext
C[子协程test()启动,就绪态]

还有其他场景中的:

Plaintext
B[主协程启动,执行test()(无go关键字)]
Plaintext
C[test()输出hello,world 1]
Plaintext
H[main()输出hello:golang 1]

这些节点文本里面混合了:

Plaintext
test()
main()
go test()

同时还有:

  • 中文;
  • 英文半角括号 ()
  • 中文括号 ()
  • 逗号;
  • 冒号;
  • 数字;
  • 英文函数名。

这时候,继续只盯着:

Plaintext
flowchart TD

已经没有意义了。

真正需要处理的是:

节点文本的写法。

三、真正有效的解决方案:A["节点文本"]

最终采用的办法很简单:

把:

Plaintext
A[节点文本]

统一改成:

Plaintext
A["节点文本"]

例如:

Plaintext
B[主协程启动,执行go test()]

修改为:

Plaintext
B["主协程启动,执行go test()"]

原来的:

Plaintext
C[子协程test()启动,就绪态]

修改为:

Plaintext
C["子协程test()启动,就绪态"]

再比如:

Plaintext
B[主协程启动,执行test()(无go关键字)]

修改为:

Plaintext
B["主协程启动,执行test()(无go关键字)"]

这才是这次 Syntax error in text 最关键的修复。

也就是说,这次问题可以非常简单地总结为:

Plaintext
A[节点文本]

改成:

Plaintext
A["节点文本"]

四、完整修复后的 Mermaid 示例

以其中一张 goroutine 执行流程图为例,原来的代码大致是:

Plaintext
flowchart TD
    A[程序启动] --> B[主协程启动,执行go test()]
    B --> C[子协程test()启动,进入就绪态]
    B --> D[主协程继续执行自身for循环]
    C --> E[子协程输出hello,world 1]
    D --> F[主协程输出hello:golang 1]
    E --> G[子协程休眠1秒,让出CPU,进入等待态]
    F --> H[主协程休眠1秒,让出CPU,进入等待态]
    G --> I[子协程休眠结束,进入就绪态,等待调度]
    H --> J[主协程休眠结束,进入就绪态,等待调度]
    I --> K[调度器分配执行权,子协程输出hello,world 2]
    J --> L[调度器分配执行权,主协程输出hello:golang 2]
    K --> M[子协程休眠1秒]
    L --> N[主协程休眠1秒]
    M --> O[重复执行,直到两者都执行10次]
    N --> O
    O --> P[主协程执行完毕,退出]
    O --> Q[子协程执行完毕,退出]
    P --> R[程序终止]
    Q --> R

最终修改为:

Plaintext
flowchart TD
    A["程序启动"] --> B["主协程启动,执行go test()"]
    B --> C["子协程test()启动,进入就绪态"]
    B --> D["主协程继续执行自身for循环"]
    C --> E["子协程输出hello,world 1"]
    D --> F["主协程输出hello:golang 1"]
    E --> G["子协程休眠1秒,让出CPU,进入等待态"]
    F --> H["主协程休眠1秒,让出CPU,进入等待态"]
    G --> I["子协程休眠结束,进入就绪态,等待调度"]
    H --> J["主协程休眠结束,进入就绪态,等待调度"]
    I --> K["调度器分配执行权,子协程输出hello,world 2"]
    J --> L["调度器分配执行权,主协程输出hello:golang 2"]
    K --> M["子协程休眠1秒"]
    L --> N["主协程休眠1秒"]
    M --> O["重复执行,直到两者都执行10次"]
    N --> O
    O --> P["主协程执行完毕,退出"]
    O --> Q["子协程执行完毕,退出"]
    P --> R["程序终止"]
    Q --> R

修改完成后,流程图终于可以正常渲染。

图2:修复后的 Mermaid 流程图已经正常显示,go test()、test()、中文说明以及分支箭头均能够正常渲染
图2:修复后的 Mermaid 流程图已经正常显示,go test()test()、中文说明以及分支箭头均能够正常渲染

五、为什么以后我会优先使用 A["节点文本"]

严格来说,并不是所有 Mermaid 节点都必须写成:

Plaintext
A["节点文本"]

一些简单节点,例如:

Plaintext
A[程序启动]

本身也可能正常解析。

但是对于技术博客来说,流程图节点经常会包含:

Plaintext
test()
main()
time.Sleep()
go test()
runtime.Gosched()
hello,world
hello:golang

同时还会混合中文说明。

如果每次都去判断:

  • 哪个括号可能导致问题;
  • 哪个标点需要转义;
  • 哪种组合 Mermaid 11.9.0 能正常接受;
  • 哪种组合又可能触发解析错误;

反而没有必要。

对于普通文字矩形节点,我更倾向于直接统一写成:

Plaintext
A["节点文本"]

例如:

Plaintext
A["程序启动"]
B["主协程启动,执行go test()"]
C["子协程test()启动,就绪态"]
D["主协程执行自身for循环"]

这样简单很多。

六、为什么后来又处理了整篇 WordPress 源码

当时这篇文章里并不只有一张 Mermaid 流程图,而是存在多个 MerPress Mermaid 区块。

既然已经确定修复规则就是:

Plaintext
A[节点文本]

改成:

Plaintext
A["节点文本"]

那如果还在 WordPress 编辑器里逐个打开每张流程图,再一行一行修改,就比较麻烦了,也容易漏掉某一个节点。

所以我后来直接从 WordPress 的源代码编辑器里复制了整篇 Gutenberg 源码,交给 ChatGPT 一次性处理。

这里需要特别说明:

复制整篇 Gutenberg 源码并不是解决 Mermaid 错误的必要步骤。

它只是为了:

已经知道怎么修以后,一次性把文章里的多张 Mermaid 流程图全部改完。

如果一篇文章里只有一张流程图,完全可以直接在 Mermaid 区块中修改:

Plaintext
A[节点文本]

为:

Plaintext
A["节点文本"]

不需要处理整篇 WordPress 源码。

七、这次问题真正的排查顺序

回头看整个过程,实际经历的是:

Plaintext
前台出现:

Syntax error in text
mermaid version 11.9.0

首先发现:

Plaintext
流程图 TD

于是修改为:

Plaintext
flowchart TD

但仍然报错。

然后继续检查节点,发现:

Plaintext
B[主协程启动,执行go test()]

这类节点大量存在。

最终统一改为:

Plaintext
B["主协程启动,执行go test()"]

流程图恢复正常。

所以这次问题并不是:

flowchart TD 写错了。

而应该准确地说:

Mermaid 源码存在多处语法兼容问题,修正流程图声明后,节点文本仍然导致解析失败;最终通过给节点文本统一加双引号解决。

八、以后遇到 Syntax error in text,我会怎么处理

如果再次看到:

Plaintext
Syntax error in text

首先还是应该检查流程图声明:

Plaintext
flowchart TD

或者:

Plaintext
flowchart LR

是否正确。

接下来检查:

Plaintext
[]
()
{}

这些括号有没有不完整。

然后重点看节点文本。

例如遇到:

Plaintext
A[test()]
Plaintext
B[执行go test()]
Plaintext
C[main()执行结束]

我会优先直接改成:

Plaintext
A["test()"]
B["执行go test()"]
C["main()执行结束"]

对于技术博客中的普通文字节点,这已经可以作为一个比较实用的默认规则。

九、这也补充了我的历史文章迁移规则

这次问题是在处理 WordPress 历史文章格式迁移时遇到的。

过去很多流程图、终端输出、代码和说明内容都被放在 SyntaxHighlighter 之类的历史代码区块中。

迁移时,并不是所有内容都应该机械转换成 Code Block Pro。

例如真正的流程图内容,更适合转换为:

Plaintext
MerPress / Mermaid

因此迁移验收也不能简单要求:

Plaintext
原 SyntaxHighlighter 数量
=
新 Code Block Pro 数量

更合理的最低要求应该是:

Plaintext
SyntaxHighlighter = 0

原来的内容可以根据实际类型分别迁移成:

Plaintext
Code Block Pro
Mermaid
普通段落
其他更合适的 Gutenberg 区块

但对于 Mermaid,又需要额外增加一个验证条件:

区块存在还不够,必须保证 Mermaid 源码能够实际渲染。

因为:

HTML
<!-- wp:merpress/mermaidjs -->

存在,只能说明 Gutenberg 区块已经创建成功。

如果内部源码存在问题,前台仍然会显示:

Plaintext
Syntax error in text

所以以后 Mermaid 迁移的验收应该包含:

Plaintext
Mermaid 区块存在
+
源码结构正确
+
前台能够正常渲染

十、总结

这次遇到的错误是:

Plaintext
Syntax error in text
mermaid version 11.9.0

最开始发现流程图第一行写成了:

Plaintext
流程图 TD

修改为:

Plaintext
flowchart TD

之后,错误仍然存在。

继续检查后,最终确定真正有效的解决方式是:

Plaintext
A[节点文本]

修改为:

Plaintext
A["节点文本"]

尤其是节点中包含:

Plaintext
test()
main()
go test()
time.Sleep()

或者中英文、括号、标点混合内容时,统一使用双引号会更加稳妥。

所以这次最值得记住的其实不是复杂的排查流程,而只有这一条:

Plaintext
flowchart TD
    A["节点文本"]

而不是:

Plaintext
flowchart TD
    A[节点文本]

后来之所以把整篇 Gutenberg 源码复制出来处理,只是因为文章里存在多张 Mermaid 流程图,方便一次性全部修改,并不是解决问题所必需的步骤。

最终,修复后的流程图已经能够正常显示。

图3:最终修复后的 Mermaid 11.9.0 流程图正常渲染,不再出现 Syntax error in text

这次也算给后续 WordPress 历史文章迁移增加了一条很实用的经验:

Mermaid 普通文字节点优先使用 A["节点文本"],不要等前台出现语法错误后再逐个处理。

需要长期技术维护或远程问题排查?

我是拥有 15+ 年经验的 PHP / Go 后端工程师,长期关注已有系统维护、Bug 修复、性能优化、服务器排查、WordPress 网站维护和小功能迭代。

如果你的项目遇到以下情况,可以先从一次小问题排查开始合作:

  • ✅ PHP / Laravel / Yii2 老项目无人维护
  • ✅ Go / Gin 后端接口需要排查或优化
  • ✅ WordPress 网站访问慢、报错或插件冲突
  • ✅ Nginx / MySQL / Redis / Linux 服务器异常
  • ✅ CDN / Cloudflare / DNS / HTTPS 配置问题
  • ✅ 需要长期远程技术支持或兼职维护

更多介绍请查看:关于我 & 合作

微信:13980074657
邮箱:shuijingwanwq@gmail.com
Telegram:@shuijingwan
GitHub:https://github.com/shuijingwan

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理