Show More
1 | NO CONTENT: new file 100644 |
|
NO CONTENT: new file 100644 |
@@ -0,0 +1,45 b'' | |||||
|
1 | from base64 import encodestring, decodestring | |||
|
2 | ||||
|
3 | ||||
|
4 | def base64_decode(self, nb): | |||
|
5 | """Base64 encode all bytes objects in the notebook.""" | |||
|
6 | for ws in nb['worksheets']: | |||
|
7 | for cell in ws['cells']: | |||
|
8 | if cell['cell_type'] == 'code': | |||
|
9 | if cell.get('image/png',''): | |||
|
10 | cell['image/png'] = bytes(decodestring(cell['image/png'])) | |||
|
11 | return nb | |||
|
12 | ||||
|
13 | ||||
|
14 | def base64_encode(self, nb): | |||
|
15 | """Base64 decode all binary objects in the notebook.""" | |||
|
16 | for ws in nb['worksheets']: | |||
|
17 | for cell in ws['cells']: | |||
|
18 | if cell['cell_type'] == 'code': | |||
|
19 | if cell.get('image/png',''): | |||
|
20 | cell['image/png'] = unicode(encodestring(cell['image/png'])) | |||
|
21 | return nb | |||
|
22 | ||||
|
23 | ||||
|
24 | class NotebookReader(object): | |||
|
25 | ||||
|
26 | def reads(self, s, **kwargs): | |||
|
27 | """Read a notebook from a string.""" | |||
|
28 | raise NotImplementedError("loads must be implemented in a subclass") | |||
|
29 | ||||
|
30 | def read(self, fp, **kwargs): | |||
|
31 | """Read a notebook from a file like object""" | |||
|
32 | return self.loads(fp.read(), **kwargs) | |||
|
33 | ||||
|
34 | ||||
|
35 | class NotebookWriter(object): | |||
|
36 | ||||
|
37 | def writes(self, nb, **kwargs): | |||
|
38 | """Write a notebook to a string.""" | |||
|
39 | raise NotImplementedError("loads must be implemented in a subclass") | |||
|
40 | ||||
|
41 | def write(self, nb, fp, **kwargs): | |||
|
42 | """Write a notebook to a file like object""" | |||
|
43 | return fp.write(self.dumps(nb,**kwargs)) | |||
|
44 | ||||
|
45 |
@@ -0,0 +1,76 b'' | |||||
|
1 | """The basic dict based notebook format.""" | |||
|
2 | ||||
|
3 | import uuid | |||
|
4 | ||||
|
5 | ||||
|
6 | def new_code_cell(input=None, prompt_number=None, output_text=None, output_png=None, | |||
|
7 | output_html=None, output_svg=None, output_latex=None, output_json=None, | |||
|
8 | output_javascript=None): | |||
|
9 | """Create a new code cell with input and output""" | |||
|
10 | cell = {} | |||
|
11 | cell['cell_type'] = 'code' | |||
|
12 | if input is not None: | |||
|
13 | cell['input'] = unicode(input) | |||
|
14 | if prompt_number is not None: | |||
|
15 | cell['prompt_number'] = int(prompt_number) | |||
|
16 | ||||
|
17 | output = {} | |||
|
18 | if output_text is not None: | |||
|
19 | output['text/plain'] = unicode(output_text) | |||
|
20 | if output_png is not None: | |||
|
21 | output['image/png'] = bytes(output_png) | |||
|
22 | if output_html is not None: | |||
|
23 | output['text/html'] = unicode(output_html) | |||
|
24 | if output_svg is not None: | |||
|
25 | output['image/svg+xml'] = unicode(output_svg) | |||
|
26 | if output_latex is not None: | |||
|
27 | output['text/latex'] = unicode(output_latex) | |||
|
28 | if output_json is not None: | |||
|
29 | output['application/json'] = unicode(output_json) | |||
|
30 | if output_javascript is not None: | |||
|
31 | output['application/javascript'] = unicode(output_javascript) | |||
|
32 | ||||
|
33 | cell['output'] = output | |||
|
34 | return cell | |||
|
35 | ||||
|
36 | ||||
|
37 | def new_text_cell(text=None): | |||
|
38 | """Create a new text cell.""" | |||
|
39 | cell = {} | |||
|
40 | if text is not None: | |||
|
41 | cell['text'] = unicode(text) | |||
|
42 | cell['cell_type'] = 'text' | |||
|
43 | return cell | |||
|
44 | ||||
|
45 | ||||
|
46 | def new_worksheet(name=None, cells=None): | |||
|
47 | """Create a worksheet by name with with a list of cells.""" | |||
|
48 | ws = {} | |||
|
49 | if name is not None: | |||
|
50 | ws['name'] = unicode(name) | |||
|
51 | else: | |||
|
52 | ws['name'] = u'' | |||
|
53 | if cells is None: | |||
|
54 | ws['cells'] = [] | |||
|
55 | else: | |||
|
56 | ws['cells'] = list(cells) | |||
|
57 | return ws | |||
|
58 | ||||
|
59 | ||||
|
60 | def new_notebook(name=None, id=None, worksheets=None): | |||
|
61 | """Create a notebook by name, id and a list of worksheets.""" | |||
|
62 | nb = {} | |||
|
63 | if name is not None: | |||
|
64 | nb['name'] = unicode(name) | |||
|
65 | else: | |||
|
66 | nb['name'] = u'' | |||
|
67 | if id is None: | |||
|
68 | nb['id'] = unicode(uuid.uuid4()) | |||
|
69 | else: | |||
|
70 | nb['id'] = unicode(id) | |||
|
71 | if worksheets is None: | |||
|
72 | nb['worksheets'] = [] | |||
|
73 | else: | |||
|
74 | nb['worksheets'] = list(worksheets) | |||
|
75 | return nb | |||
|
76 |
@@ -0,0 +1,38 b'' | |||||
|
1 | """Read and write notebooks in JSON format.""" | |||
|
2 | ||||
|
3 | from base64 import encodestring | |||
|
4 | from .base import NotebookReader, NotebookWriter, base64_decode | |||
|
5 | import json | |||
|
6 | ||||
|
7 | ||||
|
8 | class BytesEncoder(json.JSONEncoder): | |||
|
9 | def default(self, obj): | |||
|
10 | if isinstance(obj, bytes): | |||
|
11 | return unicode(encodestring(bytes)) | |||
|
12 | return json.JSONEncoder.default(self, obj) | |||
|
13 | ||||
|
14 | ||||
|
15 | class JSONReader(NotebookReader): | |||
|
16 | ||||
|
17 | def reads(s, **kwargs): | |||
|
18 | nb = json.loads(s, **kwargs) | |||
|
19 | nb = base64_decode(nb) | |||
|
20 | return nb | |||
|
21 | ||||
|
22 | ||||
|
23 | class JSONWriter(NotebookWriter): | |||
|
24 | ||||
|
25 | def writes(nb, **kwargs): | |||
|
26 | kwargs['cls'] = BytesEncoder | |||
|
27 | kwargs['indent'] = 4 | |||
|
28 | return json.dumps(nb, **kwargs) | |||
|
29 | ||||
|
30 | ||||
|
31 | _reader = JSONReader() | |||
|
32 | _writer = JSONWriter() | |||
|
33 | ||||
|
34 | reads = _reader.reads | |||
|
35 | read = _reader.read | |||
|
36 | write = _writer.write | |||
|
37 | writes = _writer.writes | |||
|
38 |
@@ -0,0 +1,46 b'' | |||||
|
1 | """Read and write notebooks as regular .py files.""" | |||
|
2 | ||||
|
3 | from .base import NotebookReader, NotebookWriter | |||
|
4 | from .nbdict import new_code_cell, new_worksheet, new_notebook | |||
|
5 | ||||
|
6 | ||||
|
7 | class PyReader(NotebookReader): | |||
|
8 | ||||
|
9 | def reads(s, **kwargs): | |||
|
10 | lines = s.splitlines() | |||
|
11 | cells = [] | |||
|
12 | cell_lines = [] | |||
|
13 | for line in lines: | |||
|
14 | if line.startswith('# <codecell>'): | |||
|
15 | code = '\n'.join(cell_lines) | |||
|
16 | code = code.strip('\n') | |||
|
17 | if code: | |||
|
18 | cells.append(new_code_cell(input=code)) | |||
|
19 | cell_lines = [] | |||
|
20 | else: | |||
|
21 | cell_lines.append(line) | |||
|
22 | ws = new_worksheet(cells=cells) | |||
|
23 | nb = new_notebook(worksheets=[ws]) | |||
|
24 | return nb | |||
|
25 | ||||
|
26 | ||||
|
27 | class PyWriter(NotebookWriter): | |||
|
28 | ||||
|
29 | def writes(nb, **kwargs): | |||
|
30 | lines = [] | |||
|
31 | for ws in nb['worksheets']: | |||
|
32 | for cell in ws['cells']: | |||
|
33 | if cell['cell_type'] == 'code': | |||
|
34 | input = cell['input'] | |||
|
35 | lines.extend(input.splitlines()) | |||
|
36 | lines.extend(['','# <codecell>','']) | |||
|
37 | return ''.join(lines) | |||
|
38 | ||||
|
39 | ||||
|
40 | _reader = PyReader() | |||
|
41 | _writer = PyWriter() | |||
|
42 | ||||
|
43 | reads = _reader.reads | |||
|
44 | read = _reader.read | |||
|
45 | write = _writer.write | |||
|
46 | writes = _writer.writes |
@@ -0,0 +1,48 b'' | |||||
|
1 | """Read and write notebook files as XML.""" | |||
|
2 | ||||
|
3 | from xml.etree import ElementTree as ET | |||
|
4 | ||||
|
5 | from .base import NotebookReader, NotebookWriter | |||
|
6 | from .nbdict import new_code_cell, new_worksheet, new_notebook | |||
|
7 | ||||
|
8 | ||||
|
9 | class XMLReader(NotebookReader): | |||
|
10 | ||||
|
11 | def reads(s, **kwargs): | |||
|
12 | pass | |||
|
13 | ||||
|
14 | ||||
|
15 | class XMLWriter(NotebookWriter): | |||
|
16 | ||||
|
17 | def writes(nb, **kwargs): | |||
|
18 | nb_e = ET.Element('notebook') | |||
|
19 | name_e = ET.SubElement(nb_e, 'name') | |||
|
20 | name_e.text = nb.get('name','') | |||
|
21 | id_e = ET.SubElement(nb_e, 'id') | |||
|
22 | id_e.text = nb.get('id','') | |||
|
23 | for ws in nb['worksheets']: | |||
|
24 | ws_e = ET.SubElement(nb_e, 'worksheet') | |||
|
25 | ws_name_e = ET.SubElement(ws_e, 'name') | |||
|
26 | ws_name_e.text = ws.get('name','') | |||
|
27 | for cell in ws['cells']: | |||
|
28 | cell_type = cell['cell_type'] | |||
|
29 | if cell_type == 'code': | |||
|
30 | output = cell['output'] | |||
|
31 | cell_e = ET.SubElement(ws_e, 'cell') | |||
|
32 | input_e = ET.SubElement(cell_e, 'input') | |||
|
33 | input_e.text = cell.get('input','') | |||
|
34 | output_e = ET.SubElement(cell_e, 'output') | |||
|
35 | text_e = ET.SubElement(output_e, 'text') | |||
|
36 | text_e.text = cell.output | |||
|
37 | elif cell_type == 'text': | |||
|
38 | pass | |||
|
39 | ||||
|
40 | ||||
|
41 | ||||
|
42 | _reader = XMLReader() | |||
|
43 | _writer = XMLWriter() | |||
|
44 | ||||
|
45 | reads = _reader.reads | |||
|
46 | read = _reader.read | |||
|
47 | write = _writer.write | |||
|
48 | writes = _writer.writes |
General Comments 0
You need to be logged in to leave comments.
Login now