##// END OF EJS Templates
Created new notebook magic that can export/convert notebooks....
Created new notebook magic that can export/convert notebooks. * %notebook --export foo will export the current IPython history to a file foo.ipynb. * %notebook --format=json foo.ipynb will convert foo.ipynb to foo.json.

File last commit:

r4520:46fc6462
r4520:46fc6462
Show More
nbpy.py
91 lines | 3.0 KiB | text/x-python | PythonLexer
Brian E. Granger
Adding nbformat subpackage.
r4392 """Read and write notebooks as regular .py files."""
Brian E. Granger
Initial draft of more formal notebook format....
r4401 from .rwbase import NotebookReader, NotebookWriter
from .nbbase import new_code_cell, new_worksheet, new_notebook
Brian E. Granger
Adding nbformat subpackage.
r4392
Brian E. Granger
Improvements to file uploaded, mime types and .py reader....
r4493 class PyReaderError(Exception):
pass
Brian E. Granger
Adding nbformat subpackage.
r4392 class PyReader(NotebookReader):
Brian E. Granger
Initial draft of more formal notebook format....
r4401 def reads(self, s, **kwargs):
Brian E. Granger
Full versioning added to nbformat.
r4406 return self.to_notebook(s,**kwargs)
def to_notebook(self, s, **kwargs):
Brian E. Granger
Adding nbformat subpackage.
r4392 lines = s.splitlines()
cells = []
cell_lines = []
Brian E. Granger
Improvements to file uploaded, mime types and .py reader....
r4493 code_cell = False
Brian E. Granger
Adding nbformat subpackage.
r4392 for line in lines:
Brian E. Granger
Created new notebook magic that can export/convert notebooks....
r4520 if line.startswith(u'# <nbformat>'):
pass
elif line.startswith(u'# <codecell>'):
Brian E. Granger
Improvements to file uploaded, mime types and .py reader....
r4493 if code_cell:
raise PyReaderError('Unexpected <codecell>')
Brian E. Granger
Created new notebook magic that can export/convert notebooks....
r4520 # We can't use the ast to split blocks because there can be
# IPython syntax in the files.
# if cell_lines:
# for block in self.split_lines_into_blocks(cell_lines):
# cells.append(new_code_cell(input=block))
Brian E. Granger
Full versioning added to nbformat.
r4406 cell_lines = []
Brian E. Granger
Improvements to file uploaded, mime types and .py reader....
r4493 code_cell = True
Brian E. Granger
Created new notebook magic that can export/convert notebooks....
r4520 elif line.startswith(u'# </codecell>'):
Brian E. Granger
Improvements to file uploaded, mime types and .py reader....
r4493 if not code_cell:
raise PyReaderError('Unexpected </codecell>')
Brian E. Granger
Initial draft of more formal notebook format....
r4401 code = u'\n'.join(cell_lines)
code = code.strip(u'\n')
Brian E. Granger
Adding nbformat subpackage.
r4392 if code:
cells.append(new_code_cell(input=code))
Brian E. Granger
Improvements to file uploaded, mime types and .py reader....
r4493 code_cell = False
Brian E. Granger
Adding nbformat subpackage.
r4392 else:
cell_lines.append(line)
Brian E. Granger
Created new notebook magic that can export/convert notebooks....
r4520 # We can't use the ast to split blocks because there can be
# IPython syntax in the files.
# if cell_lines:
# for block in self.split_lines_into_blocks(cell_lines):
# cells.append(new_code_cell(input=block))
Brian E. Granger
Adding nbformat subpackage.
r4392 ws = new_worksheet(cells=cells)
nb = new_notebook(worksheets=[ws])
return nb
Brian E. Granger
Improvements to file uploaded, mime types and .py reader....
r4493 def split_lines_into_blocks(self, lines):
Brian E. Granger
Created new notebook magic that can export/convert notebooks....
r4520 if len(lines) == 1:
yield lines[0]
raise StopIteration()
Brian E. Granger
Improvements to file uploaded, mime types and .py reader....
r4493 import ast
source = '\n'.join(lines)
code = ast.parse(source)
starts = [x.lineno-1 for x in code.body]
for i in range(len(starts)-1):
yield '\n'.join(lines[starts[i]:starts[i+1]]).strip('\n')
yield '\n'.join(lines[starts[-1]:]).strip('\n')
Brian E. Granger
Adding nbformat subpackage.
r4392
class PyWriter(NotebookWriter):
Brian E. Granger
Initial draft of more formal notebook format....
r4401 def writes(self, nb, **kwargs):
Brian E. Granger
Adding nbformat subpackage.
r4392 lines = []
Brian E. Granger
Full versioning added to nbformat.
r4406 lines.extend(['# <nbformat>2</nbformat>',''])
Brian E. Granger
Initial draft of more formal notebook format....
r4401 for ws in nb.worksheets:
for cell in ws.cells:
if cell.cell_type == 'code':
Brian E. Granger
Massive work on the notebook document format....
r4484 input = cell.get('input')
if input is not None:
lines.extend([u'# <codecell>',u''])
lines.extend(input.splitlines())
lines.extend([u'',u'# </codecell>'])
Brian E. Granger
Full versioning added to nbformat.
r4406 lines.append('')
Brian E. Granger
Initial draft of more formal notebook format....
r4401 return unicode('\n'.join(lines))
Brian E. Granger
Adding nbformat subpackage.
r4392
_reader = PyReader()
_writer = PyWriter()
reads = _reader.reads
read = _reader.read
Brian E. Granger
Full versioning added to nbformat.
r4406 to_notebook = _reader.to_notebook
Brian E. Granger
Adding nbformat subpackage.
r4392 write = _writer.write
writes = _writer.writes
Brian E. Granger
Full versioning added to nbformat.
r4406