From 32c2a72d2be30f5eac2a8083093b79dd44fbbae0 Mon Sep 17 00:00:00 2001 From: nanhaoluo <3075912108@qq.com> Date: Sat, 24 Jan 2026 21:02:47 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20Mermaid=20Shortcod?= =?UTF-8?q?e=20=E6=94=AF=E6=8C=81=EF=BC=88=E6=8E=A8=E8=8D=90=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 [mermaid]...[/mermaid] shortcode - 支持 theme、width、height、align 参数 - 不依赖 WP-Markdown 的处理方式 - 不会被 WordPress 自动格式化破坏 - 在原生编辑器中清晰可见 - 添加完整的使用指南和示例 --- argontheme.js | 8 +- docs/mermaid-shortcode-guide.md | 505 +++++++++++++++++++++++ functions.php | 29 +- tests/test-shortcode-example.md | 365 ++++++++++++++++ tests/test-single-element-container.html | 197 +++++++++ 5 files changed, 1102 insertions(+), 2 deletions(-) create mode 100644 docs/mermaid-shortcode-guide.md create mode 100644 tests/test-shortcode-example.md create mode 100644 tests/test-single-element-container.html diff --git a/argontheme.js b/argontheme.js index c8acd42..8ba663a 100644 --- a/argontheme.js +++ b/argontheme.js @@ -4429,6 +4429,7 @@ void 0; // 检测规则(优先级从高到低) const selectors = [ + 'div.mermaid-shortcode', // Shortcode 格式(推荐) 'div.mermaid', // 标准格式 'pre code.language-mermaid', // Markdown 格式 'pre[data-lang="mermaid"]', // 自定义属性格式 @@ -4690,8 +4691,13 @@ void 0; extractMermaidCode(element) { let code = ''; + // 处理 Shortcode 格式(推荐) + if (element.classList.contains('mermaid-shortcode')) { + code = element.textContent; + this.logDebug('从 Shortcode 格式提取代码'); + } // 处理 Markdown 容器语法格式 - if (element.classList.contains('mermaid-container-block')) { + else if (element.classList.contains('mermaid-container-block')) { code = element.textContent; this.logDebug('从 Markdown 容器语法提取代码'); } diff --git a/docs/mermaid-shortcode-guide.md b/docs/mermaid-shortcode-guide.md new file mode 100644 index 0000000..bcf8089 --- /dev/null +++ b/docs/mermaid-shortcode-guide.md @@ -0,0 +1,505 @@ +# Mermaid Shortcode 使用指南 + +## 为什么使用 Shortcode? + +在 WP-Markdown 环境下,使用 Shortcode 是最可靠的 Mermaid 图表标记方式: + +### 优点 ✅ + +1. **不依赖 WP-Markdown 的处理方式** + - 不会被 WordPress 自动格式化破坏 + - 不会将 `-->` 转换为 `–>` + - 不会丢失换行符 + +2. **在原生编辑器中清晰可见** + - 经典编辑器:文本模式下直接可见 + - Gutenberg 编辑器:使用"短代码"块 + - 易于编辑和维护 + +3. **支持参数配置** + - 可以设置主题(theme) + - 可以设置宽度(width) + - 可以设置高度(height) + - 可以设置对齐方式(align) + +4. **完全兼容** + - 与其他 Shortcode 一样使用 + - 不需要额外插件 + - 不需要修改 WP-Markdown + +### 对比其他方式 + +| 方式 | 优点 | 缺点 | +|------|------|------| +| **Shortcode** ⭐ | 可靠、易用、支持参数 | 需要记住语法 | +| 容器语法 `::: mermaid` | 符合 Markdown 规范 | 被 WP 格式化破坏 | +| 代码块 ` ```mermaid ` | 通用 | 被代码高亮干扰 | +| HTML `
和
标签
+ $content = shortcode_content_preprocess($attr, $content);
+
+ // 获取参数
+ $theme = isset( $attr['theme'] ) ? $attr['theme'] : 'default';
+ $width = isset( $attr['width'] ) ? $attr['width'] : '100%';
+ $height = isset( $attr['height'] ) ? $attr['height'] : 'auto';
+ $align = isset( $attr['align'] ) ? $attr['align'] : 'center';
+
+ // 生成唯一 ID
+ $chart_id = 'mermaid-' . mt_rand(1000000000, 9999999999);
+
+ // 构建输出
+ $out = '
]*class=["\']([^"\']*\s)?language-mermaid(\s[^"\']*)?["\'][^>]*>/i', //
'/]*data-lang=["\']mermaid["\'][^>]*>/i', //
- '/]*class=["\']([^"\']*\s)?mermaid(\s[^"\']*)?["\'][^>]*>/i' //
+ '/]*class=["\']([^"\']*\s)?mermaid(\s[^"\']*)?["\'][^>]*>/i', //
+ '/:::\s*mermaid/i' // ::: mermaid (Markdown 容器语法)
];
foreach ($patterns as $pattern) {
diff --git a/tests/test-shortcode-example.md b/tests/test-shortcode-example.md
new file mode 100644
index 0000000..adbfa13
--- /dev/null
+++ b/tests/test-shortcode-example.md
@@ -0,0 +1,365 @@
+# AI 垃圾评论检测系统架构
+
+## 系统概述
+
+本文档展示 Argon 主题的 AI 垃圾评论检测系统的完整架构和流程。
+
+## 主流程图
+
+[mermaid theme="default" width="100%" align="center"]
+flowchart TD
+ Start([用户提交评论]) --> PreProcess[预处理评论]
+ PreProcess --> CheckEnabled{启用 AI 检测?}
+
+ CheckEnabled -->|否| DirectSave[直接保存评论]
+ CheckEnabled -->|是| CheckMode{检测模式?}
+
+ CheckMode -->|manual| DirectSave
+ CheckMode -->|keyword| CheckKeyword[检查关键字]
+ CheckMode -->|sample| CheckSample[智能抽样]
+ CheckMode -->|all| NeedCheck[需要检测]
+
+ CheckKeyword --> KeywordMatch{匹配关键字?}
+ KeywordMatch -->|是| NeedCheck
+ KeywordMatch -->|否| DirectSave
+
+ CheckSample --> SampleDecision{抽中?}
+ SampleDecision -->|是| NeedCheck
+ SampleDecision -->|否| DirectSave
+
+ NeedCheck --> SetPending[设置待审核状态]
+ SetPending --> SaveWithFlag[保存评论并标记]
+ SaveWithFlag --> TriggerDetect[触发 AI 检测]
+
+ TriggerDetect --> CallAPI[调用 AI API]
+ CallAPI --> ParseResult[解析结果]
+
+ ParseResult --> CheckConfidence{置信度?}
+ CheckConfidence -->|高| AutoHandle[自动处理]
+ CheckConfidence -->|中| ManualReview[人工审核]
+ CheckConfidence -->|低| MarkNormal[标记正常]
+
+ AutoHandle --> CheckAction{处理方式?}
+ CheckAction -->|trash| MoveTrash[移入回收站]
+ CheckAction -->|hold| KeepPending[保持待审核]
+ CheckAction -->|mark| JustMark[仅标记]
+
+ MoveTrash --> NotifyAdmin[通知管理员]
+ KeepPending --> NotifyAdmin
+ JustMark --> SaveResult[保存结果]
+ ManualReview --> SaveResult
+ MarkNormal --> SaveResult
+ NotifyAdmin --> SaveResult
+
+ SaveResult --> AILearn{启用学习?}
+ AILearn -->|是| ExtractKeywords[提取关键词]
+ AILearn -->|否| End([结束])
+ ExtractKeywords --> UpdateDB[更新词库]
+ UpdateDB --> End
+
+ DirectSave --> End
+
+ style Start fill:#e1f5e1,stroke:#2e7d32,stroke-width:2px
+ style End fill:#e1f5e1,stroke:#2e7d32,stroke-width:2px
+ style MoveTrash fill:#ff6b6b,stroke:#c62828,stroke-width:2px
+ style MarkNormal fill:#95e1d3,stroke:#2e7d32,stroke-width:2px
+ style ManualReview fill:#ffa500,stroke:#ff8f00,stroke-width:2px
+[/mermaid]
+
+## 检测模式详解
+
+[mermaid theme="default" width="80%" align="center"]
+flowchart LR
+ subgraph Manual[Manual 模式]
+ M1[关闭实时检测]
+ M2[仅手动扫描]
+ end
+
+ subgraph Keyword[Keyword 模式]
+ K1[关键字触发]
+ K2[精准检测]
+ K3[低成本]
+ end
+
+ subgraph Sample[Sample 模式]
+ S1[智能抽样]
+ S2[平衡准确性]
+ S3[控制成本]
+ end
+
+ subgraph All[All 模式]
+ A1[全量检测]
+ A2[最高准确性]
+ A3[高成本]
+ end
+
+ style Manual fill:#e3f2fd
+ style Keyword fill:#fff3e0
+ style Sample fill:#f3e5f5
+ style All fill:#fce4ec
+[/mermaid]
+
+## AI 检测流程
+
+[mermaid theme="default" width="90%"]
+sequenceDiagram
+ participant User as 用户
+ participant WP as WordPress
+ participant Argon as Argon 主题
+ participant AI as AI API
+ participant DB as 数据库
+
+ User->>WP: 提交评论
+ WP->>Argon: 触发 preprocess_comment
+ Argon->>Argon: 检查检测规则
+
+ alt 需要检测
+ Argon->>DB: 保存评论(待审核)
+ Argon->>AI: 发送检测请求
+ AI-->>Argon: 返回检测结果
+ Argon->>Argon: 解析结果和置信度
+
+ alt 高置信度垃圾评论
+ Argon->>DB: 移入回收站
+ Argon->>WP: 发送通知邮件
+ else 中等置信度
+ Argon->>DB: 标记待人工审核
+ else 正常评论
+ Argon->>DB: 标记为正常
+ end
+
+ Argon->>DB: 保存检测记录
+
+ opt 启用 AI 学习
+ Argon->>AI: 提取关键词
+ AI-->>Argon: 返回关键词
+ Argon->>DB: 更新学习词库
+ end
+ else 跳过检测
+ Argon->>DB: 直接保存评论
+ end
+
+ WP-->>User: 显示提交结果
+[/mermaid]
+
+## 数据库结构
+
+[mermaid theme="default" width="85%"]
+erDiagram
+ COMMENT ||--o{ COMMENT_META : has
+ COMMENT {
+ bigint comment_ID PK
+ bigint comment_post_ID FK
+ text comment_content
+ varchar comment_author
+ varchar comment_author_email
+ varchar comment_author_IP
+ datetime comment_date
+ varchar comment_approved
+ }
+
+ COMMENT_META {
+ bigint meta_id PK
+ bigint comment_id FK
+ varchar meta_key
+ longtext meta_value
+ }
+
+ SPAM_DETECTION ||--|| COMMENT : detects
+ SPAM_DETECTION {
+ bigint id PK
+ bigint comment_id FK
+ varchar result
+ float confidence
+ text reason
+ text keywords
+ datetime detected_at
+ varchar detection_code
+ }
+
+ LEARNED_KEYWORDS ||--o{ SPAM_DETECTION : learns_from
+ LEARNED_KEYWORDS {
+ bigint id PK
+ varchar keyword
+ int weight
+ varchar category
+ datetime created_at
+ datetime updated_at
+ }
+[/mermaid]
+
+## 系统状态机
+
+[mermaid theme="default" width="70%"]
+stateDiagram-v2
+ [*] --> Submitted: 用户提交
+
+ Submitted --> Pending: 需要检测
+ Submitted --> Approved: 跳过检测
+
+ Pending --> Detecting: 开始检测
+ Detecting --> Analyzed: 检测完成
+
+ Analyzed --> Spam: 高置信度垃圾
+ Analyzed --> Suspicious: 中等置信度
+ Analyzed --> Clean: 低置信度/正常
+
+ Spam --> Trash: 自动处理
+ Spam --> Hold: 保持待审核
+ Spam --> Marked: 仅标记
+
+ Suspicious --> ManualReview: 等待人工审核
+ Clean --> Approved: 自动通过
+
+ ManualReview --> Approved: 管理员批准
+ ManualReview --> Trash: 管理员拒绝
+
+ Hold --> Approved: 管理员批准
+ Hold --> Trash: 管理员拒绝
+
+ Marked --> Approved: 管理员批准
+ Marked --> Trash: 管理员拒绝
+
+ Trash --> [*]
+ Approved --> [*]
+
+ note right of Detecting
+ 调用 AI API
+ 解析返回结果
+ 计算置信度
+ end note
+
+ note right of ManualReview
+ 显示在后台
+ 等待管理员操作
+ end note
+[/mermaid]
+
+## 性能优化策略
+
+[mermaid theme="default" width="95%"]
+flowchart TD
+ subgraph Input[输入优化]
+ I1[关键字预过滤]
+ I2[白名单用户]
+ I3[智能抽样]
+ end
+
+ subgraph Process[处理优化]
+ P1[异步检测]
+ P2[批量处理]
+ P3[缓存结果]
+ end
+
+ subgraph API[API 优化]
+ A1[Prompt 优化]
+ A2[Token 控制]
+ A3[超时处理]
+ end
+
+ subgraph Storage[存储优化]
+ S1[索引优化]
+ S2[定期清理]
+ S3[归档历史]
+ end
+
+ Input --> Process
+ Process --> API
+ API --> Storage
+
+ style Input fill:#e8f5e9
+ style Process fill:#e3f2fd
+ style API fill:#fff3e0
+ style Storage fill:#f3e5f5
+[/mermaid]
+
+## 配置建议矩阵
+
+[mermaid theme="default" width="100%"]
+graph TB
+ subgraph Small[小型博客 < 100评论/天]
+ S1[检测模式: keyword]
+ S2[Prompt: 标准模式]
+ S3[置信度阈值: > 0.9]
+ S4[自动处理: trash]
+ end
+
+ subgraph Medium[中型博客 100-500评论/天]
+ M1[检测模式: sample 30%]
+ M2[Prompt: 标准模式]
+ M3[置信度阈值: > 0.85]
+ M4[自动处理: hold]
+ end
+
+ subgraph Large[大型博客 > 500评论/天]
+ L1[检测模式: sample 40%]
+ L2[Prompt: 极简模式]
+ L3[置信度阈值: > 0.8]
+ L4[自动处理: mark]
+ L5[定期批量扫描]
+ end
+
+ style Small fill:#c8e6c9
+ style Medium fill:#fff9c4
+ style Large fill:#ffccbc
+[/mermaid]
+
+## 错误处理流程
+
+[mermaid theme="default" width="85%"]
+flowchart TD
+ Start([检测开始]) --> CallAPI[调用 AI API]
+
+ CallAPI --> CheckResponse{响应状态?}
+
+ CheckResponse -->|成功| ParseJSON[解析 JSON]
+ CheckResponse -->|超时| Timeout[超时处理]
+ CheckResponse -->|错误| APIError[API 错误]
+
+ ParseJSON --> ValidateData{数据有效?}
+ ValidateData -->|是| ProcessResult[处理结果]
+ ValidateData -->|否| DataError[数据错误]
+
+ Timeout --> RetryCheck{重试次数?}
+ RetryCheck -->|< 3| Retry[重试请求]
+ RetryCheck -->|>= 3| FallbackPending[降级:待审核]
+
+ Retry --> CallAPI
+
+ APIError --> LogError[记录错误日志]
+ DataError --> LogError
+
+ LogError --> NotifyAdmin[通知管理员]
+ NotifyAdmin --> FallbackPending
+
+ ProcessResult --> SaveResult[保存结果]
+ FallbackPending --> SaveResult
+
+ SaveResult --> End([结束])
+
+ style Timeout fill:#ffccbc
+ style APIError fill:#ffccbc
+ style DataError fill:#ffccbc
+ style FallbackPending fill:#fff9c4
+ style ProcessResult fill:#c8e6c9
+[/mermaid]
+
+## 总结
+
+通过以上流程图,我们可以清晰地看到:
+
+1. **主流程**:从用户提交到最终处理的完整流程
+2. **检测模式**:四种模式的特点和适用场景
+3. **时序交互**:各组件之间的交互顺序
+4. **数据结构**:数据库表关系和字段定义
+5. **状态机**:评论的各种状态转换
+6. **性能优化**:多层次的优化策略
+7. **配置建议**:不同规模博客的推荐配置
+8. **错误处理**:完善的异常处理机制
+
+这个系统设计充分考虑了:
+- ✅ 准确性:多级置信度判断
+- ✅ 性能:异步处理、智能抽样
+- ✅ 成本:灵活的检测模式
+- ✅ 可靠性:完善的错误处理
+- ✅ 可维护性:清晰的架构设计
diff --git a/tests/test-single-element-container.html b/tests/test-single-element-container.html
new file mode 100644
index 0000000..2688407
--- /dev/null
+++ b/tests/test-single-element-container.html
@@ -0,0 +1,197 @@
+
+
+
+
+
+ 单元素容器语法测试
+
+
+
+ 单元素容器语法测试
+ 测试 WP-Markdown 将整个容器语法放在一个 <p> 元素中的情况
+
+
+
+ 测试 1: 简单流程图(单元素,带全角箭头)
+ ::: mermaid
flowchart TD
Start([开始]) –> Process[处理]
Process –> End([结束])
:::
+
+
+
+
+
+ 测试 2: 带样式定义(单元素)
+ ::: mermaid
flowchart LR
A[开始] –> B[处理]
B –> C[结束]
style A fill:#e1f5e1,stroke:#2e7d32
style C fill:#ffe1e1,stroke:#c62828
:::
+
+
+
+
+
+ 测试 3: 复杂流程图(单元素,多个节点)
+ ::: mermaid
flowchart TD
Start([用户提交评论]) –> PreProcess[预处理]
PreProcess –> CheckEnabled{启用 AI 检测?}
CheckEnabled –>|否| SaveComment[保存评论]
CheckEnabled –>|是| CheckMode{检测模式?}
CheckMode –>|manual| SaveComment
CheckMode –>|keyword/sample/all| AICheck[AI 检测]
AICheck –> CheckResult{检测结果?}
CheckResult –>|垃圾评论| Trash[移入回收站]
CheckResult –>|正常评论| SaveComment
style Start fill:#e1f5e1,stroke:#2e7d32
style Trash fill:#ff6b6b,stroke:#c62828
:::
+
+
+
+
+
+
+