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)