##// END OF EJS Templates
Relative import (suggested by @MinRK)
Jonathan Frederic -
Show More
@@ -1,199 +1,199 b''
1 1 """The official API for working with notebooks in the current format version.
2 2
3 3 Authors:
4 4
5 5 * Brian Granger
6 6 * Jonathan Frederic
7 7 """
8 8
9 9 #-----------------------------------------------------------------------------
10 10 # Copyright (C) 2008-2011 The IPython Development Team
11 11 #
12 12 # Distributed under the terms of the BSD License. The full license is in
13 13 # the file COPYING, distributed as part of this software.
14 14 #-----------------------------------------------------------------------------
15 15
16 16 #-----------------------------------------------------------------------------
17 17 # Imports
18 18 #-----------------------------------------------------------------------------
19 19
20 20 from __future__ import print_function
21 21
22 22 from xml.etree import ElementTree as ET
23 23 import re
24 24
25 25 from IPython.nbformat.v3 import (
26 26 NotebookNode,
27 27 new_code_cell, new_text_cell, new_notebook, new_output, new_worksheet,
28 28 parse_filename, new_metadata, new_author, new_heading_cell, nbformat,
29 29 nbformat_minor,
30 30 )
31 31
32 import reader
32 import .reader
33 33 from .convert import convert
34 34
35 35 #-----------------------------------------------------------------------------
36 36 # Code
37 37 #-----------------------------------------------------------------------------
38 38
39 39 current_nbformat = nbformat
40 40 current_nbformat_minor = nbformat_minor
41 41
42 42
43 43 class NBFormatError(ValueError):
44 44 pass
45 45
46 46
47 47 def parse_py(s, **kwargs):
48 48 """Parse a string into a (nbformat, string) tuple."""
49 49 nbf = current_nbformat
50 50 nbm = current_nbformat_minor
51 51
52 52 pattern = r'# <nbformat>(?P<nbformat>\d+[\.\d+]*)</nbformat>'
53 53 m = re.search(pattern,s)
54 54 if m is not None:
55 55 digits = m.group('nbformat').split('.')
56 56 nbf = int(digits[0])
57 57 if len(digits) > 1:
58 58 nbm = int(digits[1])
59 59
60 60 return nbf, nbm, s
61 61
62 62
63 63 def reads_json(s, **kwargs):
64 64 """Read a JSON notebook from a string and return the NotebookNode object."""
65 65 return convert(reader.reads(s), current_nbformat)
66 66
67 67
68 68 def writes_json(nb, **kwargs):
69 69 return reader.versions[current_nbformat].writes_json(nb, **kwargs)
70 70
71 71
72 72 def reads_py(s, **kwargs):
73 73 """Read a .py notebook from a string and return the NotebookNode object."""
74 74 nbf, nbm, s = parse_py(s, **kwargs)
75 75 if nbf == 2 or nbf == 3:
76 76 nb = reader.versions[nbf].to_notebook_py(s, **kwargs)
77 77 else:
78 78 raise NBFormatError('Unsupported PY nbformat version: %i' % nbf)
79 79 return nb
80 80
81 81
82 82 def writes_py(nb, **kwargs):
83 83 # nbformat 3 is the latest format that supports py
84 84 return reader.versions[3].writes_py(nb, **kwargs)
85 85
86 86
87 87 # High level API
88 88
89 89
90 90 def reads(s, format, **kwargs):
91 91 """Read a notebook from a string and return the NotebookNode object.
92 92
93 93 This function properly handles notebooks of any version. The notebook
94 94 returned will always be in the current version's format.
95 95
96 96 Parameters
97 97 ----------
98 98 s : unicode
99 99 The raw unicode string to read the notebook from.
100 100 format : (u'json', u'ipynb', u'py')
101 101 The format that the string is in.
102 102
103 103 Returns
104 104 -------
105 105 nb : NotebookNode
106 106 The notebook that was read.
107 107 """
108 108 format = unicode(format)
109 109 if format == u'json' or format == u'ipynb':
110 110 return reads_json(s, **kwargs)
111 111 elif format == u'py':
112 112 return reads_py(s, **kwargs)
113 113 else:
114 114 raise NBFormatError('Unsupported format: %s' % format)
115 115
116 116
117 117 def writes(nb, format, **kwargs):
118 118 """Write a notebook to a string in a given format in the current nbformat version.
119 119
120 120 This function always writes the notebook in the current nbformat version.
121 121
122 122 Parameters
123 123 ----------
124 124 nb : NotebookNode
125 125 The notebook to write.
126 126 format : (u'json', u'ipynb', u'py')
127 127 The format to write the notebook in.
128 128
129 129 Returns
130 130 -------
131 131 s : unicode
132 132 The notebook string.
133 133 """
134 134 format = unicode(format)
135 135 if format == u'json' or format == u'ipynb':
136 136 return writes_json(nb, **kwargs)
137 137 elif format == u'py':
138 138 return writes_py(nb, **kwargs)
139 139 else:
140 140 raise NBFormatError('Unsupported format: %s' % format)
141 141
142 142
143 143 def read(fp, format, **kwargs):
144 144 """Read a notebook from a file and return the NotebookNode object.
145 145
146 146 This function properly handles notebooks of any version. The notebook
147 147 returned will always be in the current version's format.
148 148
149 149 Parameters
150 150 ----------
151 151 fp : file
152 152 Any file-like object with a read method.
153 153 format : (u'json', u'ipynb', u'py')
154 154 The format that the string is in.
155 155
156 156 Returns
157 157 -------
158 158 nb : NotebookNode
159 159 The notebook that was read.
160 160 """
161 161 return reads(fp.read(), format, **kwargs)
162 162
163 163
164 164 def write(nb, fp, format, **kwargs):
165 165 """Write a notebook to a file in a given format in the current nbformat version.
166 166
167 167 This function always writes the notebook in the current nbformat version.
168 168
169 169 Parameters
170 170 ----------
171 171 nb : NotebookNode
172 172 The notebook to write.
173 173 fp : file
174 174 Any file-like object with a write method.
175 175 format : (u'json', u'ipynb', u'py')
176 176 The format to write the notebook in.
177 177
178 178 Returns
179 179 -------
180 180 s : unicode
181 181 The notebook string.
182 182 """
183 183 return fp.write(writes(nb, format, **kwargs))
184 184
185 185 def _convert_to_metadata():
186 186 """Convert to a notebook having notebook metadata."""
187 187 import glob
188 188 for fname in glob.glob('*.ipynb'):
189 189 print('Converting file:',fname)
190 190 with open(fname,'r') as f:
191 191 nb = read(f,u'json')
192 192 md = new_metadata()
193 193 if u'name' in nb:
194 194 md.name = nb.name
195 195 del nb[u'name']
196 196 nb.metadata = md
197 197 with open(fname,'w') as f:
198 198 write(nb, f, u'json')
199 199
General Comments 0
You need to be logged in to leave comments. Login now