anchor.diff:    return copy;
   }
   
  -calculateDimensions(group, value) {
  +calculateDimensions(Element group, Map value) {
     var bbox = group.getBBox();
  -  value.width = bbox.width;
  -  value.height = bbox.height;
  +  value['width'] = bbox.width;
  +  value['height'] = bbox.height;
   }
   
   BaseGraph runLayout(BaseGraph graph, Layout layout) {
  
positive.code: 
        if (node.containsKey('href')) {
          root
            .attr('class', root.nodeAttr('class') + ' clickable')
            .on('click', () {
              window.open(node['href']);
            });
        }
      }
    }
  
    addForeignObject(modifier, root) {
      var fo = root
        .append('foreignObject')
          .attr('width', '100000');
  
      var div = fo
        .append('xhtml:div')
          .style('float', 'left');
  
      modifier(div);
  
      // TODO find a better way to get dimensions for foreignObjects...
      var w, h;
      div
        .each(() {
          w = this.clientWidth;
          h = this.clientHeight;
        });
  
      fo
  
negative.code:   }
  
    addForeignObjectLabel(String label, d3.Selection root) {
      addForeignObject((d3.Selection e) {
        e.htmlFunc((n, d, i, j) { return label; });
      }, root);
    }
  
    addForeignObjectElementFunction(Function elemFunc, d3.Selection root) {
      addForeignObject((d3.Selection e) {
        e.insert(elemFunc);
      }, root);
    }
  
    addForeignObjectElement(Map elem, d3.Selection root) {
      addForeignObjectElementFunction(() {
        return elem;
      }, root);
    }
  
    d3.Selection addTextLabel(String label, d3.Selection root, num labelCols, bool labelCut) {
      if (labelCut == null) {
        labelCut = 'false';
      }
      labelCut = (labelCut.toString().toLowerCase() == 'true');
  
      final node = root
        .append('text')
        ..attr('text-anchor', 'left');
  
      label = label.replaceAll(r"\\n"/*g*/, '\n');
  
      var arr = labelCols != null ? wordwrap(label, labelCols, labelCut) : label;
      arr = arr.split('\n');
      for (var i = 0; i < arr.length; i++) {
        node
          .append('tspan')
            ..attr('dy', '1em')
            ..attr('x', '1')
            ..text(arr[i]);
      }
  
      return node;
  