nix-sort/main.py

169 lines
5.2 KiB
Python
Raw Normal View History

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)