Path: blob/master/internal/book2/handle_book2_jslcode.py
1192 views
import os1import argparse2import nbformat as nbf3from probml_utils.nb_utils import get_ipynb_from_code45parser = argparse.ArgumentParser(description="Handle book2 pycode")6parser.add_argument("-bookgen", "--bookgen", type=int, choices=[0, 1], default=0, help="")7args = parser.parse_args()89# configs10macro = r"\newcommand{\jslcode}[1]{\href{https://github.com/probml/JSL/blob/main/jsl/demos/#1.py}{#1.py}}"11replaced_macro = r"\newcommand{\jslcode}[1]{\href{https://github.com/probml/JSL/blob/main/jsl/demos/#1.py}{sssssjsl\twodigits{\thechapter}/#1.pyeeeeejsl}}"12base_jsl_url = "https://github.com/probml/JSL/blob/main/jsl/demos"1314book_root = "../bookv2"15bookname = "book2"1617if args.bookgen:18# replace the macro19with open(os.path.join(book_root, "macros.tex"), "r") as f:20content = f.read()21with open(os.path.join(book_root, "macros.tex"), "w") as f:22f.write(content.replace(macro, replaced_macro))2324# generate the book25pdflatex_cmd = f"pdflatex --interaction=nonstopmode {bookname}"26bibtex_cmd = f"bibtex {bookname}"27os.system(28f"cd {book_root}/{bookname}; {pdflatex_cmd}; {bibtex_cmd}; {pdflatex_cmd}; mv {bookname}.pdf {bookname}_jslcode.pdf"29)3031# restore the macro32with open(os.path.join(book_root, "macros.tex"), "r") as f:33content = f.read()34with open(os.path.join(book_root, "macros.tex"), "w") as f:35f.write(content.replace(replaced_macro, macro))3637# read the book38import fitz3940with fitz.open(os.path.join(book_root, bookname, f"{bookname}_jslcode.pdf")) as doc:41text = ""42for page in doc:43text += page.get_text() + ""44text_one_line = text.replace("\n", "")4546# solve some glitches47glitch_dict = {"fi": "fi", "ff": "ff", "fl": "fl"}48for glitch, fix in glitch_dict.items():49text_one_line = text_one_line.replace(glitch, fix)5051# parse script names52import re5354all_scripts = set(re.findall("sssssjsl(.*?)eeeeejsl", text_one_line))55# print(all_scripts)5657# start redirecting the scripts58for chap_script in all_scripts:59chap, script = chap_script.split("/")60try:61redirect = f"Source of this notebook is here: {base_jsl_url}/{script}"62nb = nbf.v4.new_notebook()63nb["cells"] = [nbf.v4.new_markdown_cell(redirect)]64save_path = f"notebooks/book2/{chap}/{script.replace('.py', '.ipynb')}"65save_dir = os.path.dirname(save_path)66# assert not os.path.exists(save_path)67if not os.path.exists(save_dir):68os.makedirs(save_dir)69with open(save_path, "w") as f:70nbf.write(nb, f)71print("done", chap, script)72except Exception as e:73print(e, chap, script)747576