File indexing completed on 2024-05-12 15:33:06

0001 # -*- coding: utf-8 -*-
0002 #
0003 # SPDX-FileCopyrightText: 2014 Aurélien Gâteau <agateau@kde.org>
0004 #
0005 # SPDX-License-Identifier: BSD-2-Clause
0006 
0007 from contextlib import contextmanager
0008 
0009 class Block(object):
0010     INDENT_SIZE = 4
0011 
0012     def __init__(self, out, depth = 0):
0013         self.out = out
0014         self.depth = depth
0015 
0016     def writeln(self, text):
0017         self.out.write(self.depth * Block.INDENT_SIZE * " " + text + "\n")
0018 
0019     def write_attrs(self, **attrs):
0020         for key, value in attrs.items():
0021             self.writeln('"{}" = "{}";'.format(key, value))
0022 
0023     def write_list_attrs(self, name, **attrs):
0024         with self.square_block(name) as b:
0025             for key, value in attrs.items():
0026                 b.writeln('"{}" = "{}"'.format(key, value))
0027 
0028     def write_nodes(self, nodes):
0029         for node in sorted(nodes):
0030             self.writeln('"{}";'.format(node))
0031 
0032     @contextmanager
0033     def block(self, opener, closer, **attrs):
0034         self.writeln(opener)
0035         block = Block(self.out, depth=self.depth + 1)
0036         block.write_attrs(**attrs)
0037         yield block
0038         self.writeln(closer)
0039 
0040     def square_block(self, prefix, **attrs):
0041         return self.block(prefix + " [", "]", **attrs)
0042 
0043     def curly_block(self, prefix, **attrs):
0044         return self.block(prefix + " {", "}", **attrs)
0045 
0046     def cluster_block(self, title, **attrs):
0047         return self.curly_block("subgraph " + quote("cluster_" + title), label=title, **attrs)
0048 
0049 
0050 def quote(txt):
0051     return '"{}"'.format(txt)