1 ! Copyright (C) 2011 Alex Vondrak.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors combinators compiler.units continuations
4 destructors images.viewer io.backend io.files.unique kernel
5 locals namespaces parser sequences summary unicode.case words
6 graphviz.ffi graphviz.builder ;
10 "dot" default-layout set-global
12 SYMBOL: default-format
13 "png" default-format set-global
15 ERROR: unsupported-format format ;
16 ERROR: unsupported-engine engine ;
18 M: unsupported-format summary
19 drop "Unsupported layout format; check supported-formats" ;
21 M: unsupported-engine summary
22 drop "Unsupported layout engine; check supported-engines" ;
26 : default-extension ( format -- extension )
29 { "canon" [ ".dot" ] }
39 { "cmapx" [ ".map" ] }
40 { "imap_np" [ ".map" ] }
41 { "cmapx_np" [ ".map" ] }
42 { "ismap" [ ".map" ] }
47 { "plain" [ ".txt" ] }
48 { "plain-ext" [ ".txt" ] }
53 { "svgz" [ ".svgz" ] }
57 { "vmlz" [ ".vmlz" ] }
58 { "vrml" [ ".vrml" ] }
59 { "wbmp" [ ".wbmp" ] }
63 : check-format ( -T -- )
64 dup supported-formats member?
65 [ drop ] [ unsupported-format ] if ; inline
67 : check-engine ( -K -- )
68 dup supported-engines member?
69 [ drop ] [ unsupported-engine ] if ; inline
71 : compute-engine ( Agraph_t* -K -- engine )
75 [ default-layout get-global ] when-empty
76 ] if* dup check-engine ;
78 :: (graphviz) ( graph -O -T -K -- -o )
80 -O -T default-extension append normalize-path :> -o
82 gvContext &gvFreeContext :> gvc
83 graph id>> graph kind agopen &agclose :> g
85 g -K compute-engine :> engine
86 gvc g engine gvLayout drop
87 [ gvc g -T -o gvRenderFilename drop -o ]
88 [ gvc g gvFreeLayout drop ] [ ] cleanup
91 : (preview) ( graph -- -o )
93 default-format get-global
98 : graphviz ( graph -O -T -K -- )
99 (graphviz) drop ; inline
101 : graphviz* ( graph -O -T -- )
104 : preview ( graph -- )
105 (preview) image. ; inline
107 : preview-window ( graph -- )
108 (preview) image-window ; inline
112 : define-graphviz-by-engine ( -K -- )
113 [ "graphviz.render" create dup make-inline ]
114 [ [ graphviz ] curry ] bi
118 : define-graphviz-by-format ( -T -- )
120 dup supported-engines member? [ "-file" append ] when
121 "graphviz.render" create dup make-inline
123 [ [ graphviz* ] curry ] bi
130 supported-engines [ define-graphviz-by-engine ] each
131 supported-formats [ define-graphviz-by-format ] each
132 ] with-compilation-unit