PastMD配置Mermaid 图表支持

方案一、

1. 安装 mermaid-filter

npm install --global mermaid-filter

2.查找按照路径

where.exe mermaid-filter

3.配置

C:\Users\Administrator\AppData\Roaming\npm\mermaid-filter.cmd 地址


方案二、

npm install -g @mermaid-js/mermaid-cli

编写一个 Pandoc Filter 调用 mmdc

1. 创建mermaid-mmdc-filter.py文件


#!/usr/bin/env python3

"""

Pandoc filter: 将 Mermaid 代码块通过 mmdc 渲染为图片插入文档

"""


import subprocess

import os

import sys

import hashlib


from pandocfilters import toJSONFilter, Para, Image, Str


# ===== 配置区域 =====

MMDC_PATH = r"C:\Users\Administrator\AppData\Roaming\npm\mmdc.CMD"

# 输出目录使用固定路径(不要用 temp,Pandoc 可能找不到)

OUTPUT_DIR = os.path.join(os.path.expanduser("~"), "mermaid_images")

# ====================



def ensure_dir():

    if not os.path.exists(OUTPUT_DIR):

        os.makedirs(OUTPUT_DIR, exist_ok=True)



def render_mermaid(code, output_file):

    """调用 mmdc 渲染 mermaid 代码为 PNG"""

    input_file = output_file.replace(".png", ".mmd")


    with open(input_file, "w", encoding="utf-8") as f:

        f.write(code)


    result = subprocess.run(

        [MMDC_PATH, "-i", input_file, "-o", output_file],

        capture_output=True,

        text=True,

        shell=True,

        timeout=30

    )


    # 输出调试信息到 stderr(不影响 Pandoc JSON 流)

    if result.returncode != 0:

        sys.stderr.write(f"[mmdc ERROR] returncode={result.returncode}\n")

        sys.stderr.write(f"[mmdc STDOUT] {result.stdout}\n")

        sys.stderr.write(f"[mmdc STDERR] {result.stderr}\n")

        return False


    if not os.path.exists(output_file):

        sys.stderr.write(f"[mmdc ERROR] 文件未生成: {output_file}\n")

        return False


    file_size = os.path.getsize(output_file)

    sys.stderr.write(f"[mmdc OK] {output_file} ({file_size} bytes)\n")

    return True



def mermaid_filter(key, value, format, meta):

    if key == "CodeBlock":

        [[ident, classes, keyvals], code] = value


        if "mermaid" in classes:

            ensure_dir()


            # 生成唯一文件名

            filehash = hashlib.md5(code.encode("utf-8")).hexdigest()

            output_file = os.path.join(OUTPUT_DIR, filehash + ".png")


            # 绝对路径转换

            output_file = os.path.abspath(output_file)


            sys.stderr.write(f"[Filter] 检测到 mermaid 代码块, 渲染中...\n")

            sys.stderr.write(f"[Filter] 输出路径: {output_file}\n")


            success = render_mermaid(code, output_file)


            if success:

                # ★★★ 关键:使用绝对路径,并用正斜杠 ★★★

                img_path = output_file.replace("\\", "/")


                return Para([

                    Image(

                        ["", [], [["width", "100%"]]],   # attr

                        [Str("Mermaid Diagram")],         # alt text

                        [img_path, "Mermaid Diagram"]     # [src, title]

                    )

                ])

            else:

                sys.stderr.write(f"[Filter] 渲染失败,保留原始代码块\n")

                return None  # 保留原样


    return None  # 其他元素不处理



if __name__ == "__main__":

    toJSONFilter(mermaid_filter)

    

2.pip install pandocfilters


3.在 PasteMD 配置中,将这个 Python 脚本作为 Filter







评论

此博客中的热门博文

Rstudio 使用代理

ShadowsocksR Plus 就回来了~