Skip to content

Commit f6f2692

Browse files
committed
Mermaid Diagram support
1 parent 8cb0901 commit f6f2692

File tree

2 files changed

+58
-4
lines changed

2 files changed

+58
-4
lines changed

YukimiScript.CommandLineTool/Program.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ let doAction errStringing =
126126
let diagramExporter =
127127
match diagramType with
128128
| Dgml -> Diagram.exportDgml
129-
| _ -> failwith ""
129+
| _ -> Diagram.exportMermaid
130130

131131
let lib = loadLibs errStringing options.Lib
132132
getYkmFiles inputDir

YukimiScript.Parser/Diagram.fs

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ open System.IO
66

77

88
type SceneNode =
9-
{ Name: string }
9+
{ Name: string
10+
FileName: string }
1011

1112

1213
type FileNode =
@@ -50,10 +51,10 @@ let analyze (files: (string * Dom) list) : Result<Diagram> =
5051
| Error e -> raise e
5152
| _ -> raise <| DiagramMacroErrorException debug
5253
| _ -> None)
53-
{ Name = scene.Name }, linkTo
54+
{ Name = scene.Name; FileName = fileName }, linkTo
5455
)
5556

56-
{ Name = Path.GetFileName fileName
57+
{ Name = fileName
5758
Scenes = List.map fst scenes },
5859
scenes)
5960
|> List.unzip
@@ -134,3 +135,56 @@ let exportDgml (diagram: Diagram) : string =
134135
.AppendLine(" </Categories>")
135136
.AppendLine("</DirectedGraph>")
136137
.ToString()
138+
139+
140+
let exportMermaid (diagram: Diagram) : string =
141+
let arrowInSameFile, anotherArrows =
142+
diagram.Arrows
143+
|> List.partition (fun { From = from; Target = target } ->
144+
from.FileName = target.FileName)
145+
146+
let arrowInSameFile =
147+
arrowInSameFile |> List.groupBy (fun x -> x.From.FileName)
148+
149+
let sb = System.Text.StringBuilder ()
150+
sb.AppendLine("flowchart LR") |> ignore
151+
152+
let fileIds =
153+
diagram.Files
154+
|> List.mapi (fun i x -> x.Name, $"f{i}")
155+
|> Map.ofList
156+
157+
let sceneIds =
158+
diagram.Files
159+
|> List.collect (fun x -> x.Scenes)
160+
|> List.mapi (fun i x -> x, $"n{i}")
161+
|> Map.ofList
162+
163+
let processArrows arrows =
164+
for arr in arrows do
165+
sb .Append(" ")
166+
.Append(sceneIds.[arr.From])
167+
.Append("(\"")
168+
.Append(arr.From.Name)
169+
.Append("\")")
170+
.Append("-->")
171+
.Append(sceneIds.[arr.Target])
172+
.Append("(\"")
173+
.Append(arr.Target.Name)
174+
.AppendLine("\")") |> ignore
175+
176+
for (file, arrows) in arrowInSameFile do
177+
sb .Append(" subgraph ")
178+
.Append(fileIds.[file])
179+
.Append("[\"")
180+
.Append(file)
181+
.AppendLine("\"]") |> ignore
182+
183+
processArrows arrows
184+
185+
sb .AppendLine(" end")
186+
.AppendLine() |> ignore
187+
188+
processArrows anotherArrows
189+
190+
sb.ToString ()

0 commit comments

Comments
 (0)