103 lines
2.5 KiB
Python
103 lines
2.5 KiB
Python
|
import sys, cooklang
|
||
|
from os.path import exists
|
||
|
|
||
|
def parse_recipe(path):
|
||
|
"""
|
||
|
Takes: string path
|
||
|
Returns: [ string ] tex
|
||
|
|
||
|
Takes a recipe path as an argument and returns the cuisine recipe block.
|
||
|
One element per line.
|
||
|
"""
|
||
|
|
||
|
if not exists(path):
|
||
|
raise ArgumentError
|
||
|
|
||
|
with open(path) as file:
|
||
|
# First argument is recipe file
|
||
|
recipe = cooklang.parseRecipe(file.read())
|
||
|
|
||
|
title = get_metadata_value("title", recipe)
|
||
|
servings = get_metadata_value("servings", recipe)
|
||
|
time = get_metadata_value("time", recipe)
|
||
|
|
||
|
tex = []
|
||
|
|
||
|
tex.append("\\begin{recipe}{" +
|
||
|
title + "}{" +
|
||
|
servings + "}{" +
|
||
|
time + "}")
|
||
|
|
||
|
for step in recipe["steps"]:
|
||
|
ingredients = get_step_ingredients(step)
|
||
|
|
||
|
if ingredients:
|
||
|
tex += texify_ingredients(ingredients)
|
||
|
else:
|
||
|
tex.append("\\newstep")
|
||
|
|
||
|
step_text = ""
|
||
|
for part in step:
|
||
|
if "value" in part.keys():
|
||
|
step_text += part["value"]
|
||
|
elif "name" in part.keys():
|
||
|
# Remove whitespaces from ingredient names
|
||
|
step_text += part["name"].strip()
|
||
|
tex.append(step_text)
|
||
|
|
||
|
tex.append("\\end{recipe}")
|
||
|
|
||
|
return tex
|
||
|
|
||
|
|
||
|
class ArgumentError(Exception):
|
||
|
def __init__(self):
|
||
|
self.message = "Please supply the path to a cooklang file as an argument."
|
||
|
super().__init__(self.message)
|
||
|
|
||
|
def get_metadata_value(key, recipe):
|
||
|
if key in recipe["metadata"].keys():
|
||
|
return recipe["metadata"][key]
|
||
|
else:
|
||
|
return "N/A"
|
||
|
|
||
|
|
||
|
def get_step_ingredients(step):
|
||
|
ingredients = []
|
||
|
|
||
|
for part in step:
|
||
|
if part["type"] == "ingredient":
|
||
|
ingredients.append(part)
|
||
|
|
||
|
return ingredients
|
||
|
|
||
|
|
||
|
def texify_ingredients(ingredients):
|
||
|
tex = []
|
||
|
|
||
|
for ing in ingredients:
|
||
|
if ing["units"]:
|
||
|
|
||
|
try:
|
||
|
quantity = float(ing["quantity"])
|
||
|
if quantity % 1 == 0:
|
||
|
quantity = int(quantity)
|
||
|
except ValueError:
|
||
|
quantity = ing["units"]
|
||
|
|
||
|
tex.append("\\ingredient[" +
|
||
|
str(quantity) + "]{" +
|
||
|
ing["units"] + "}{" +
|
||
|
ing["name"] + "}")
|
||
|
else:
|
||
|
tex.append("\\ingredient{" +
|
||
|
ing["units"] + "}{" +
|
||
|
ing["name"] + "}")
|
||
|
|
||
|
return tex
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
for line in parse_recipe(sys.argv[1]):
|
||
|
print(line)
|