Browse code

Treat subgraphs as nodes.

In particular, don't lose edges to/from subgraphs.

Fixes https://github.com/jrfonseca/xdot.py/issues/65

Jose Fonseca authored on 28/12/2018 11:02:45
Showing 2 changed files

1 1
new file mode 100644
... ...
@@ -0,0 +1,8 @@
1
+graph {
2
+	graph [layout=fdp]
3
+	subgraph cluster_d2dd739afc71e4eabc8b572ae98ca5e9 {}
4
+	node_0831ce381fb8a3782996a1d40cf8935d
5
+	node_166562e3c47ae9436f911047fb660528
6
+	cluster_d2dd739afc71e4eabc8b572ae98ca5e9 -- node_166562e3c47ae9436f911047fb660528
7
+	cluster_d2dd739afc71e4eabc8b572ae98ca5e9 -- node_0831ce381fb8a3782996a1d40cf8935d
8
+}
... ...
@@ -325,6 +325,8 @@ class DotParser(Parser):
325 325
             if self.lookahead.type == ID:
326 326
                 id = self.lookahead.text
327 327
                 self.consume()
328
+                # A subgraph is also a node.
329
+                self.handle_node(id, {})
328 330
         if self.lookahead.type == LCURLY:
329 331
             self.consume()
330 332
             while self.lookahead.type != RCURLY:
... ...
@@ -477,6 +479,12 @@ class XDotParser(DotParser):
477 479
         try:
478 480
             pos = attrs['pos']
479 481
         except KeyError:
482
+            # Node without pos attribute, most likely a subgraph.  We need to
483
+            # create a Node object nevertheless, so that any edges to/from it
484
+            # don't get lost.
485
+            # TODO: Extract the position from subgraph > graph > bb attribute.
486
+            node = elements.Node(id, 0.0, 0.0, 0.0, 0.0, [], None)
487
+            self.node_by_name[id] = node
480 488
             return
481 489
 
482 490
         x, y = self.parse_node_pos(pos)