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)