anchor.diff:    static const NORMAL = const ArrowShape('normal');
     static const TEE = const ArrowShape('tee');
     static const VEE = const ArrowShape('vee');
  +
  +  static const OBOX = const ArrowShape('obox');
  +  static const ODIAMOND = const ArrowShape('odiamond');
  +  static const ODOT = const ArrowShape('odot');
  +  static const OINV = const ArrowShape('oinv');
  +  static const ONORMAL = const ArrowShape('onormal');
  +}
  +
  +class NodeAttr {
  +  String label;
  +  Font fontname;
  +  int fontsize;
  +  NodeStyle style;
  +  Color fillcolor;
  +  Shape shape;
  +  num width, height;
  +
  +  Map<String, String> toMap() {
  +    final m = <String, String>{};
  +    if (label != null) {
  +      m['label'] = label;
  +    }
  +    if (fontname != null) {
  +      m['fontname'] = fontname.toString();
  +    }
  +    if (fontsize != null) {
  +      m['fontsize'] = fontsize.toString();
  +    }
  +    if (style != null) {
  +      m['style'] = style.toString();
  +    }
  +    if (fillcolor != null) {
  +      m['fillcolor'] = fillcolor.toString();
  +    }
  +    if (shape != null) {
  +      m['shape'] = shape.toString();
  +    }
  +    if (width != null) {
  +      m['width'] = width.toString();
  +    }
  +    if (height != null) {
  +      m['height'] = height.toString();
  +    }
  +    return m;
  +  }
   }
   
   class EdgeAttr {
  
positive.code:   const Font(this._name);
    String toString() => _name;
  
    static const TIMES_ROMAN = const Font('Times-Roman');
    static const HELVETICA = const Font('Helvectica');
    static const COURIER = const Font('Courier');
  }
  
  class Color {
  
negative.code:   static const STRIPED = const ClusterStyle._('striped');
  }
  
  class Dir {
    final String _name;
    const Dir._(this._name);
  