| import os.path, re, nbformat, jupyter_contrib_nbextensions |
| from nbconvert.preprocessors import Preprocessor |
| from nbconvert import HTMLExporter |
| from traitlets.config import Config |
| from pathlib import Path |
|
|
| __all__ = ['read_nb', 'convert_nb', 'convert_all'] |
|
|
| exporter = HTMLExporter(Config()) |
| exporter.exclude_input_prompt=True |
| exporter.exclude_output_prompt=True |
| |
| exporter.template_file = 'jekyll.tpl' |
| path = Path(__file__).parent |
| exporter.template_path.append(str(path)) |
|
|
| def read_nb(fname): |
| "Read the notebook in `fname`." |
| with open(fname,'r') as f: return nbformat.reads(f.read(), as_version=4) |
|
|
| def convert_nb(fname, dest_path='.'): |
| "Convert a notebook `fname` to html file in `dest_path`." |
| from .gen_notebooks import remove_undoc_cells, remove_code_cell_jupyter_widget_state_elem |
| nb = read_nb(fname) |
| nb['cells'] = remove_undoc_cells(nb['cells']) |
| nb['cells'] = remove_code_cell_jupyter_widget_state_elem(nb['cells']) |
| fname = Path(fname).absolute() |
| dest_name = fname.with_suffix('.html').name |
| meta = nb['metadata'] |
| meta_jekyll = meta['jekyll'] if 'jekyll' in meta else {'title': fname.with_suffix('').name} |
| meta_jekyll['nb_path'] = f'{fname.parent.name}/{fname.name}' |
| with open(f'{dest_path}/{dest_name}','w') as f: |
| f.write(exporter.from_notebook_node(nb, resources=meta_jekyll)[0]) |
|
|
| def convert_all(folder, dest_path='.', force_all=False): |
| "Convert modified notebooks in `folder` to html pages in `dest_path`." |
| path = Path(folder) |
|
|
| changed_cnt = 0 |
| for fname in path.glob("*.ipynb"): |
| |
| fname_out = Path(dest_path)/fname.with_suffix('.html').name |
| if not force_all and fname_out.exists(): |
| in_mod = os.path.getmtime(fname) |
| out_mod = os.path.getmtime(fname_out) |
| if in_mod < out_mod: continue |
|
|
| print(f"converting: {fname} => {fname_out}") |
| changed_cnt += 1 |
| convert_nb(fname, dest_path=dest_path) |
| if not changed_cnt: print("No notebooks were modified") |
|
|