From 576a9bb324449b35850a26937397ee938e0104bc Mon Sep 17 00:00:00 2001 From: Thelie Date: Wed, 18 May 2022 08:48:08 +0200 Subject: [PATCH] Added recursive book generation functionality. --- README.md | 12 ++++++- cooklangbook.py | 92 ++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 95 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 7e0ec36..fc135ec 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,17 @@ Optionally, if provided with the argument "--", reads the recipes source from st ## cooklangbook.py Takes multiple recipe paths as arguments and returns a complete latex document on stdout. +Optionally takes the '-r' flag and two directory paths, +the first one being the source and the second one the destination directory. +It then generates multiple .tex files, +one per recipe and one called `recipe-book.tex` including all recipies. -### Example +### Examples + +Basic operation: `python3 cooklangbook.py /path/to/recipes/{rec1,rec2,rec3}` + +Recursive book generation: + +`python3 cooklangbook.py /path/to/source/dir /path/to/dest/dir` diff --git a/cooklangbook.py b/cooklangbook.py index a32d24c..02e2c52 100644 --- a/cooklangbook.py +++ b/cooklangbook.py @@ -1,4 +1,4 @@ -import sys, cook2tex +import sys, os, cook2tex def create_book(argv): """ @@ -10,21 +10,97 @@ def create_book(argv): """ tex = [] + for path in argv: + tex.append("\n") + tex += cook2tex.parse_recipe_from_file(path) + + return latex_boilerplate(tex) + +def create_book_recursive(source_path, dest_path): + """ + Takes: string source_path + string dest_path + Returns: + + Reads all .cook files found in source_path and it's subdirectories. + Creates a new directory at dest_dir if it doesn't exist already. + When a recipe path reads '/source_dir/.../last_dir/recipe.cook', + creates /dest_dir/last_dir/recipe.tex and writes texified recipe to it. + Creates /dest_dir/recipe-book.tex which includes all generated recipe files, + has one chapter per directory and a table of contents. + """ + + try: + os.mkdir(dest_path) + except FileExistsError: + pass + + chapters = {} + + for root, dirs, files in os.walk(source_path): + cook_files = {} + + for name in files: + split_name = os.path.splitext(name) + if split_name[-1] == ".cook": + cook_files[split_name[0]] = os.path.join(root, name) + + if cook_files: + dir_name = os.path.basename(root) + dir_path = os.path.join(dest_path, dir_name) + + chapters[dir_name] = [] + + try: + os.mkdir(dir_path) + except FileExistsError: + pass + + for name in cook_files.keys(): + recipe_path = os.path.join(dir_path, name + ".tex") + chapters[dir_name].append(recipe_path) + + with open(recipe_path, "w") as file: + for line in cook2tex.parse_recipe_from_file(cook_files[name]): + file.write(line + "\n") + + tex = [] + + for chap in chapters.keys(): + tex.append("\\section{" + chap + "}") + for file_name in chapters[chap]: + tex.append("\\input{" + + os.path.relpath(file_name, dest_path) + "}") + + tex.append("\n") + + with open(os.path.join(dest_path, "recipe-book.tex"), "w") as file: + for line in latex_boilerplate(tex): + file.write(line + "\n") + + +def latex_boilerplate(body): + tex = [] + tex.append("\\documentclass{article}") tex.append("\\usepackage{cuisine}") tex.append("\n") tex.append("\\begin{document}") + tex.append("\n") + tex.append("\\tableofcontents") + tex.append("\n") - for path in argv: - tex.append("\n") - tex += cook2tex.parse_recipe_from_file(path) + tex += body tex.append("\n") tex.append("\\end{document}") return tex - - + if __name__ == "__main__": - for line in create_book(sys.argv[1:]): - print(line) + if sys.argv[1] == "-r": + tex = create_book_recursive(sys.argv[2], sys.argv[3]) + else: + for line in create_book(sys.argv[1:]): + print(line) +