convert.py
72 lines
| 2.7 KiB
| text/x-python
|
PythonLexer
Jonathan Frederic
|
r12490 | """API for converting notebooks between versions. | ||
Authors: | ||||
* Jonathan Frederic | ||||
""" | ||||
#----------------------------------------------------------------------------- | ||||
Jonathan Frederic
|
r12493 | # Copyright (C) 2013 The IPython Development Team | ||
Jonathan Frederic
|
r12490 | # | ||
# Distributed under the terms of the BSD License. The full license is in | ||||
# the file COPYING, distributed as part of this software. | ||||
#----------------------------------------------------------------------------- | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
import re | ||||
Jonathan Frederic
|
r12493 | from .reader import get_version, versions | ||
Jonathan Frederic
|
r12490 | |||
#----------------------------------------------------------------------------- | ||||
# Functions | ||||
#----------------------------------------------------------------------------- | ||||
Jonathan Frederic
|
r12493 | def convert(nb, to_version): | ||
"""Convert a notebook node object to a specific version. Assumes that | ||||
all the versions starting from 1 to the latest major X are implemented. | ||||
In other words, there should never be a case where v1 v2 v3 v5 exist without | ||||
a v4. Also assumes that all conversions can be made in one step increments | ||||
between major versions and ignores minor revisions. | ||||
Thomas Kluyver
|
r13587 | Parameters | ||
---------- | ||||
Jonathan Frederic
|
r12493 | nb : NotebookNode | ||
to_version : int | ||||
Major revision to convert the notebook to. Can either be an upgrade or | ||||
a downgrade. | ||||
""" | ||||
Jonathan Frederic
|
r12490 | |||
# Get input notebook version. | ||||
Jonathan Frederic
|
r12493 | (version, version_minor) = get_version(nb) | ||
Jonathan Frederic
|
r12490 | |||
# Check if destination is current version, if so return contents | ||||
Jonathan Frederic
|
r12493 | if version == to_version: | ||
Jonathan Frederic
|
r12490 | return nb | ||
Jonathan Frederic
|
r12493 | # If the version exist, try to convert to it one step at a time. | ||
Jonathan Frederic
|
r12781 | elif to_version in versions: | ||
Jonathan Frederic
|
r12493 | |||
# Get the the version that this recursion will convert to as a step | ||||
# closer to the final revision. Make sure the newer of the conversion | ||||
# functions is used to perform the conversion. | ||||
if to_version > version: | ||||
step_version = version + 1 | ||||
convert_function = versions[step_version].upgrade | ||||
Jonathan Frederic
|
r12490 | else: | ||
Jonathan Frederic
|
r12493 | step_version = version - 1 | ||
convert_function = versions[version].downgrade | ||||
# Convert and make sure version changed during conversion. | ||||
Jonathan Frederic
|
r12787 | converted = convert_function(nb) | ||
Jonathan Frederic
|
r12493 | if converted.get('nbformat', 1) == version: | ||
raise Exception("Cannot convert notebook from v%d to v%d. Operation" \ | ||||
"failed silently." % (major, step_version)) | ||||
Jonathan Frederic
|
r12490 | |||
Jonathan Frederic
|
r12921 | # Recursively convert until target version is reached. | ||
Jonathan Frederic
|
r12493 | return convert(converted, to_version) | ||
Jonathan Frederic
|
r12490 | else: | ||
Jonathan Frederic
|
r12493 | raise Exception("Cannot convert notebook to v%d because that " \ | ||
"version doesn't exist" % (to_version)) | ||||