diff --git a/main.py b/main.py index 843e91c..7e03091 100755 --- a/main.py +++ b/main.py @@ -19,6 +19,38 @@ def getAlmostTopNode(nodes): return parent +# char = "}" +# nodes = [ +# '{', [' lib, pkgs, ... '], '}:\n\n{', +# [ +# '\n environment.systemPackages = [', +# [ +# '\n (', +# [ +# 'pkgs.tcl.mkTclDerivation rec {', +# [ +# '\n pname = "', ['imunes'], '";\n version = "', +# ['2.4.0'], '";\n\n src = pkgs.fetchFromGitHub {', +# [ +# '\n owner = "', ['imunes'], +# '";\n repo = "', ['imunes'], +# '";\n one = "', ['v${', ['version'], ''] +# ] +# ] +# ] +# ] +# ] +# ] + +# print("getAlmostTopNode(nodes):") +# pprint(getAlmostTopNode(nodes)) +# print("getAlmostTopNode(nodes)[-2]:") +# pprint(getAlmostTopNode(nodes)[-2]) +# print("getAlmostTopNode(nodes)[-2][-1]:") +# pprint(getAlmostTopNode(nodes)[-2][-1]) +# exit(0) + + def stripTree(node): if isinstance(node, str): return @@ -37,6 +69,26 @@ def printTree(node, depth=0): printTree(node[index], depth + 1) +def treeDescend(opener_stack, nodes, lineno, char, id): + almost_top_node = getAlmostTopNode(nodes) + if almost_top_node is None: + return None + almost_top_node.append("") + if len(opener_stack) != 0: + opener_stack.pop() + if len(opener_stack) == 0: + return None + return opener_stack[-1] + + +def treeClimb(opener_stack, nodes, char): + top_node = getTopNode(nodes) + top_node[-1] += char + top_node.append([""]) + opener_stack.append(char) + return (True, char) + + separators = {"{": (",", ";")} nodes = [""] @@ -52,39 +104,32 @@ prev_prev_char = None sequential = 0 prev_sequential = 0 - -def treeDescend(nodes): - almost_top_node = getAlmostTopNode(nodes) - almost_top_node.append("") - if almost_top_node is None: - return None - return almost_top_node[-2][-1] - - -def treeClimb(nodes, char): - top_node = getTopNode(nodes) - top_node[-1] += char - top_node.append([""]) - return (True, char) - - lineno = 0 +opener_stack = [] + try: with open("/etc/nixos/components/programs/imunes.nix", "r") as file: while (line := file.readline()): lineno += 1 for char in line: added = False + # if lineno in (6, 7) and char != " ": + # display_char = char if char != "\n" else "\\n" + # print( + # f"{lineno:2}: {display_char:2} {last_opener:4} {opener_stack}" + # ) if last_opener == '"': if char == "\\": prev_sequential = sequential sequential += 1 elif char == "{" and prev_char == "$" and prev_sequential % 2 != 1: - added, last_opener = treeClimb(nodes, char) + added, last_opener = treeClimb(opener_stack, nodes, + char) else: - if char == '"' and sequential % 2 == 1: - last_opener = treeDescend(nodes) + if char == '"' and sequential % 2 != 1: + last_opener = treeDescend(opener_stack, nodes, + lineno, char, 1) prev_sequential = sequential sequential = 0 elif last_opener == "'": @@ -92,21 +137,27 @@ try: prev_sequential = sequential sequential += 1 elif char == "{" and prev_char == "$" and prev_sequential % 3 != 2: - added, last_opener = treeClimb(nodes, char) + added, last_opener = treeClimb(opener_stack, nodes, + char) else: if sequential % 3 == 2 and char != "$": - last_opener = treeDescend(nodes) + last_opener = treeDescend(opener_stack, nodes, + lineno, char, 2) prev_sequential = sequential sequential = 0 else: if char == '"': - added, last_opener = treeClimb(nodes, char) + added, last_opener = treeClimb(opener_stack, nodes, + char) elif char == "'" and prev_char == "'": - added, last_opener = treeClimb(nodes, char) + added, last_opener = treeClimb(opener_stack, nodes, + char) elif char in openers: - added, last_opener = treeClimb(nodes, char) + added, last_opener = treeClimb(opener_stack, nodes, + char) elif char in closers: - last_opener = treeDescend(nodes) + last_opener = treeDescend(opener_stack, nodes, lineno, + char, 3) if not added: getTopNode(nodes)[-1] += char prev_char = char