diff --git a/make_notebook.py b/make_notebook.py new file mode 100644 index 0000000..a26d2a7 --- /dev/null +++ b/make_notebook.py @@ -0,0 +1,103 @@ +import json +import sys +from os import path + +header_comment = '# %%\n' + +def py2nb(py_str): + # remove leading header comment + if py_str.startswith(header_comment): + py_str = py_str[len(header_comment):] + + cells = [] + chunks = py_str.split('\n\n%s' % header_comment) + + for chunk in chunks: + cell_type = 'code' + new_json = {'metadata':{}} + if chunk.startswith('# !!'): + new_json = json.loads("\n".join([x.strip() for x in chunk.splitlines() if '# !!' in x]).replace('# !!','')) + chunk = "\n".join([x for x in chunk.splitlines() if '# !!' not in x]) + if chunk.startswith("'''"): + chunk = chunk.strip("'\n") + cell_type = 'markdown' + elif chunk.startswith('"""'): + chunk = chunk.strip('"\n') + cell_type = 'markdown' + + cell = { + 'cell_type': cell_type, + 'metadata': new_json['metadata'], + 'source': chunk.splitlines(True), + } + + if cell_type == 'code': + cell.update({'outputs': [], 'execution_count': None}) + + cells.append(cell) + + notebook = { + 'cells': cells, + 'metadata': { + 'anaconda-cloud': {}, + 'accelerator': 'GPU', + 'colab': { + 'collapsed_sections': [ + 'CreditsChTop', + 'TutorialTop', + 'CheckGPU', + 'InstallDeps', + 'DefMidasFns', + 'DefFns', + 'DefSecModel', + 'DefSuperRes', + 'AnimSetTop', + 'ExtraSetTop' + ], + 'machine_shape': 'hm', + 'name': 'Disco Diffusion v5.1 [w/ Turbo]', + 'private_outputs': True, + 'provenance': [], + 'include_colab_link': True + }, + 'kernelspec': { + 'display_name': 'Python 3', + 'language': 'python', + 'name': 'python3' + }, + 'language_info': { + 'codemirror_mode': { + 'name': 'ipython', + 'version': 3 + }, + 'file_extension': '.py', + 'mimetype': 'text/x-python', + 'name': 'python', + 'nbconvert_exporter': 'python', + 'pygments_lexer': 'ipython3', + 'version': '3.6.1' + } + }, + 'nbformat': 4, + 'nbformat_minor': 4 + } + + return notebook + + +def convert(in_file, out_file): + _, in_ext = path.splitext(in_file) + _, out_ext = path.splitext(out_file) + + if in_ext == '.py' and out_ext == '.ipynb': + with open(in_file, 'r', encoding='utf-8') as f: + py_str = f.read() + notebook = py2nb(py_str) + with open(out_file, 'w', encoding='utf-8') as f: + json.dump(notebook, f, indent=2) + + else: + raise(Exception('Extensions must be .ipynb and .py or vice versa')) + + +convert('disco.py', 'Disco_Diffusion.ipynb') diff --git a/make_py.py b/make_py.py new file mode 100644 index 0000000..b952fb0 --- /dev/null +++ b/make_py.py @@ -0,0 +1,48 @@ +import json +import sys +from os import path + +header_comment = '# %%\n' + +def nb2py(notebook): + result = [] + cells = notebook['cells'] + + for cell in cells: + cell_type = cell['cell_type'] + metadata = cell['metadata'] + format_metadata = json.dumps(metadata,indent=2).split("\n") + reformat_metadata = '# !! {"metadata":' + for key in format_metadata: + if key == '{': + reformat_metadata+=f"{key}\n" + elif key == '}': + reformat_metadata+="# !! "+key+"}\n" + else: + reformat_metadata+=f'# !! {key}\n' + + if cell_type == 'markdown': + result.append('%s"""\n%s\n"""'% + (header_comment+reformat_metadata, ''.join(cell['source']))) + + if cell_type == 'code': + result.append("%s%s" % (header_comment+reformat_metadata, ''.join(cell['source']))) + + return '\n\n'.join(result) + +def convert(in_file, out_file): + _, in_ext = path.splitext(in_file) + _, out_ext = path.splitext(out_file) + + if in_ext == '.ipynb' and out_ext == '.py': + with open(in_file, 'r', encoding='utf-8') as f: + notebook = json.load(f) + py_str = nb2py(notebook) + with open(out_file, 'w', encoding='utf-8') as f: + f.write(py_str) + + else: + raise(Exception('Extensions must be .ipynb and .py or vice versa')) + + +convert('Disco_Diffusion.ipynb', 'disco.py')