with Invalid_argument _ -> assert false (* t must be a coercion *)
let generate_dot_file () =
+ let module Pp = GraphvizPp.Dot in
+ let buf = Buffer.create 10240 in
+ let fmt = Format.formatter_of_buffer buf in
+ Pp.header fmt;
+ Pp.node "node" ~attrs:["fontsize", "9"; "width", ".4"; "height", ".4"] fmt;
+ Pp.node "edge" ~attrs:["fontsize", "10"] fmt;
let l = CoercDb.to_list () in
- let preamble = "
- digraph pippo {
- node [fontsize=9, width=.4, height=.4];
- edge [fontsize=10];
- \n"
- in
- let conclusion = " } \n" in
- let data = List.fold_left
- (fun acc (src,tgt,cl) ->
- List.fold_left
- (fun acc c ->
- acc ^ CoercDb.name_of_carr src ^ " -> " ^
- CoercDb.name_of_carr tgt ^ "[label=\"" ^ UriManager.name_of_uri c ^
- "\"];\n")
- acc cl)
- "" l
- in
- preamble ^ data ^ conclusion
-
+ let pp_description carr =
+ match CoercDb.uri_of_carr carr with
+ | None -> ()
+ | Some uri ->
+ Pp.node (CoercDb.name_of_carr carr)
+ ~attrs:["href", UriManager.string_of_uri uri] fmt in
+ List.iter
+ (fun (src, tgt, cl) ->
+ let src_name = CoercDb.name_of_carr src in
+ let tgt_name = CoercDb.name_of_carr tgt in
+ pp_description src;
+ pp_description tgt;
+ List.iter
+ (fun c ->
+ Pp.edge src_name tgt_name
+ ~attrs:[ "label", UriManager.name_of_uri c;
+ "href", UriManager.string_of_uri c ]
+ fmt)
+ cl)
+ l;
+ Pp.trailer fmt;
+ Buffer.contents buf
+
(* EOF *)