convert.py
90 lines
| 2.6 KiB
| text/x-python
|
PythonLexer
MinRK
|
r18254 | """Code for converting notebooks to and from the v2 format.""" | |
Brian E. Granger
|
r4609 | ||
MinRK
|
r18254 | # Copyright (c) IPython Development Team. | |
# Distributed under the terms of the Modified BSD License. | |||
Brian E. Granger
|
r4609 | ||
Brian E. Granger
|
r4406 | from .nbbase import ( | |
MinRK
|
r7545 | new_code_cell, new_text_cell, new_worksheet, new_notebook, new_output, | |
nbformat, nbformat_minor | |||
Brian E. Granger
|
r4406 | ) | |
Brian Granger
|
r6026 | from IPython.nbformat import v2 | |
MinRK
|
r18254 | def _unbytes(obj): | |
"""There should be no bytes objects in a notebook | |||
v2 stores png/jpeg as b64 ascii bytes | |||
""" | |||
if isinstance(obj, dict): | |||
for k,v in obj.items(): | |||
obj[k] = _unbytes(v) | |||
elif isinstance(obj, list): | |||
for i,v in enumerate(obj): | |||
obj[i] = _unbytes(v) | |||
elif isinstance(obj, bytes): | |||
# only valid bytes are b64-encoded ascii | |||
obj = obj.decode('ascii') | |||
return obj | |||
Brian E. Granger
|
r4609 | ||
Jonathan Frederic
|
r12493 | def upgrade(nb, from_version=2, from_minor=0): | |
"""Convert a notebook to v3. | |||
Brian E. Granger
|
r4609 | ||
Parameters | |||
---------- | |||
nb : NotebookNode | |||
The Python representation of the notebook to convert. | |||
Jonathan Frederic
|
r12493 | from_version : int | |
Brian E. Granger
|
r4609 | The original version of the notebook to convert. | |
Jonathan Frederic
|
r12493 | from_minor : int | |
MinRK
|
r7545 | The original minor version of the notebook to convert (only relevant for v >= 3). | |
Brian E. Granger
|
r4609 | """ | |
Jonathan Frederic
|
r12493 | if from_version == 2: | |
Brian Granger
|
r6061 | # Mark the original nbformat so consumers know it has been converted. | |
MinRK
|
r7545 | nb.nbformat = nbformat | |
nb.nbformat_minor = nbformat_minor | |||
Brian Granger
|
r6061 | nb.orig_nbformat = 2 | |
MinRK
|
r18254 | nb = _unbytes(nb) | |
MinRK
|
r18258 | for ws in nb['worksheets']: | |
for cell in ws['cells']: | |||
cell.setdefault('metadata', {}) | |||
Brian Granger
|
r6026 | return nb | |
Jonathan Frederic
|
r12493 | elif from_version == 3: | |
if from_minor != nbformat_minor: | |||
nb.orig_nbformat_minor = from_minor | |||
MinRK
|
r7545 | nb.nbformat_minor = nbformat_minor | |
Brian Granger
|
r6026 | return nb | |
Brian E. Granger
|
r4406 | else: | |
Jonathan Frederic
|
r12493 | raise ValueError('Cannot convert a notebook directly from v%s to v3. ' \ | |
'Try using the IPython.nbformat.convert module.' % from_version) | |||
Brian E. Granger
|
r4406 | ||
Jonathan Frederic
|
r12493 | def heading_to_md(cell): | |
"""turn heading cell into corresponding markdown""" | |||
cell.cell_type = "markdown" | |||
level = cell.pop('level', 1) | |||
cell.source = '#'*level + ' ' + cell.source | |||
def raw_to_md(cell): | |||
"""let raw passthrough as markdown""" | |||
cell.cell_type = "markdown" | |||
def downgrade(nb): | |||
"""Convert a v3 notebook to v2. | |||
Parameters | |||
---------- | |||
nb : NotebookNode | |||
The Python representation of the notebook to convert. | |||
""" | |||
if nb.nbformat != 3: | |||
return nb | |||
nb.nbformat = 2 | |||
for ws in nb.worksheets: | |||
for cell in ws.cells: | |||
if cell.cell_type == 'heading': | |||
heading_to_md(cell) | |||
elif cell.cell_type == 'raw': | |||
raw_to_md(cell) | |||
return nb |