S-Dot: A Common Lisp Interface to Graphviz Dot

What is S-Dot?

S-Dot is an S-Expression syntax for the input language of the 'Dot' graph drawing tool from the AT&T GraphViz suite. With S-Dot, you can render 'Dot' graphs from within Common Lisp.

S-Dot is the little sister of DotML.

Sponsored links:

Example 1/1:
Source code:
'
(graph ((rankdir "LR"))
 
(node ((id "a") (label "node1") (fontsize "9") (fontname "Arial")))
(node ((id "b") (label "node2") (fontsize "9") (fontname "Arial")))
(node ((id "c") (label "node3") (fontsize "9") (fontname "Arial")))
(node ((id "d") (label "node4") (fontsize "9") (fontname "Arial")))
(edge ((from "a") (to "b") (fontname "Arial") (fontsize "9") (label "edge1")))
(edge ((from "a") (to "c") (fontname "Arial") (fontsize "9") (label "edge2")))
(edge ((from "b") (to "c") (fontname "Arial") (fontsize "9") (label "edge3")))
(edge ((from "b") (to "d") (fontname "Arial") (fontsize "9") (label "edge4")))
(edge ((from "c") (to "d") (fontname "Arial") (fontsize "9") (label "edge5"))))
How do I use it?

First, you have to type or generate an s-expression such as the one above. The file s-dot.lisp contains the simple syntax checking function (check-syntax):

(check-syntax '(graph ((label "foo"))
        (node ((id "bar") (baz "123")))
        (edge ((from "bar") (to "bar")))))

... raises this error:

attribute BAZ is not allowed in NODE elements, 
        context: (NODE ((ID bar) (BAZ 123)))
        [Condition of type SIMPLE-ERROR]

The function (s-dot->dot <stream> <graph ...) (also in s-dot.lisp) generates the dot code:

(s-dot->dot t '(graph ((label "foo"))
        (node ((id "bar"))) (edge ((from "bar") (to "bar")))))

... results in this (shortened) output:

digraph g {compound="true";label="foo";
        node[label="bar"]{bar}; edge bar->bar;}

s-dot.lisp also contains an example how to invoke the dot tool on the generated code:

(defun render-s-dot (file-name format graph &key (check-syntax t))
  (let ((dot-file-name 
         (make-pathname :directory (pathname-directory file-name)
                        :name (pathname-name file-name) 
                        :type "dot")))
    (with-open-file (stream dot-file-name :direction :output 
                            :if-exists :supersede
                            :if-does-not-exist :create)
        (s-dot->dot stream graph :check-syntax check-syntax))
        (asdf:run-shell-command 
          (format nil "dot -o ~a -T~a ~a" 
                  file-name format dot-file-name)))
      

However, this is only an example. Note that it is faster to directly pipe the data to the 'dot' tool.

Where do I get it?

S-DOT can be downloaded from http://martin-loetzsch.de/S-DOT/s-dot.tar.gz. The current version is 1.1.

It can be also installed via ASDF-Install:

(asdf-install:install 's-dot)

After successful installation, S-DOT can be loaded with

(asdf:operate 'asdf:load-op :s-dot)
Is it free?

Yes it is. You can do whatever you want with it as long as you mention that you use it. See the licence for details.

Can I make donations?

Yes. If you find this stuff helpful, please consider a donation:

Alternatively, there are also sponsored links on this page.

Sponsored links

 Copyright 2006-2010 by Martin Loetzsch (http://martin-loetzsch.de), all rights reserved. See the S-Dot licence for details.