cook2tex/cook2tex.py

131 lines
3.2 KiB
Python
Raw Normal View History

import sys, os, cooklang
2022-05-16 00:01:54 +02:00
def parse_recipe(cooklang_source, title=""):
2022-05-16 00:01:54 +02:00
"""
Takes: string cooklang_source
2022-05-16 00:01:54 +02:00
Returns: [ string ] tex
Takes the recipes source as an argument and returns the cuisine recipe block.
2022-05-16 00:01:54 +02:00
One element per line.
"""
recipe = cooklang.parseRecipe(cooklang_source)
2022-05-16 00:01:54 +02:00
if title:
title = get_metadata_value(["title"], recipe, title)
else:
title = get_metadata_value(["title"], recipe)
servings = get_metadata_value(time_keys, recipe)
time = get_metadata_value(serving_keys, recipe)
2022-05-16 00:01:54 +02:00
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
def parse_recipe_from_file(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 os.path.exists(path):
raise ArgumentError
name = os.path.basename(path)
split_name = os.path.splitext(name)
title = split_name[0]
with open(path) as file:
return parse_recipe(file.read(), title)
2022-05-16 00:01:54 +02:00
serving_keys = ["servings", "serves"]
time_keys = ["time", "total time"]
def get_metadata_value(keys, recipe, substitute="N/A"):
for key in keys:
if key in recipe["metadata"].keys():
return recipe["metadata"][key]
return substitute
2022-05-16 00:01:54 +02:00
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
class ArgumentError(Exception):
def __init__(self):
self.message = "Please supply the path to a cooklang file as an argument."
super().__init__(self.message)
2022-05-16 00:01:54 +02:00
if __name__ == "__main__":
if sys.argv[1] == "--":
tex = parse_recipe(sys.stdin.read())
else:
tex = parse_recipe_from_file(sys.argv[1])
for line in tex:
print(line)