internal string ToDot() {
var retval = "";
var highestRank = 0;
var rankDict = new Dictionary<int, List<INode>>();
foreach (var node in Nodes) {
if (node.Rank > highestRank) {
highestRank = node.Rank;
}
List<INode> list;
if (!rankDict.TryGetValue(node.Rank, out list)) {
list = new List<INode>();
rankDict[node.Rank] = list;
}
list.Add(node);
}
retval += "digraph G {\n";
//retval += "splines = true;\n";
//retval += "sep = \"+25,25\";\n";
//retval += "overlap=scalexy\n";
retval += "nodesep=0.6;\n";
retval += "ranksep = \"0.6 equally\"\n";
//retval += "rankdir=\"LR\"\n";
retval += string.Join("->", Enumerable.Range(0, highestRank + 1).Select((i) => string.Format("x{0}", i))) + "[style=invis]\n";
retval += string.Join("\n", Enumerable.Range(0, highestRank + 1).Select((i) => string.Format("x{0} [style=invis]", i))) + "\n";
retval += "x00 [style=invis]\n";
// retval += string.Format("{{rank = source; \"{0}\" x0}}\n", _root.Name);
retval += string.Format("{{rank = source; x00}}\n");
retval += string.Format("x00 -> \"{0}\"\n", _root.Name);
foreach (var pair in rankDict) {
var rank = pair.Key;
var list = pair.Value;
var nodeNames = string.Join(" ", list.Select((n) => "\"" + n.Name + "\""));
retval += string.Format("{{rank = same; {0} x{1}}}\n", nodeNames, rank);
}
// retval += Key();
// retval += "graph [ordering=out];\n";
var nodes = Nodes.ToList();
nodes.Sort((a, b) => {
if (a.StartPosition < b.StartPosition) {
return -1;
} else if (a.StartPosition > b.StartPosition) {
return 1;
} else if (a.EndPosition < b.EndPosition) {
return -1;
} else if (a.EndPosition > b.EndPosition) {
return 1;
} else {
return 0;
}
});
foreach (var node in nodes) {
retval += string.Format("\"{0}\" [{4} shape={2} style=filled fillcolor={3} label=\"{1}\" {5}];\n", node.Name, node.Label, node.Shape, node.Color, node.Ordering, node.Other);
}
foreach (var edge in Edges) {
retval += string.Format("\"{0}\" -> \"{1}\" [label=\"{2}\"]\n", edge.Left.Name, edge.Right.Name, edge.Label?.ToStringNoWeight());
}
retval += "}\n";
return retval;
}