kevinswiber/mmdflux

GitHub: kevinswiber/mmdflux

一个用 Rust 实现的 Mermaid 图表渲染工具,输出终端文本、SVG 与结构化 MMDS JSON,面向自动化与工具链集成。

Stars: 45 | Forks: 2

# mmdflux [![Crates.io](https://img.shields.io/crates/v/mmdflux)](https://crates.io/crates/mmdflux) [![docs.rs](https://img.shields.io/docsrs/mmdflux)](https://docs.rs/mmdflux) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/7b7adc1856232655.svg)](https://github.com/kevinswiber/mmdflux/actions/workflows/ci.yml) 将 Mermaid 图表渲染为终端文本、SVG 和结构化 JSON。 mmdflux 是一个用 Rust 构建的图表渲染工具包。它以 CLI、Rust 库和 WebAssembly 包的形式发布——所有这些都来自同一个代码库。 它包含自己的图形布局引擎(具有本地正交路由)、用于终端输出的字符网格渲染器,以及 [MMDS](docs/mmds.md) —— 一种为工具、适配器和 LLM/代理流水线设计的结构化 JSON 格式。 [Playground](https://play.mmdflux.com) · [Releases](https://github.com/kevinswiber/mmdflux/releases) · [Gallery](docs/gallery.md) · [MMDS Spec](docs/mmds.md) ## 一瞥 一个 Mermaid 源文件,多个输出:终端文本、SVG 和机器可读的 JSON。 **Mermaid 源文件** ([`docs/assets/readme/at-a-glance.mmd`](docs/assets/readme/at-a-glance.mmd)) ``` graph TD subgraph sg1[Horizontal Section] direction LR A[Step 1] --> B[Step 2] --> C[Step 3] end Start --> A C --> End ``` **SVG 输出** (`mmdflux --format svg --layout-engine flux-layered --curve linear-rounded ...`) mmdflux at-a-glance SVG output **文本输出** (`mmdflux --format text ...`) ``` ┌───────┐ │ Start │ └───────┘ │ ┌───┘ │ │ │ │ │ ┌───────┼ Horizontal Section ────────┐ │ ▼ │ │ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ Step 1 │─►│ Step 2 │─►│ Step 3 │ │ │ └────────┘ └────────┘ └────────┘ │ │ ┌────┘ │ └─────────────────────┼──────────────┘ │ │ │ │ ┌──────┘ │ ▼ ┌─────┐ │ End │ └─────┘ ``` **MMDS JSON 输出**: [`docs/assets/readme/at-a-glance.mmds.json`](docs/assets/readme/at-a-glance.mmds.json) ## 为何选择 mmdflux **无运行时依赖。** 一个单独编译的二进制文件。不需要 Node.js、无需无头浏览器、无需 Puppeteer。 **终端文本是首等输出。** 文本渲染不是次要模式——它拥有自己的网格布局系统、正交边路由,以及专为终端可读性设计的 Unicode 框线字符。 **原生正交路由。** `flux-layered` 引擎将布局和路由视为一个统一的求解契约。边遵循直角路径,具有确定性的扇入/扇出策略和形状感知的附着点——解决了 Mermaid 渲染中最常见的抱怨之一。 **面向工具与代理的结构化 JSON。** MMDS(Machine-Mediated Diagram Specification)输出定位后的图形数据——节点坐标、路由边路径、子图边界——以便下游工具无需解析 SVG 或抓取像素即可消费图形几何信息。 **复合图形布局。** 子图作为单一复合图形的一部分进行布局,而不是递归渲染。这能产生全局优化的定位和一致的跨边界边路由。 **支持多种图形引擎。** 默认的 `flux-layered` 引擎处理流程图/类图/状态图的文本、SVG 和 MMDS 输出。可切换到 `mermaid-layered` 以获得与 Mermaid 兼容的图形输出。 ## 生态系统 | 包 | 描述 | | --- | --- | | [`mmdflux`](https://crates.io/crates/mmdflux) | CLI 和 Rust 库(crates.io) | | [`@mmds/wasm`](https://www.npmjs.com/package/@mmds/wasm) | WebAssembly 绑定(npm) | | [`@mmds/core`](https://www.npmjs.com/package/@mmds/core) | MMDS 规范化、遍历和验证工具(npm) | | [`@mmds/excalidraw`](https://www.npmjs.com/package/@mmds/excalidraw) | MMDS 转 Excalidraw `.excalidraw` JSON(npm) | | [`@mmds/tldraw`](https://www.npmjs.com/package/@mmds/tldraw) | MMDS 转 tldraw `.tldr` JSON(npm) | | [Playground](https://play.mmdflux.com) | 交互式浏览器编辑器(由 WASM 驱动) | ## 安装 ### Homebrew(推荐) ``` brew tap kevinswiber/mmdflux brew install mmdflux ``` ### Cargo ``` cargo install mmdflux ``` ### 预编译二进制文件 从 [GitHub Releases](https://github.com/kevinswiber/mmdflux/releases) 下载平台二进制文件。 ## 快速开始 ``` # 将 Mermaid 文件渲染为文本(默认格式) mmdflux diagram.mmd # 从标准输入读取 Mermaid printf 'graph LR\nA-->B\n' | mmdflux # 禁用文本/ASCII 输出的 ANSI 颜色 NO_COLOR=1 mmdflux --format text diagram.mmd # 覆盖单次调用的 NO_COLOR NO_COLOR=1 mmdflux --format text --color always diagram.mmd # SVG 输出 mmdflux --format svg diagram.mmd -o diagram.svg # 带命名主题的 SVG 输出 mmdflux --format svg --svg-theme dark diagram.mmd -o diagram.svg # 带终端感知浅色/深色主题选择的 SVG 输出 mmdflux --format svg --svg-theme-auto diagram.mmd -o diagram.svg # 使用 CSS 变量和十六进制备用方案的面向浏览器的 SVG mmdflux --format svg --svg-theme dark --svg-theme-mode dynamic diagram.mmd -o diagram.svg # 带路由几何细节的 MMDS JSON 输出 mmdflux --format mmds --geometry-level routed diagram.mmd # 校验模式(验证输入并打印诊断信息) mmdflux --lint diagram.mmd ``` 启用 ANSI 后,文本/ASCII 输出会将 Mermaid 样式映射到终端颜色(当存在明确对应时):节点 `style`/`classDef` 的 `fill`、`stroke` 和 `color` 控制节点背景、边框和标签颜色;流程图的 `linkStyle ... stroke:` 控制边和箭头的前景色;SVG 专属属性(如 `stroke-width` 和 `stroke-dasharray`)在文本/ASCII 输出中作为无操作保留。 更多示例请参见以下章节。 ## 支持的功能 - **图表类型:** 流程图、类图、时序图、状态图 - **输出格式:** Unicode 文本、ASCII 文本、SVG、MMDS JSON - **布局方向:** `TD`、`BT`、`LR`、`RL`(支持每个子图覆盖) - **边样式:** 实线、虚线、加粗线、不可见线、十字箭头、圆形箭头 - **路由:** 正交、多折线、直接(支持曲线选项:basis、linear、linear-rounded、linear-sharp) - **往返转换:** Mermaid 与 MMDS 之间互相转换 ## 图形引擎家族 | | `flux-layered` | `mermaid-layered` | | --- | --- | --- | | 适用范围 | 流程图/类图/状态图文本、SVG、MMDS | 流程图/类图 SVG、MMDS | | 路由 | 正交、多折线、直接 | 多折线 | | 子图 | 复合图形(全局布局) | 复合图形 | | 适用场景 | 确定性路由输出 | 与 Mermaid 兼容的输出 | 时序图使用单独的时间线渲染器,支持文本/ASCII、SVG 和 MMDS 输出,且不接受 `--layout-engine` 参数。 ### SVG 边预设 | 预设 | 路由 | 曲线 | | --- | --- | --- | | `smooth-step`(默认) | 正交 | 圆角弧线 | | `curved-step` | 正交 | Basis 样条 | | `step` | 正交 | 锐角拐点 | | `polyline` | 多折线 | 锐角拐点 | | `straight` | 直接 | 锐角拐点 | ``` # 正交拐角平滑(默认) mmdflux --format svg diagram.mmd -o diagram.svg # 正交基路径曲线 mmdflux --format svg --edge-preset curved-step diagram.mmd -o diagram.svg # 显式曲线控制 mmdflux --format svg --curve linear-rounded diagram.mmd -o diagram.svg ``` ## SVG 主题 SVG 主题是可选用的,仅影响 SVG 输出。 - **显式配置优先。** CLI 标志和 `RenderConfig.svg_theme` 优先于 Mermaid 源文件提示。 - **自动主题是显式的。** `--svg-theme-auto` 在渲染前解析为具体命名主题,因此启用自动主题时 Mermaid 源文件提示会被抑制。 - **支持 Mermaid 提示。** YAML 前言中的 `config.theme` 和 `%%{init: {"theme": "..."}}%%` 都会在未提供显式 SVG 主题时选择一个命名 SVG 主题。 - **无主题输出仍可用。** 如果没有显式主题或 Mermaid 提示,SVG 渲染将保留现有的无主题调色板。 - **静态模式是默认值。** 静态模式输出具体的十六进制颜色,以获得最大栅格器兼容性。 - **动态模式是附加的。** `--svg-theme-mode dynamic` 输出相同的十六进制回退值,并附加根 CSS 变量和 `