|
|
3 maanden geleden | |
|---|---|---|
| .idea | 3 maanden geleden | |
| cmd | 3 maanden geleden | |
| pkg | 3 maanden geleden | |
| testdata | 3 maanden geleden | |
| tests | 3 maanden geleden | |
| ANALYSIS.md | 3 maanden geleden | |
| IMPLEMENTATION_SUMMARY.md | 3 maanden geleden | |
| README.md | 3 maanden geleden | |
| go.mod | 3 maanden geleden | |
| go.sum | 3 maanden geleden |
一个基于 mermaid.js 架构的 Go 语言 Mermaid 图表解析器和生成器。
由 gytmtc 创建,基于 mermaid.js 的架构设计。
该实现严格遵循 mermaid.js 的设计模式:
# 克隆项目
git clone <repository-url>
cd mermaid-go
# 运行演示
go run demo.go
# 运行测试
go test ./tests/
# 构建 CLI 工具
go build -o mmdc cmd/mermaid-cli/main.go
package main
import (
"fmt"
"log"
"mermaid-go/pkg/ast"
"mermaid-go/pkg/lexer"
"mermaid-go/pkg/parser"
"mermaid-go/pkg/renderer"
)
func main() {
input := `graph TD
A[圣诞节] -->|获得金钱| B(去购物)
B --> C{让我想想}
C -.->|一| D[笔记本电脑]
C -.->|二| E[iPhone]
C -.->|三| F[汽车]`
// 解析 Mermaid 语法
parser := parser.NewParser()
diagram, err := parser.Parse(input)
if err != nil {
log.Fatal(err)
}
// 验证图表
if err := diagram.Validate(); err != nil {
log.Fatal(err)
}
// 渲染回 Mermaid 语法
renderer := renderer.NewFlowchartRenderer()
output := renderer.Render(diagram)
fmt.Println(output)
}
// 创建词法分析器
lexer := lexer.NewLexer("graph TD\nA --> B")
tokens, err := lexer.Tokenize()
if err != nil {
log.Fatal(err)
}
// 过滤空白和注释
filtered := lexer.FilterTokens(tokens)
for _, token := range filtered {
fmt.Printf("%s: %s\n", token.Type, token.Value)
}
// 创建新的流程图
flowchart := ast.NewFlowchart()
flowchart.Direction = "TD"
// 添加顶点
vertexA := &ast.FlowVertex{
ID: "A",
Text: StringPtr("开始"),
Type: &ast.VertexTypeRect,
}
flowchart.Vertices["A"] = vertexA
vertexB := &ast.FlowVertex{
ID: "B",
Text: StringPtr("结束"),
Type: &ast.VertexTypeCircle,
}
flowchart.Vertices["B"] = vertexB
// 添加边
edge := &ast.FlowEdge{
Start: "A",
End: "B",
Text: "流程",
Type: StringPtr("arrow_point"),
Stroke: &ast.StrokeNormal,
}
flowchart.Edges = append(flowchart.Edges, edge)
// 渲染
renderer := renderer.NewFlowchartRenderer()
output := renderer.Render(flowchart)
fmt.Println(output)
# 从文件解析并输出
./mmdc -i input.mmd -o output.mmd
# 从标准输入读取
echo "graph TD\nA --> B" | ./mmdc -i - -o -
# 指定输出格式
./mmdc -i input.mmd -o output.mmd -f mermaid
graph TD
A[矩形] --> B(圆角矩形)
B --> C{菱形}
C --> D((圆形))
D --> E([体育场形])
E --> F[[子程序]]
F --> G[("圆柱形")]
G --> H{{六边形}}
graph TD
A --> B %% 实线箭头
B -.-> C %% 虚线箭头
C ==> D %% 粗线箭头
D --x E %% 交叉箭头
E --o F %% 圆圈箭头
F --- G %% 开放箭头
graph TD
A -->|标签文本| B
B -->|"带引号的标签"| C
项目包含完整的测试套件:
# 运行所有测试
go test ./tests/
# 运行词法分析器测试
go test ./tests/ -run TestLexer
# 运行解析器测试
go test ./tests/ -run TestParser
# 运行集成测试
go test ./tests/ -run TestMermaid
该项目的设计严格遵循 mermaid.js 的内部架构:
pkg/ast/ 中定义新的 AST 节点类型pkg/lexer/ 中添加新的标记类型pkg/parser/ 中实现解析逻辑pkg/renderer/ 中实现渲染逻辑go fmt 格式化代码| mermaid.js | mermaid-go |
|---|---|
flow.jison |
pkg/lexer/lexer.go + pkg/parser/flowchart.go |
flowDb.ts |
pkg/parser/flowchart.go (FlowDB) |
types.ts |
pkg/ast/flowchart.go |
flowRenderer.ts |
pkg/renderer/flowchart.go |
MIT License - 详见 LICENSE 文件
欢迎提交 Issue 和 Pull Request!