@@ -6,7 +6,8 @@ open System.IO
66
77
88type SceneNode =
9- { Name: string }
9+ { Name: string
10+ FileName: string }
1011
1112
1213type 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