diff options
author | Mattias Andrée <maandree@kth.se> | 2024-02-10 07:05:52 +0100 |
---|---|---|
committer | Mattias Andrée <maandree@kth.se> | 2024-02-10 07:05:52 +0100 |
commit | c90e3bf08b1c6f4426d0f72c76b1ac9a0a346efb (patch) | |
tree | f9a0216e5e7d2a0a77d40a1840a1f6b3424869d2 /tools/sortforest | |
parent | Add alias for versions up to 99 of applications (diff) | |
download | simple-icon-theme-c90e3bf08b1c6f4426d0f72c76b1ac9a0a346efb.tar.gz simple-icon-theme-c90e3bf08b1c6f4426d0f72c76b1ac9a0a346efb.tar.bz2 simple-icon-theme-c90e3bf08b1c6f4426d0f72c76b1ac9a0a346efb.tar.xz |
Add tools
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'tools/sortforest')
-rwxr-xr-x | tools/sortforest | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/tools/sortforest b/tools/sortforest new file mode 100755 index 0000000..bbb2faa --- /dev/null +++ b/tools/sortforest @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 +import sys + +if len(sys.argv) > 1: + print('usage: %s < icon-forest' % sys.argv[0], file = sys.stderr) + exit(1) + +standalone = set() +pairs = [] +stack = [] +try: + while True: + line = input() + if not line.strip(): + continue + indent = 0 + while line.startswith('\t'): + indent += 1 + line = line[1:] + assert not line.startswith(' ') + assert not line.endswith(' ') + assert '\t' not in line + assert indent <= len(stack) + stack = stack[:indent] + stack.append(line) + if indent == 0: + standalone.add(line) + else: + pairs.append((stack[indent - 1], line)) +except EOFError: + pass + +tree = {} +retree = {} +for parent, child in pairs: + if parent == child: + continue + if child in retree: + if retree[child] == parent: + continue + print('%s appears in the tree twice' % child, file = sys.stderr) + if parent in retree: + exit(1) + print('reversing with parent %s\n' % parent, file = sys.stderr) + (parent, child) = (child, parent) + if parent in tree: + tree[parent].append(child) + else: + tree[parent] = [child] + retree[child] = parent + +forest = {} +printed = {} +def printtree(this_tree, node, root, indent = ''): + if node in forest: + subtree = forest[node] + del forest[node] + this_tree.extend([(indent + subnode) for subnode in subtree]) + return + if node in printed: + if indent: + this_tree.append(indent + node) + return + this_tree.append(indent + node) + printed[node] = root + indent = indent + '\t' + if node in tree: + for child in sorted(tree[node]): + if child != root: + printtree(this_tree, child, root, indent) +defered = [] +for root in sorted(standalone): + if root in tree: + mytree = [] + printtree(mytree, root, root) + forest[root] = mytree + else: + defered.append(root) + +for tree in sorted(forest): + for line in forest[tree]: + print(line) +for stub in sorted(defered): + if stub not in printed: + print(stub) |