2024-03-07 22:44:23 +01:00
|
|
|
#! /usr/bin/env python
|
|
|
|
|
2024-03-08 00:50:15 +01:00
|
|
|
from pprint import pprint
|
2024-03-07 22:44:23 +01:00
|
|
|
|
|
|
|
|
2024-03-08 00:50:15 +01:00
|
|
|
def getTopNode(nodes):
|
|
|
|
node = nodes
|
|
|
|
while isinstance(node[-1], list):
|
|
|
|
node = node[-1]
|
|
|
|
return node
|
2024-03-07 22:44:23 +01:00
|
|
|
|
|
|
|
|
2024-03-08 00:50:15 +01:00
|
|
|
def getAlmostTopNode(nodes):
|
|
|
|
node = nodes
|
2024-03-08 11:02:21 +01:00
|
|
|
parent = None
|
2024-03-08 00:50:15 +01:00
|
|
|
while isinstance(node[-1], list):
|
|
|
|
parent = node
|
|
|
|
node = node[-1]
|
|
|
|
return parent
|
|
|
|
|
|
|
|
|
2024-03-08 14:25:20 +01:00
|
|
|
# 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)
|
|
|
|
|
|
|
|
|
2024-03-08 11:02:21 +01:00
|
|
|
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)
|
|
|
|
|
|
|
|
|
2024-03-08 14:25:20 +01:00
|
|
|
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)
|
|
|
|
|
|
|
|
|
2024-03-08 00:50:15 +01:00
|
|
|
separators = {"{": (",", ";")}
|
|
|
|
|
|
|
|
nodes = [""]
|
|
|
|
top_node = getTopNode(nodes)
|
2024-03-07 22:44:23 +01:00
|
|
|
|
2024-03-08 00:50:15 +01:00
|
|
|
openers = ("{", "(", "[")
|
|
|
|
closers = ("}", ")", "]")
|
|
|
|
|
|
|
|
last_opener = None
|
|
|
|
|
2024-03-08 11:02:21 +01:00
|
|
|
prev_char = None
|
|
|
|
prev_prev_char = None
|
|
|
|
sequential = 0
|
|
|
|
prev_sequential = 0
|
|
|
|
|
2024-03-08 11:40:49 +01:00
|
|
|
lineno = 0
|
|
|
|
|
2024-03-08 14:25:20 +01:00
|
|
|
opener_stack = []
|
|
|
|
|
2024-03-08 00:50:15 +01:00
|
|
|
try:
|
|
|
|
with open("/etc/nixos/components/programs/imunes.nix", "r") as file:
|
|
|
|
while (line := file.readline()):
|
2024-03-08 11:40:49 +01:00
|
|
|
lineno += 1
|
2024-03-08 00:50:15 +01:00
|
|
|
for char in line:
|
2024-03-08 11:02:21 +01:00
|
|
|
added = False
|
2024-03-08 14:25:20 +01:00
|
|
|
# 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}"
|
|
|
|
# )
|
2024-03-08 11:40:49 +01:00
|
|
|
if last_opener == '"':
|
|
|
|
if char == "\\":
|
|
|
|
prev_sequential = sequential
|
|
|
|
sequential += 1
|
|
|
|
elif char == "{" and prev_char == "$" and prev_sequential % 2 != 1:
|
2024-03-08 14:25:20 +01:00
|
|
|
added, last_opener = treeClimb(opener_stack, nodes,
|
|
|
|
char)
|
2024-03-08 11:40:49 +01:00
|
|
|
else:
|
2024-03-08 14:25:20 +01:00
|
|
|
if char == '"' and sequential % 2 != 1:
|
|
|
|
last_opener = treeDescend(opener_stack, nodes,
|
|
|
|
lineno, char, 1)
|
2024-03-08 11:40:49 +01:00
|
|
|
prev_sequential = sequential
|
|
|
|
sequential = 0
|
|
|
|
elif last_opener == "'":
|
|
|
|
if char == "'":
|
|
|
|
prev_sequential = sequential
|
|
|
|
sequential += 1
|
|
|
|
elif char == "{" and prev_char == "$" and prev_sequential % 3 != 2:
|
2024-03-08 14:25:20 +01:00
|
|
|
added, last_opener = treeClimb(opener_stack, nodes,
|
|
|
|
char)
|
2024-03-08 11:02:21 +01:00
|
|
|
else:
|
2024-03-08 11:40:49 +01:00
|
|
|
if sequential % 3 == 2 and char != "$":
|
2024-03-08 14:25:20 +01:00
|
|
|
last_opener = treeDescend(opener_stack, nodes,
|
|
|
|
lineno, char, 2)
|
2024-03-08 11:40:49 +01:00
|
|
|
prev_sequential = sequential
|
|
|
|
sequential = 0
|
|
|
|
else:
|
|
|
|
if char == '"':
|
2024-03-08 14:25:20 +01:00
|
|
|
added, last_opener = treeClimb(opener_stack, nodes,
|
|
|
|
char)
|
2024-03-08 11:40:49 +01:00
|
|
|
elif char == "'" and prev_char == "'":
|
2024-03-08 14:25:20 +01:00
|
|
|
added, last_opener = treeClimb(opener_stack, nodes,
|
|
|
|
char)
|
2024-03-08 11:40:49 +01:00
|
|
|
elif char in openers:
|
2024-03-08 14:25:20 +01:00
|
|
|
added, last_opener = treeClimb(opener_stack, nodes,
|
|
|
|
char)
|
2024-03-08 11:40:49 +01:00
|
|
|
elif char in closers:
|
2024-03-08 14:25:20 +01:00
|
|
|
last_opener = treeDescend(opener_stack, nodes, lineno,
|
|
|
|
char, 3)
|
2024-03-08 11:02:21 +01:00
|
|
|
if not added:
|
2024-03-08 00:50:15 +01:00
|
|
|
getTopNode(nodes)[-1] += char
|
2024-03-08 11:40:49 +01:00
|
|
|
prev_char = char
|
2024-03-07 22:44:23 +01:00
|
|
|
|
2024-03-08 11:02:21 +01:00
|
|
|
# printTree(nodes)
|
2024-03-08 00:50:15 +01:00
|
|
|
pprint(nodes)
|
|
|
|
except BrokenPipeError:
|
|
|
|
exit(0)
|