##// END OF EJS Templates
fix base64 code in nbformat.v2...
MinRK -
Show More
@@ -16,9 +16,8 b' Authors:'
16 # Imports
16 # Imports
17 #-----------------------------------------------------------------------------
17 #-----------------------------------------------------------------------------
18
18
19 from base64 import encodestring
20 from .nbbase import from_dict
19 from .nbbase import from_dict
21 from .rwbase import NotebookReader, NotebookWriter, base64_decode
20 from .rwbase import NotebookReader, NotebookWriter, restore_bytes
22 import json
21 import json
23
22
24 #-----------------------------------------------------------------------------
23 #-----------------------------------------------------------------------------
@@ -26,9 +25,10 b' import json'
26 #-----------------------------------------------------------------------------
25 #-----------------------------------------------------------------------------
27
26
28 class BytesEncoder(json.JSONEncoder):
27 class BytesEncoder(json.JSONEncoder):
28 """A JSON encoder that accepts b64 (and other *ascii*) bytestrings."""
29 def default(self, obj):
29 def default(self, obj):
30 if isinstance(obj, bytes):
30 if isinstance(obj, bytes):
31 return encodestring(obj).decode('ascii')
31 return obj.decode('ascii')
32 return json.JSONEncoder.default(self, obj)
32 return json.JSONEncoder.default(self, obj)
33
33
34
34
@@ -40,7 +40,7 b' class JSONReader(NotebookReader):'
40 return nb
40 return nb
41
41
42 def to_notebook(self, d, **kwargs):
42 def to_notebook(self, d, **kwargs):
43 return base64_decode(from_dict(d))
43 return restore_bytes(from_dict(d))
44
44
45
45
46 class JSONWriter(NotebookWriter):
46 class JSONWriter(NotebookWriter):
@@ -19,31 +19,67 b' Authors:'
19 from base64 import encodestring, decodestring
19 from base64 import encodestring, decodestring
20 import pprint
20 import pprint
21
21
22 from IPython.utils.py3compat import str_to_bytes
23
22 #-----------------------------------------------------------------------------
24 #-----------------------------------------------------------------------------
23 # Code
25 # Code
24 #-----------------------------------------------------------------------------
26 #-----------------------------------------------------------------------------
25
27
28 def restore_bytes(nb):
29 """Restore bytes of image data from unicode-only formats.
30
31 Base64 encoding is handled elsewhere. Bytes objects in the notebook are
32 always b64-encoded. We DO NOT encode/decode around file formats.
33 """
34 for ws in nb.worksheets:
35 for cell in ws.cells:
36 if cell.cell_type == 'code':
37 for output in cell.outputs:
38 if 'png' in output:
39 output.png = str_to_bytes(output.png, 'ascii')
40 if 'jpeg' in output:
41 output.jpeg = str_to_bytes(output.jpeg, 'ascii')
42 return nb
43
44
45 # b64 encode/decode are never actually used, because all bytes objects in
46 # the notebook are already b64-encoded, and we don't need/want to double-encode
47
26 def base64_decode(nb):
48 def base64_decode(nb):
27 """Base64 encode all bytes objects in the notebook."""
49 """Restore all bytes objects in the notebook from base64-encoded strings.
50
51 Note: This is never used
52 """
28 for ws in nb.worksheets:
53 for ws in nb.worksheets:
29 for cell in ws.cells:
54 for cell in ws.cells:
30 if cell.cell_type == 'code':
55 if cell.cell_type == 'code':
31 if 'png' in cell:
56 for output in cell.outputs:
32 cell.png = bytes(decodestring(cell.png))
57 if 'png' in output:
33 if 'jpeg' in cell:
58 if isinstance(output.png, unicode):
34 cell.jpeg = bytes(decodestring(cell.jpeg))
59 output.png = output.png.encode('ascii')
60 output.png = decodestring(output.png)
61 if 'jpeg' in output:
62 if isinstance(output.jpeg, unicode):
63 output.jpeg = output.jpeg.encode('ascii')
64 output.jpeg = decodestring(output.jpeg)
35 return nb
65 return nb
36
66
37
67
38 def base64_encode(nb):
68 def base64_encode(nb):
39 """Base64 decode all binary objects in the notebook."""
69 """Base64 encode all bytes objects in the notebook.
70
71 These will be b64-encoded unicode strings
72
73 Note: This is never used
74 """
40 for ws in nb.worksheets:
75 for ws in nb.worksheets:
41 for cell in ws.cells:
76 for cell in ws.cells:
42 if cell.cell_type == 'code':
77 if cell.cell_type == 'code':
43 if 'png' in cell:
78 for output in cell.outputs:
44 cell.png = unicode(encodestring(cell.png))
79 if 'png' in output:
45 if 'jpeg' in cell:
80 output.png = encodestring(output.png).decode('ascii')
46 cell.jpeg = unicode(encodestring(cell.jpeg))
81 if 'jpeg' in output:
82 output.jpeg = encodestring(output.jpeg).decode('ascii')
47 return nb
83 return nb
48
84
49
85
@@ -1,10 +1,15 b''
1 import os
2 from base64 import encodestring
3
1 from ..nbbase import (
4 from ..nbbase import (
2 NotebookNode,
5 NotebookNode,
3 new_code_cell, new_text_cell, new_worksheet, new_notebook, new_output,
6 new_code_cell, new_text_cell, new_worksheet, new_notebook, new_output,
4 new_metadata, new_author
7 new_metadata, new_author
5 )
8 )
6
9
7
10 # some random base64-encoded *bytes*
11 png = encodestring(os.urandom(5))
12 jpeg = encodestring(os.urandom(6))
8
13
9 ws = new_worksheet(name='worksheet1')
14 ws = new_worksheet(name='worksheet1')
10
15
@@ -42,8 +47,8 b' ws.cells.append(new_code_cell('
42 output_text=u'<array a>',
47 output_text=u'<array a>',
43 output_html=u'The HTML rep',
48 output_html=u'The HTML rep',
44 output_latex=u'$a$',
49 output_latex=u'$a$',
45 output_png=b'data',
50 output_png=png,
46 output_jpeg=b'data',
51 output_jpeg=jpeg,
47 output_svg=u'<svg>',
52 output_svg=u'<svg>',
48 output_json=u'json data',
53 output_json=u'json data',
49 output_javascript=u'var i=0;',
54 output_javascript=u'var i=0;',
@@ -53,8 +58,8 b' ws.cells.append(new_code_cell('
53 output_text=u'<array a>',
58 output_text=u'<array a>',
54 output_html=u'The HTML rep',
59 output_html=u'The HTML rep',
55 output_latex=u'$a$',
60 output_latex=u'$a$',
56 output_png=b'data',
61 output_png=png,
57 output_jpeg=b'data',
62 output_jpeg=jpeg,
58 output_svg=u'<svg>',
63 output_svg=u'<svg>',
59 output_json=u'json data',
64 output_json=u'json data',
60 output_javascript=u'var i=0;'
65 output_javascript=u'var i=0;'
General Comments 0
You need to be logged in to leave comments. Login now