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 instantiate(self, group, block, tree): for stmt in tree.stmts: if isinstance(stmt, parser.Node): node = DiagramNode.get(stmt.id) node.set_attributes(stmt.attrs) self.append_node(node, group) elif isinstance(stmt, parser.Edge): self.instantiate_edge(group, block, stmt) elif isinstance(stmt, parser.Group): node = NodeGroup.get(None) self.instantiate(node, block, stmt) self.diagram.groups.append(node) elif isinstance(stmt, parser.Attr): if block: block.set_attribute(stmt) else: group.set_attribute(stmt) elif isinstance(stmt, parser.Separator): sep = EdgeSeparator(stmt.type, unquote(stmt.value)) sep.group = group self.diagram.separators.append(sep) group.edges.append(sep) elif isinstance(stmt, parser.Fragment): subblock = AltBlock(stmt.type, stmt.id) if block: subblock.xlevel = block.xlevel + 1 self.diagram.altblocks.append(subblock) self.instantiate(group, subblock, stmt) if block: for edge in subblock.edges: block.edges.append(edge) elif isinstance(stmt, parser.Extension): if stmt.type == 'class': name = unquote(stmt.name) Diagram.classes[name] = stmt elif stmt.type == 'plugin': self.diagram.set_plugin(stmt.name, stmt.attrs) return group
def build(cls, tree): DiagramNode.clear() DiagramEdge.clear() NodeGroup.clear() return DiagramTreeBuilder().build(tree)