|
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") |
|
|