86 lines
2.2 KiB
Python
86 lines
2.2 KiB
Python
import json
|
|
import re
|
|
|
|
from anytree import Node, RenderTree
|
|
from anytree.exporter import DictExporter
|
|
from recipe import Recipe
|
|
|
|
|
|
def print_nodes():
|
|
for i, node in nodes.items():
|
|
print(f" {i}.) {node.result}")
|
|
|
|
|
|
nodes = {}
|
|
i = 0
|
|
node = "start"
|
|
while node:
|
|
print_nodes()
|
|
|
|
node = input("Add ingredient/task: ")
|
|
|
|
if node:
|
|
needs = ""
|
|
if nodes:
|
|
needs = input("List needs (comma-separated): ")
|
|
|
|
description = input("Detailed description: ")
|
|
|
|
if needs:
|
|
result = input("Result of node (e.g. chopped carrots): ")
|
|
new_node = Node(node, description=description, result=result)
|
|
|
|
for key in needs.split(","):
|
|
try:
|
|
nodes.pop(int(key.strip())).parent = new_node
|
|
except KeyError:
|
|
print(f"<{key.strip()}> was not a valid ingredient or task")
|
|
else:
|
|
new_node = Node(node, description=description, result=node)
|
|
|
|
nodes[i] = new_node
|
|
i += 1
|
|
else:
|
|
for key, tree_node in nodes.items():
|
|
print(key, end=" ")
|
|
for pre, _, render_node in RenderTree(tree_node):
|
|
print(f"{pre}{render_node.name}")
|
|
|
|
confirm = input("Done adding ingredients and tasks? (y/N): ")
|
|
|
|
if not confirm or not confirm.lower().startswith("y"):
|
|
node = "continue"
|
|
|
|
name = ""
|
|
try:
|
|
while not name:
|
|
name = input("Recipe name (required to save, ctrl-c to exit): ")
|
|
except KeyboardInterrupt:
|
|
print("Exiting...")
|
|
exit(0)
|
|
|
|
description = input("Recipe description: ")
|
|
servings = input("Servings: ")
|
|
prep_time = input("Prep time: ")
|
|
cook_time = input("Cook time: ")
|
|
|
|
recipe = Recipe(name, description, servings, prep_time, cook_time)
|
|
|
|
root_keys = nodes.keys()
|
|
if len(root_keys) > 1:
|
|
print_nodes()
|
|
order = input("Multiple tree roots detected, please specify order (comma-separated): ")
|
|
root_keys = [int(key.strip()) for key in order.split(",")]
|
|
|
|
for key in root_keys:
|
|
recipe.add_sub_recipe(nodes[key])
|
|
|
|
filename = re.sub(r"[ -]", "_", name.strip()).lower()
|
|
filename = f"{re.sub(r'[^a-z_]', '', filename)}.json"
|
|
|
|
print(f"Writing to {filename}...")
|
|
with open(filename, 'w') as f:
|
|
f.write(recipe.to_json())
|
|
print("Done!")
|
|
|