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
方案一、
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
评论
发表评论