You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否对Markdown+Mermaid.js生成的图表进行程序化结构查询?

Mermaid图表的程序化查询与验证方案

可以通过程序化方式查询Markdown中嵌入的Mermaid图表结构,验证特定子对象或文本是否存在,核心是先处理Mermaid的文本源码,再通过解析或匹配完成校验,以下是几种实用方法:

1. 直接文本匹配(适合简单场景)

Mermaid图表基于纯文本语法编写,对于只需要检查特定文本是否存在的场景,直接用字符串包含判断或正则表达式即可:

  • 比如要验证流程图里是否有标签为「Start」的节点,直接在Mermaid源码字符串中查找[Start]
  • 示例(JavaScript):
    const mermaidCode = 'graph TD; A[Start] --> B[Process];';
    const hasTarget = mermaidCode.includes('[Start]');
    console.log(hasTarget); // 输出true
    
  • 优势:实现简单,无需额外依赖;缺点:无法处理复杂结构的精确校验(比如同名节点在不同子图的情况)

2. 基于Mermaid官方解析库(精准校验复杂结构)

Mermaid提供了官方解析工具,能将源码转换成抽象语法树(AST),遍历AST可精准验证目标元素:

  • 依赖包:@mermaid-js/mermaid-parser(npm包)
  • 实现步骤:
    1. 安装依赖:npm install @mermaid-js/mermaid-parser
    2. 解析源码为AST并校验:
      import { parse } from '@mermaid-js/mermaid-parser';
      
      const mermaidCode = `graph TD
          subgraph Sub1
              A[Start] --> B[Process]
          end
          subgraph Sub2
              C[End]
          end`;
      const ast = parse(mermaidCode);
      // 检查子图Sub1中是否存在标签为Start的节点
      const hasTargetNode = ast.diagram.subgraphs
        .find(sub => sub.id === 'Sub1')
        ?.nodes.some(node => node.label === 'Start');
      console.log(hasTargetNode); // 输出true
      
  • 优势:能处理嵌套子图、分支流程等复杂结构,校验结果精准

3. 从Markdown中提取Mermaid后再校验

如果Mermaid是嵌入在Markdown文档中的,需要先提取出Mermaid代码块,再进行后续校验:

  • 依赖包:Markdown解析库(如marked)+ Mermaid解析库
  • 实现步骤:
    1. 解析Markdown文本,提取语言为mermaid的代码块
    2. 对提取的Mermaid代码用上述方法校验
  • 示例代码:
    import { marked } from 'marked';
    import { parse } from '@mermaid-js/mermaid-parser';
    
    const markdownContent = `# 业务流程图
    \`\`\`mermaid
    graph TD; A[用户登录] --> B[权限校验];
    \`\`\``;
    // 提取Mermaid代码
    let targetMermaidCode = '';
    marked.parse(markdownContent, {
      walkTokens: token => {
        if (token.type === 'code' && token.lang === 'mermaid') {
          targetMermaidCode = token.text;
        }
      }
    });
    // 校验是否存在「权限校验」节点
    const ast = parse(targetMermaidCode);
    const hasAuthNode = ast.diagram.nodes.some(node => node.label === '权限校验');
    console.log(hasAuthNode); // 输出true
    

内容的提问来源于stack exchange,提问作者Julian A.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:20:36