def instantiate_edge(self, group, block, stmt): from_node = DiagramNode.get(stmt.from_node) self.append_node(from_node, group) to_node = DiagramNode.get(stmt.to_node) self.append_node(to_node, group) edge = DiagramEdge(from_node, to_node) edge.set_dir(stmt.edge_type) edge.set_attributes(stmt.attrs) if edge.dir in ('forward', 'both'): forward = edge.duplicate() forward.dir = 'forward' group.edges.append(forward) if block: block.edges.append(forward) if stmt.followers: followers = list(stmt.followers) next_edge_type, next_to_node = followers.pop(0) nested = parser.Edge(stmt.to_node, next_edge_type, next_to_node, followers, stmt.attrs, stmt.edge_block) self.instantiate_edge(group, block, nested) elif stmt.edge_block: self.instantiate(group, block, stmt.edge_block) if edge.dir in ('back', 'both'): reverse = edge.duplicate() reverse.dir = 'back' if edge.dir == 'both': reverse.style = 'dashed' reverse.label = edge.return_label reverse.leftnote = None reverse.rightnote = None group.edges.append(reverse) if block: block.edges.append(reverse)
def instantiate_edge(self, group, block, stmt): from_node = DiagramNode.get(stmt.from_node) self.append_node(from_node, group) to_node = DiagramNode.get(stmt.to_node) self.append_node(to_node, group) edge = DiagramEdge(from_node, to_node) edge.set_dir(stmt.edge_type) edge.set_attributes(stmt.attrs) if edge.dir in ('forward', 'both'): forward = edge.duplicate() forward.dir = 'forward' group.edges.append(forward) if block: block.edges.append(forward) if stmt.followers: followers = list(stmt.followers) next_edge_type, next_to_node = followers.pop(0) nested = parser.Edge(stmt.to_node, next_edge_type, next_to_node, followers, stmt.attrs, stmt.edge_block) self.instantiate_edge(group, block, nested) elif stmt.edge_block: self.instantiate(group, block, stmt.edge_block) if edge.dir in ('back', 'both') and edge.node1 != edge.node2: reverse = edge.duplicate() reverse.dir = 'back' if edge.dir == 'both': reverse.style = 'dashed' reverse.label = edge.return_label reverse.leftnote = None reverse.rightnote = None group.edges.append(reverse) if block: block.edges.append(reverse)
def build(cls, tree): DiagramNode.clear() DiagramEdge.clear() NodeGroup.clear() return DiagramTreeBuilder().build(tree)