aboutsummaryrefslogblamecommitdiffstats
path: root/tools/sortforest
blob: bbb2faa4e4fa2c09fee900041d08b08412701d80 (plain) (tree)




















































































                                                                         
#!/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)