in src/core/distributor.js [68:132]
overlap: function(nodes){
var layers = [];
var maxWidth = distributor.maxWidthPerLayer();
var puntedNodes = nodes.concat();
var puntedWidth = distributor.computeRequiredWidth(puntedNodes);
while(puntedWidth > maxWidth){
distributor.countIdealOverlaps(puntedNodes);
var nodesInCurrentLayer = puntedNodes.concat();
var currentlayerWidth = puntedWidth;
puntedNodes = [];
while(nodesInCurrentLayer.length > 2 && currentlayerWidth > maxWidth){
// Sort by overlaps
nodesInCurrentLayer.sort(function(a,b){
return b.overlapCount - a.overlapCount;
});
// Remove the node with most overlap
var first = nodesInCurrentLayer.shift();
// Update width
currentlayerWidth -= first.width;
currentlayerWidth += options.stubWidth;
// Update overlap count for the remaining nodes
first.overlaps.forEach(function(node){
node.overlapCount--;
});
// Add removed node to the next layer
puntedNodes.push(first);
}
layers.push(nodesInCurrentLayer);
puntedWidth = distributor.computeRequiredWidth(puntedNodes);
}
if(puntedNodes.length>0){
layers.push(puntedNodes);
}
// Create stubs
// From last layer
for(var i=layers.length-1; i>=1; i--){
var layer = layers[i];
// For each node in the layer
for(var k=0; k<layer.length; k++){
var node = layer[k];
// If it is not a stub
if(node.isStub()) continue;
// Create one stub for each layer above it
var stub = node;
for(var j=i-1;j>=0;j--){
stub = stub.createStub(options.stubWidth);
layers[j].push(stub);
}
}
}
return layers;
}