예제 #1
0
    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)
예제 #2
0
    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)
예제 #3
0
    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
예제 #4
0
    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
예제 #5
0
    def build(cls, tree):
        DiagramNode.clear()
        DiagramEdge.clear()
        NodeGroup.clear()

        return DiagramTreeBuilder().build(tree)
예제 #6
0
    def build(cls, tree):
        DiagramNode.clear()
        DiagramEdge.clear()
        NodeGroup.clear()

        return DiagramTreeBuilder().build(tree)