Initial commit with a halfway working algorithm
This commit is contained in:
commit
418b5ae28d
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
*.json
|
50
make_tree.py
Normal file
50
make_tree.py
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
from anytree import Node, RenderTree
|
||||||
|
from anytree.exporter import JsonExporter
|
||||||
|
|
||||||
|
|
||||||
|
def print_ingredients():
|
||||||
|
for i, node in ingredients.items():
|
||||||
|
print(f" {i}.) {node.name}")
|
||||||
|
|
||||||
|
|
||||||
|
ingredients = {}
|
||||||
|
|
||||||
|
ingredient = "start"
|
||||||
|
i = 0
|
||||||
|
while ingredient:
|
||||||
|
print_ingredients()
|
||||||
|
|
||||||
|
ingredient = input("Add ingredient: ")
|
||||||
|
|
||||||
|
if ingredient:
|
||||||
|
ingredients[i] = Node(ingredient)
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
task = "start"
|
||||||
|
while task:
|
||||||
|
print_ingredients()
|
||||||
|
|
||||||
|
task = input("Add task: ")
|
||||||
|
|
||||||
|
if task:
|
||||||
|
needs = input("List needs (comma-separated): ")
|
||||||
|
|
||||||
|
new_task = Node(task)
|
||||||
|
|
||||||
|
ingredients[i] = new_task
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
for e in [int(key.strip()) for key in needs.split(",")]:
|
||||||
|
ingredients.pop(e).parent = new_task
|
||||||
|
|
||||||
|
for pre, _, node in RenderTree(new_task):
|
||||||
|
print(f"{pre}{node.name}")
|
||||||
|
|
||||||
|
name = input("Recipe name: ")
|
||||||
|
|
||||||
|
if name:
|
||||||
|
name = name.replace(" ", "_")
|
||||||
|
|
||||||
|
with open(f"{name}.json", 'w') as f:
|
||||||
|
JsonExporter(indent=2).write(new_task, f)
|
||||||
|
|
73
output_html.py
Normal file
73
output_html.py
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
from anytree import LevelOrderGroupIter
|
||||||
|
from anytree.importer import JsonImporter
|
||||||
|
from sys import argv
|
||||||
|
|
||||||
|
if len(argv) < 2:
|
||||||
|
print(f"usage: {argv[0]} <json file>")
|
||||||
|
exit()
|
||||||
|
|
||||||
|
with open(argv[1], 'r') as f:
|
||||||
|
root = JsonImporter().read(f)
|
||||||
|
|
||||||
|
rows = []
|
||||||
|
leaves = []
|
||||||
|
|
||||||
|
for i in range(len(root.leaves)):
|
||||||
|
rows.append([])
|
||||||
|
leaves.append({"name":"wrong"})
|
||||||
|
|
||||||
|
cur_row = 0
|
||||||
|
for level in LevelOrderGroupIter(root):
|
||||||
|
cur_row = 0
|
||||||
|
|
||||||
|
for node in sorted(level, key=lambda x: x.size, reverse=True):
|
||||||
|
leaf_count = len(node.leaves)
|
||||||
|
if False: #node in root.leaves:
|
||||||
|
leaves[cur_row] = node
|
||||||
|
else:
|
||||||
|
rows[cur_row].append(f'<td rowspan="{leaf_count}">{node.name}</td>')
|
||||||
|
|
||||||
|
cur_row += max(leaf_count, 1)
|
||||||
|
last_depth = node.depth
|
||||||
|
|
||||||
|
print(leaves)
|
||||||
|
|
||||||
|
for i, leaf in enumerate(leaves):
|
||||||
|
#rows[i].append(f"<td>{leaf.name}</td>")
|
||||||
|
rows[i].reverse()
|
||||||
|
|
||||||
|
print("<tr>")
|
||||||
|
for cell in rows[i]:
|
||||||
|
print(f" {cell}")
|
||||||
|
print("</tr>")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
output_rows = []
|
||||||
|
rows = []
|
||||||
|
|
||||||
|
for i in range(len(root.leaves)):
|
||||||
|
output_rows.append([])
|
||||||
|
|
||||||
|
def depth_first_search(node, rows, leaf_count):
|
||||||
|
|
||||||
|
for child in sorted(node.children, key=lambda x: x.size, reverse=True):
|
||||||
|
leaf_count = depth_first_search(child, rows, leaf_count)
|
||||||
|
|
||||||
|
if node.is_leaf:
|
||||||
|
cur_row = leaf_count
|
||||||
|
rows[cur_row].append(f'<td>{node.name}</td>')
|
||||||
|
leaf_count += 1
|
||||||
|
else:
|
||||||
|
cur_row = leaf_count - len(node.leaves)
|
||||||
|
rows[cur_row].append(f'<td rowspan="{len(node.leaves)}">{node.name}</td>')
|
||||||
|
|
||||||
|
return leaf_count
|
||||||
|
|
||||||
|
depth_first_search(root, output_rows, 0)
|
||||||
|
|
||||||
|
for row in output_rows:
|
||||||
|
print("<tr>")
|
||||||
|
for cell in row:
|
||||||
|
print(f" {cell}")
|
||||||
|
print("</tr>")
|
89
test.py
Normal file
89
test.py
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
from anytree import Node
|
||||||
|
from anytree import RenderTree
|
||||||
|
from anytree import LevelOrderIter, LevelOrderGroupIter
|
||||||
|
from anytree.search import find, findall
|
||||||
|
|
||||||
|
cut = Node("cut")
|
||||||
|
cool = Node("cool", parent=cut)
|
||||||
|
press = Node("press into pan", parent=cool)
|
||||||
|
stir = Node("stir until coated", parent=press)
|
||||||
|
cereal = Node("crispy rice cereal (6 cups)", parent=stir)
|
||||||
|
melt_stir = Node("stir until melted", parent=stir)
|
||||||
|
marshmellows = Node("marshmellows (10 oz.)", parent=melt_stir)
|
||||||
|
melt = Node("melt", parent=melt_stir)
|
||||||
|
butter = Node("butter (3 tbsp)", parent=melt)
|
||||||
|
|
||||||
|
output_lines = {}
|
||||||
|
leaves = [node for node in sorted(cut.leaves, key=lambda node: node.depth, reverse=True)]
|
||||||
|
|
||||||
|
max_leaf_name_length = max([len(leaf.name) for leaf in leaves])
|
||||||
|
|
||||||
|
for leaf in leaves:
|
||||||
|
line = f"| {leaf.name.ljust(max_leaf_name_length)} |"
|
||||||
|
output_lines[leaf] = line
|
||||||
|
|
||||||
|
max_depth = max([leaf.depth for leaf in leaves])
|
||||||
|
|
||||||
|
for cur_depth in range(max_depth-1, -1, -1):
|
||||||
|
max_name_length = max([len(node.name) for node in findall(cut, lambda node: node.depth == cur_depth and not node in cut.leaves)])
|
||||||
|
max_name_length = max(max_name_length, 10)
|
||||||
|
for leaf in leaves:
|
||||||
|
task = find(cut, lambda node: node.depth == cur_depth and node in leaf.path)
|
||||||
|
if task and not task in cut.leaves:
|
||||||
|
output_lines[leaf] += f" {task.name.center(max_name_length)} |"
|
||||||
|
else:
|
||||||
|
output_lines[leaf] += f" {"".ljust(max_name_length)} "
|
||||||
|
|
||||||
|
for key in output_lines.keys():
|
||||||
|
print(output_lines[key])
|
||||||
|
|
||||||
|
print("")
|
||||||
|
|
||||||
|
output_lines = [""] * len(cut.leaves)
|
||||||
|
|
||||||
|
cur_line = 0
|
||||||
|
last_depth = cut.depth
|
||||||
|
for node in LevelOrderIter(cut):
|
||||||
|
if node in cut.leaves:
|
||||||
|
continue
|
||||||
|
if last_depth != node.depth:
|
||||||
|
cur_line = 0
|
||||||
|
|
||||||
|
output_lines[cur_line] = f" {node.name} " + output_lines[cur_line]
|
||||||
|
cur_line += len(node.children) + 1
|
||||||
|
last_depth = node.depth
|
||||||
|
|
||||||
|
for line in output_lines:
|
||||||
|
print(line)
|
||||||
|
|
||||||
|
rows = []
|
||||||
|
leaves = []
|
||||||
|
|
||||||
|
for i in range(len(cut.leaves)):
|
||||||
|
rows.append([])
|
||||||
|
leaves.append({"name":"wrong"})
|
||||||
|
|
||||||
|
cur_row = 0
|
||||||
|
for level in LevelOrderGroupIter(cut):
|
||||||
|
cur_row = 0
|
||||||
|
|
||||||
|
for node in reversed(level):
|
||||||
|
leaf_count = len(node.leaves)
|
||||||
|
if node in cut.leaves:
|
||||||
|
leaves[cur_row] = node
|
||||||
|
else:
|
||||||
|
rows[cur_row].append(f'<td rowspan="{leaf_count}">{node.name}</td>')
|
||||||
|
|
||||||
|
cur_row += max(leaf_count, 1)
|
||||||
|
last_depth = node.depth
|
||||||
|
|
||||||
|
for i, leaf in enumerate(leaves):
|
||||||
|
rows[i].append(f"<td>{leaf.name}</td>")
|
||||||
|
rows[i].reverse()
|
||||||
|
|
||||||
|
print("<tr>")
|
||||||
|
for cell in rows[i]:
|
||||||
|
print(cell)
|
||||||
|
print("</tr>")
|
||||||
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user