feat: Introduce tree functions

This commit is contained in:
lwad 2024-03-08 10:02:21 +00:00
parent 1a6c65bdd4
commit a17fd9b3df
1 changed files with 68 additions and 15 deletions

83
main.py
View File

@ -12,12 +12,31 @@ def getTopNode(nodes):
def getAlmostTopNode(nodes):
node = nodes
parent = None
while isinstance(node[-1], list):
parent = node
node = node[-1]
return parent
def stripTree(node):
if isinstance(node, str):
return
for index in range(len(node)):
if isinstance(node[index], str):
node[index] = node[index].strip(" \n")
else:
stripTree(node[index])
def printTree(node, depth=0):
if isinstance(node, str):
print(" " * depth + node, end="")
return
for index in range(len(node)):
printTree(node[index], depth + 1)
separators = {"{": (",", ";")}
nodes = [""]
@ -28,29 +47,63 @@ closers = ("}", ")", "]")
last_opener = None
def stripTree(node):
if isinstance(node, str):
return
for index in range(len(node)):
if isinstance(node[index], str):
node[index] = node[index].strip(" \n")
else:
stripTree(node[index])
prev_char = None
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)
try:
with open("/etc/nixos/components/programs/imunes.nix", "r") as file:
while (line := file.readline()):
for char in line:
if char not in closers:
getTopNode(nodes)[-1] += char
if char in openers:
getTopNode(nodes).append([""])
added = False
if last_opener == "\"":
if char == "\"":
if prev_char != "\\":
last_opener = treeDescend(nodes)
elif char == "{" and prev_char == "$" and prev_prev_char != "\\":
added, last_opener = treeClimb(nodes, char)
else:
getAlmostTopNode(nodes).append("")
if last_opener == "'":
if char == "'":
prev_sequential = sequential
sequential += 1
elif char == "{" and prev_char == "$" and prev_sequential % 3 != 2:
added, last_opener = treeClimb(nodes, char)
else:
if sequential % 3 == 2 and char != "$":
last_opener = treeDescend(nodes)
prev_sequential = sequential
sequential = 0
else:
if char == "\"":
added, last_opener = treeClimb(nodes, char)
elif char == "'" and prev_char == "'":
added, last_opener = treeClimb(nodes, char)
elif char in openers:
added, last_opener = treeClimb(nodes, char)
elif char in closers:
last_opener = treeDescend(nodes)
if not added:
getTopNode(nodes)[-1] += char
stripTree(nodes)
# printTree(nodes)
pprint(nodes)
except BrokenPipeError:
exit(0)