feat: Introduce tree functions
This commit is contained in:
parent
1a6c65bdd4
commit
a17fd9b3df
83
main.py
83
main.py
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue