Fixed a bug in graph->dot: edge-labeler argument was not being used properly
[cl-graph.git] / dev / graphviz / graphviz-support.lisp
index f1f7e09..a974d64 100644 (file)
@@ -4,10 +4,6 @@
 
 $Id: graphviz-support.lisp,v 1.7 2005/06/21 20:51:51 moody Exp $
 
-Copyright 1992 - 2005 Experimental Knowledge Systems Lab, 
-University of Massachusetts Amherst MA, 01003-4610
-Professor Paul Cohen, Director
-
 Author: Gary King, Levente Mészáros, Attila Lendvai
 
 DISCUSSION
@@ -15,12 +11,7 @@ DISCUSSION
 This file contains the stuff that does not depend on cl-graphviz.
 
 |#
-(in-package metabang.graph)
-
-(export '(
-         print-dot-key-value
-         *dot-graph-attributes*
-         ))
+(in-package #:metabang.graph)
 
 ;;; ---------------------------------------------------------------------------
 ;
@@ -70,7 +61,7 @@ This file contains the stuff that does not depend on cl-graphviz.
              (princ " [" stream)
              (when (and directed? directed-edge-tag)
                (princ directed-edge-tag stream))
-             (when edge-key
+             (when edge-labeler
                (princ "label=\"" stream)
                (funcall edge-labeler e stream)
                (princ "\"," stream))
@@ -92,9 +83,11 @@ This file contains the stuff that does not depend on cl-graphviz.
         (iterate-vertexes 
          g
          (lambda (v)
+          ;(spy v)
            (iterate-edges
             v
             (lambda (e)
+             ;(spy e (undirected-edge-p e) (item-at-1 edges e))
               (when (and (undirected-edge-p e)
                          (not (item-at-1 edges e)))
                 (setf (item-at-1 edges e) t)
@@ -278,10 +271,12 @@ B--D []
              :doublecircle))
     (:fontsize integer)
     (:fontname text)
+    (:fontcolor text)
     (:color text)
     (:fillcolor text)
     (:style (:filled :solid :dashed :dotted :bold :invis))
-    (:layer text)))
+    (:layer text)
+    (:url text)))
 
 (defparameter *dot-edge-attributes*
   '((:pos spline)
@@ -320,7 +315,11 @@ B--D []
   (:export-p t))
 
 (defclass* dot-graph-mixin (dot-attributes-mixin) ()
-  (:export-p t))
+  (:export-p t)
+  (:default-initargs
+    :vertex-class 'dot-vertex
+    :directed-edge-class 'dot-directed-edge
+    :undirected-edge-class 'dot-edge))
 (defclass* dot-vertex-mixin (dot-attributes-mixin) ()
   (:export-p t))
 (defclass* dot-edge-mixin (dot-attributes-mixin) ()
@@ -328,10 +327,6 @@ B--D []
 
 (defclass* dot-graph (dot-graph-mixin graph-container)
   ()
-  (:default-initargs
-    :vertex-class 'dot-vertex
-    :directed-edge-class 'dot-directed-edge
-    :undirected-edge-class 'dot-edge)
   (:export-p t))
 
 (defclass* dot-vertex (dot-vertex-mixin graph-container-vertex) ()
@@ -343,6 +338,7 @@ B--D []
 
 
 (defmethod (setf dot-attribute-value) :before (value (attr symbol) (thing dot-attributes-mixin))
+  (declare (ignore value))
   (ensure-valid-dot-attribute attr thing))
 
 (defmethod (setf dot-attribute-value) (value (attr symbol) (thing dot-attributes-mixin))
@@ -354,8 +350,7 @@ B--D []
 (defmethod graph->dot-properties ((graph dot-graph-mixin) (stream t))
   (loop for (name value) on (dot-attributes graph) by #'cddr
         do
-        (print-dot-key-value name value *dot-graph-attributes* stream)
-        (format stream "                 ;~%")))
+        (print-dot-key-value name value *dot-graph-attributes* stream)))
 
 (defmethod vertex->dot ((vertex dot-vertex-mixin) (stream t))
   (format-dot-attributes vertex *dot-vertex-attributes* stream))
@@ -385,7 +380,8 @@ B--D []
   (destructuring-bind (key value-type)
       (or (assoc key dot-attributes)
           (error "Invalid attribute ~S" key))
-    (format stream "~a=~a" (string-downcase key)
+    (write-name-for-dot key stream)
+    (format stream "=~a" 
             (etypecase value-type
               ((member coordinate)
                (with-output-to-string (str)
@@ -442,6 +438,12 @@ B--D []
                    (string-downcase value)
                    value))))))
 
+(defmethod write-name-for-dot (attribute stream)
+  (format stream "~(~A~)" attribute))
+
+(defmethod write-name-for-dot ((attribute (eql :url)) stream)
+  (format stream "URL"))
+
 (defun textify (object)
   (let ((string (princ-to-string object)))
     (with-output-to-string (stream)