# Mermaid 渲染问题修复 ## 修复时间 2026-01-27 ## 问题描述 用户报告了以下 Mermaid 相关问题: 1. **代码块转换功能被禁用**:`convertMermaidCodeblocks()` 函数第一行有 `return;`,导致 ```mermaid 代码块无法转换 2. **检测选择器不完整**:`detectMermaidBlocks()` 只检测 `div.mermaid-shortcode`,缺少其他格式的检测 3. **首页预览显示原始代码**:点击首页文章预览时,显示无格式化的纯文字 Mermaid 代码 ## 根本原因 ### 1. 代码块转换被禁用 在 `argontheme.js` 第 4345 行,`convertMermaidCodeblocks()` 函数开头有一个 `return;` 语句,导致整个函数被跳过: ```javascript function convertMermaidCodeblocks(){ return; // ← 这行导致函数直接返回 // ... 后面的代码都不会执行 } ``` ### 2. 检测选择器不完整 在 `MermaidRenderer.detectMermaidBlocks()` 中,选择器数组只包含一个元素: ```javascript const selectors = [ 'div.mermaid-shortcode' // 只检测 shortcode 格式 ]; ``` 缺少对以下格式的检测: - `div.mermaid-from-codeblock` - 代码块魔改格式 - `div.mermaid` - 标准格式 - `pre code.language-mermaid` - Markdown 格式 - `pre[data-lang="mermaid"]` - 自定义属性格式 - `code.mermaid` - 简化格式 ### 3. 首页预览问题 在三个文章预览模板中,使用 `wp_trim_words()` 直接处理包含 `[mermaid]...[/mermaid]` shortcode 的内容: ```php $preview = wp_trim_words(get_the_content('...'), $trim_words_count); ``` `wp_trim_words()` 会破坏 shortcode 结构,导致显示原始的 Mermaid 代码文本。 ## 修复方案 ### 1. 启用代码块转换功能 **文件**:`argontheme.js` **修改**:移除 `convertMermaidCodeblocks()` 函数开头的 `return;` 语句 ```javascript // 修改前 function convertMermaidCodeblocks(){ return; // ... } // 修改后 function convertMermaidCodeblocks(){ // 支持多种代码块格式 // ... } ``` **效果**: - ✅ ```mermaid 代码块可以正常转换为 `
↓
提取纯文本代码
↓
创建
↓
替换原始代码块
↓
代码高亮处理其他代码块
↓
MermaidRenderer.detectMermaidBlocks() ← 【检测阶段】
↓
MermaidRenderer.renderChart() ← 【渲染阶段】
```
### 支持的 Mermaid 格式
#### 1. Shortcode 格式(推荐)
```
[mermaid]
flowchart TD
A --> B
[/mermaid]
```
**优势**:
- 最稳定的方式
- 不受代码高亮影响
- 支持参数配置
#### 2. Markdown 代码块格式
````markdown
```mermaid
flowchart TD
A --> B
```
````
**优势**:
- 标准 Markdown 语法
- 编辑器支持好
- 可以拉起代码高亮
**注意**:需要代码块转换功能支持
#### 3. HTML 容器格式
```html
flowchart TD
A --> B
```
**优势**:
- 直接渲染
- 兼容性好
## 测试验证
### 测试场景 1:Shortcode 格式
**测试步骤**:
1. 创建新文章
2. 使用 `[mermaid]...[/mermaid]` 格式插入图表
3. 发布文章
4. 查看文章页面
5. 查看首页预览
**预期结果**:
- ✅ 文章页面正确渲染 Mermaid 图表
- ✅ 首页预览显示 `[Mermaid 图表]` 占位符
### 测试场景 2:Markdown 代码块格式
**测试步骤**:
1. 创建新文章
2. 使用 ` ```mermaid ` 格式插入图表
3. 发布文章
4. 查看文章页面
**预期结果**:
- ✅ 代码块被转换为 ``
- ✅ 图表正确渲染
- ✅ 不显示代码高亮的行号和复制按钮
### 测试场景 3:PJAX 切换
**测试步骤**:
1. 在首页点击文章链接(PJAX 加载)
2. 查看 Mermaid 图表是否渲染
3. 返回首页(PJAX 加载)
4. 再次点击文章
**预期结果**:
- ✅ PJAX 切换后图表正常渲染
- ✅ 不会重复渲染
- ✅ 主题切换正常工作
## 相关文件
### 修改的文件
- `argontheme.js` - 启用代码块转换,添加完整选择器
- `functions.php` - 添加 `argon_remove_mermaid_from_preview()` 函数
- `template-parts/content-preview-1.php` - 修复预览显示
- `template-parts/content-preview-2.php` - 修复预览显示
- `template-parts/content-preview-3.php` - 修复预览显示
### 相关文档
- `docs/mermaid-user-guide.md` - 用户使用指南
- `docs/mermaid-developer-guide.md` - 开发者文档
- `docs/mermaid-troubleshooting.md` - 故障排查指南
## Git 提交
```bash
git commit -m "fix: 修复 Mermaid 渲染问题
- 启用代码块转换功能(移除 convertMermaidCodeblocks 中的 return 语句)
- 添加完整的 Mermaid 代码块检测选择器
- 修复首页预览中显示原始 Mermaid 代码的问题
- 添加 argon_remove_mermaid_from_preview 函数过滤预览内容
- 更新三个文章预览模板,在预览中用 [Mermaid 图表] 替代原始代码"
```
**提交哈希**:135c226
## 后续建议
### 1. 功能增强
- [ ] 添加预览中的 Mermaid 图表缩略图
- [ ] 支持更多 Mermaid 图表类型
- [ ] 添加图表导出功能
### 2. 性能优化
- [ ] 延迟加载 Mermaid 库
- [ ] 缓存渲染结果
- [ ] 优化大型图表的渲染
### 3. 用户体验
- [ ] 添加图表编辑器
- [ ] 提供图表模板
- [ ] 改进错误提示
## 常见问题
### Q1: 为什么代码块转换被禁用了?
A: 可能是在之前的某次修复中,为了临时解决某个问题而添加了 `return;` 语句,但忘记移除。
### Q2: 如何确保 PJAX 兼容性?
A: 代码块转换在 `highlightJsRender()` 中调用,该函数已在 PJAX 回调中注册,因此自动支持 PJAX。
### Q3: 为什么不在预览中渲染 Mermaid 图表?
A: 因为:
1. 预览内容会被 `wp_trim_words()` 截断,可能破坏图表代码
2. 在列表页渲染大量图表会影响性能
3. 使用占位符更简洁明了
### Q4: 如何添加新的 Mermaid 格式支持?
A: 在 `detectMermaidBlocks()` 的 `selectors` 数组中添加新的选择器,并在 `extractMermaidCode()` 中添加对应的提取逻辑。
## 总结
本次修复解决了 Mermaid 渲染的三个主要问题:
1. ✅ **启用代码块转换**:移除了阻止转换的 `return;` 语句
2. ✅ **完善检测机制**:添加了完整的选择器列表,支持多种格式
3. ✅ **修复预览显示**:在预览中用占位符替代原始代码
用户现在可以:
- 使用 `[mermaid]...[/mermaid]` shortcode 格式(推荐)
- 使用 ` ```mermaid ` Markdown 代码块格式
- 在首页预览中看到友好的占位符而不是原始代码
- 享受完整的 Mermaid 图表渲染功能
所有修改都遵循了 Argon 主题的代码规范,并保持了向后兼容性。