##// END OF EJS Templates
Pager is not activated if the pager text is empty....
Brian E. Granger -
Show More
@@ -1,813 +1,815 b''
1
1
2 //============================================================================
2 //============================================================================
3 // Notebook
3 // Notebook
4 //============================================================================
4 //============================================================================
5
5
6 var IPython = (function (IPython) {
6 var IPython = (function (IPython) {
7
7
8 var utils = IPython.utils;
8 var utils = IPython.utils;
9
9
10 var Notebook = function (selector) {
10 var Notebook = function (selector) {
11 this.element = $(selector);
11 this.element = $(selector);
12 this.element.scroll();
12 this.element.scroll();
13 this.element.data("notebook", this);
13 this.element.data("notebook", this);
14 this.next_prompt_number = 1;
14 this.next_prompt_number = 1;
15 this.kernel = null;
15 this.kernel = null;
16 this.dirty = false;
16 this.dirty = false;
17 this.msg_cell_map = {};
17 this.msg_cell_map = {};
18 this.style();
18 this.style();
19 this.create_elements();
19 this.create_elements();
20 this.bind_events();
20 this.bind_events();
21 };
21 };
22
22
23
23
24 Notebook.prototype.style = function () {
24 Notebook.prototype.style = function () {
25 $('div#notebook').addClass('border-box-sizing');
25 $('div#notebook').addClass('border-box-sizing');
26 };
26 };
27
27
28
28
29 Notebook.prototype.create_elements = function () {
29 Notebook.prototype.create_elements = function () {
30 // We add this end_space div to the end of the notebook div to:
30 // We add this end_space div to the end of the notebook div to:
31 // i) provide a margin between the last cell and the end of the notebook
31 // i) provide a margin between the last cell and the end of the notebook
32 // ii) to prevent the div from scrolling up when the last cell is being
32 // ii) to prevent the div from scrolling up when the last cell is being
33 // edited, but is too low on the page, which browsers will do automatically.
33 // edited, but is too low on the page, which browsers will do automatically.
34 this.element.append($('<div class="end_space"></div>').height(150));
34 this.element.append($('<div class="end_space"></div>').height(150));
35 $('div#notebook').addClass('border-box-sizing');
35 $('div#notebook').addClass('border-box-sizing');
36 };
36 };
37
37
38
38
39 Notebook.prototype.bind_events = function () {
39 Notebook.prototype.bind_events = function () {
40 var that = this;
40 var that = this;
41 $(document).keydown(function (event) {
41 $(document).keydown(function (event) {
42 // console.log(event);
42 // console.log(event);
43 if (event.which === 38) {
43 if (event.which === 38) {
44 var cell = that.selected_cell();
44 var cell = that.selected_cell();
45 if (cell.at_top()) {
45 if (cell.at_top()) {
46 event.preventDefault();
46 event.preventDefault();
47 that.select_prev();
47 that.select_prev();
48 };
48 };
49 } else if (event.which === 40) {
49 } else if (event.which === 40) {
50 var cell = that.selected_cell();
50 var cell = that.selected_cell();
51 if (cell.at_bottom()) {
51 if (cell.at_bottom()) {
52 event.preventDefault();
52 event.preventDefault();
53 that.select_next();
53 that.select_next();
54 };
54 };
55 } else if (event.which === 13 && event.shiftKey) {
55 } else if (event.which === 13 && event.shiftKey) {
56 that.execute_selected_cell();
56 that.execute_selected_cell();
57 return false;
57 return false;
58 } else if (event.which === 13 && event.ctrlKey) {
58 } else if (event.which === 13 && event.ctrlKey) {
59 that.execute_selected_cell({terminal:true});
59 that.execute_selected_cell({terminal:true});
60 return false;
60 return false;
61 };
61 };
62 });
62 });
63
63
64 this.element.bind('collapse_pager', function () {
64 this.element.bind('collapse_pager', function () {
65 var app_height = $('div#main_app').height(); // content height
65 var app_height = $('div#main_app').height(); // content height
66 var splitter_height = $('div#pager_splitter').outerHeight(true);
66 var splitter_height = $('div#pager_splitter').outerHeight(true);
67 var new_height = app_height - splitter_height;
67 var new_height = app_height - splitter_height;
68 that.element.animate({height : new_height + 'px'}, 'fast');
68 that.element.animate({height : new_height + 'px'}, 'fast');
69 });
69 });
70
70
71 this.element.bind('expand_pager', function () {
71 this.element.bind('expand_pager', function () {
72 var app_height = $('div#main_app').height(); // content height
72 var app_height = $('div#main_app').height(); // content height
73 var splitter_height = $('div#pager_splitter').outerHeight(true);
73 var splitter_height = $('div#pager_splitter').outerHeight(true);
74 var pager_height = $('div#pager').outerHeight(true);
74 var pager_height = $('div#pager').outerHeight(true);
75 var new_height = app_height - pager_height - splitter_height;
75 var new_height = app_height - pager_height - splitter_height;
76 that.element.animate({height : new_height + 'px'}, 'fast');
76 that.element.animate({height : new_height + 'px'}, 'fast');
77 });
77 });
78
78
79 this.element.bind('collapse_left_panel', function () {
79 this.element.bind('collapse_left_panel', function () {
80 var splitter_width = $('div#left_panel_splitter').outerWidth(true);
80 var splitter_width = $('div#left_panel_splitter').outerWidth(true);
81 var new_margin = splitter_width;
81 var new_margin = splitter_width;
82 $('div#notebook_panel').animate({marginLeft : new_margin + 'px'}, 'fast');
82 $('div#notebook_panel').animate({marginLeft : new_margin + 'px'}, 'fast');
83 });
83 });
84
84
85 this.element.bind('expand_left_panel', function () {
85 this.element.bind('expand_left_panel', function () {
86 var splitter_width = $('div#left_panel_splitter').outerWidth(true);
86 var splitter_width = $('div#left_panel_splitter').outerWidth(true);
87 var left_panel_width = IPython.left_panel.width;
87 var left_panel_width = IPython.left_panel.width;
88 var new_margin = splitter_width + left_panel_width;
88 var new_margin = splitter_width + left_panel_width;
89 $('div#notebook_panel').animate({marginLeft : new_margin + 'px'}, 'fast');
89 $('div#notebook_panel').animate({marginLeft : new_margin + 'px'}, 'fast');
90 });
90 });
91
91
92 $(window).bind('beforeunload', function () {
92 $(window).bind('beforeunload', function () {
93 var kill_kernel = $('#kill_kernel').prop('checked');
93 var kill_kernel = $('#kill_kernel').prop('checked');
94 if (kill_kernel) {
94 if (kill_kernel) {
95 that.kernel.kill();
95 that.kernel.kill();
96 }
96 }
97 if (that.dirty) {
97 if (that.dirty) {
98 return "You have unsaved changes that will be lost if you leave this page.";
98 return "You have unsaved changes that will be lost if you leave this page.";
99 };
99 };
100 });
100 });
101 };
101 };
102
102
103
103
104 Notebook.prototype.scroll_to_bottom = function () {
104 Notebook.prototype.scroll_to_bottom = function () {
105 this.element.animate({scrollTop:this.element.get(0).scrollHeight}, 0);
105 this.element.animate({scrollTop:this.element.get(0).scrollHeight}, 0);
106 };
106 };
107
107
108
108
109 Notebook.prototype.scroll_to_top = function () {
109 Notebook.prototype.scroll_to_top = function () {
110 this.element.animate({scrollTop:0}, 0);
110 this.element.animate({scrollTop:0}, 0);
111 };
111 };
112
112
113
113
114 // Cell indexing, retrieval, etc.
114 // Cell indexing, retrieval, etc.
115
115
116
116
117 Notebook.prototype.cell_elements = function () {
117 Notebook.prototype.cell_elements = function () {
118 return this.element.children("div.cell");
118 return this.element.children("div.cell");
119 }
119 }
120
120
121
121
122 Notebook.prototype.ncells = function (cell) {
122 Notebook.prototype.ncells = function (cell) {
123 return this.cell_elements().length;
123 return this.cell_elements().length;
124 }
124 }
125
125
126
126
127 // TODO: we are often calling cells as cells()[i], which we should optimize
127 // TODO: we are often calling cells as cells()[i], which we should optimize
128 // to cells(i) or a new method.
128 // to cells(i) or a new method.
129 Notebook.prototype.cells = function () {
129 Notebook.prototype.cells = function () {
130 return this.cell_elements().toArray().map(function (e) {
130 return this.cell_elements().toArray().map(function (e) {
131 return $(e).data("cell");
131 return $(e).data("cell");
132 });
132 });
133 }
133 }
134
134
135
135
136 Notebook.prototype.find_cell_index = function (cell) {
136 Notebook.prototype.find_cell_index = function (cell) {
137 var result = null;
137 var result = null;
138 this.cell_elements().filter(function (index) {
138 this.cell_elements().filter(function (index) {
139 if ($(this).data("cell") === cell) {
139 if ($(this).data("cell") === cell) {
140 result = index;
140 result = index;
141 };
141 };
142 });
142 });
143 return result;
143 return result;
144 };
144 };
145
145
146
146
147 Notebook.prototype.index_or_selected = function (index) {
147 Notebook.prototype.index_or_selected = function (index) {
148 return index || this.selected_index() || 0;
148 return index || this.selected_index() || 0;
149 }
149 }
150
150
151
151
152 Notebook.prototype.select = function (index) {
152 Notebook.prototype.select = function (index) {
153 if (index !== undefined && index >= 0 && index < this.ncells()) {
153 if (index !== undefined && index >= 0 && index < this.ncells()) {
154 if (this.selected_index() !== null) {
154 if (this.selected_index() !== null) {
155 this.selected_cell().unselect();
155 this.selected_cell().unselect();
156 };
156 };
157 this.cells()[index].select();
157 this.cells()[index].select();
158 if (index === (this.ncells()-1)) {
158 if (index === (this.ncells()-1)) {
159 this.scroll_to_bottom();
159 this.scroll_to_bottom();
160 };
160 };
161 };
161 };
162 return this;
162 return this;
163 };
163 };
164
164
165
165
166 Notebook.prototype.select_next = function () {
166 Notebook.prototype.select_next = function () {
167 var index = this.selected_index();
167 var index = this.selected_index();
168 if (index !== null && index >= 0 && (index+1) < this.ncells()) {
168 if (index !== null && index >= 0 && (index+1) < this.ncells()) {
169 this.select(index+1);
169 this.select(index+1);
170 };
170 };
171 return this;
171 return this;
172 };
172 };
173
173
174
174
175 Notebook.prototype.select_prev = function () {
175 Notebook.prototype.select_prev = function () {
176 var index = this.selected_index();
176 var index = this.selected_index();
177 if (index !== null && index >= 0 && (index-1) < this.ncells()) {
177 if (index !== null && index >= 0 && (index-1) < this.ncells()) {
178 this.select(index-1);
178 this.select(index-1);
179 };
179 };
180 return this;
180 return this;
181 };
181 };
182
182
183
183
184 Notebook.prototype.selected_index = function () {
184 Notebook.prototype.selected_index = function () {
185 var result = null;
185 var result = null;
186 this.cell_elements().filter(function (index) {
186 this.cell_elements().filter(function (index) {
187 if ($(this).data("cell").selected === true) {
187 if ($(this).data("cell").selected === true) {
188 result = index;
188 result = index;
189 };
189 };
190 });
190 });
191 return result;
191 return result;
192 };
192 };
193
193
194
194
195 Notebook.prototype.cell_for_msg = function (msg_id) {
195 Notebook.prototype.cell_for_msg = function (msg_id) {
196 var cell_id = this.msg_cell_map[msg_id];
196 var cell_id = this.msg_cell_map[msg_id];
197 var result = null;
197 var result = null;
198 this.cell_elements().filter(function (index) {
198 this.cell_elements().filter(function (index) {
199 cell = $(this).data("cell");
199 cell = $(this).data("cell");
200 if (cell.cell_id === cell_id) {
200 if (cell.cell_id === cell_id) {
201 result = cell;
201 result = cell;
202 };
202 };
203 });
203 });
204 return result;
204 return result;
205 };
205 };
206
206
207
207
208 Notebook.prototype.selected_cell = function () {
208 Notebook.prototype.selected_cell = function () {
209 return this.cell_elements().eq(this.selected_index()).data("cell");
209 return this.cell_elements().eq(this.selected_index()).data("cell");
210 }
210 }
211
211
212
212
213 // Cell insertion, deletion and moving.
213 // Cell insertion, deletion and moving.
214
214
215
215
216 Notebook.prototype.delete_cell = function (index) {
216 Notebook.prototype.delete_cell = function (index) {
217 var i = index || this.selected_index();
217 var i = index || this.selected_index();
218 if (i !== null && i >= 0 && i < this.ncells()) {
218 if (i !== null && i >= 0 && i < this.ncells()) {
219 this.cell_elements().eq(i).remove();
219 this.cell_elements().eq(i).remove();
220 if (i === (this.ncells())) {
220 if (i === (this.ncells())) {
221 this.select(i-1);
221 this.select(i-1);
222 } else {
222 } else {
223 this.select(i);
223 this.select(i);
224 };
224 };
225 };
225 };
226 this.dirty = true;
226 this.dirty = true;
227 return this;
227 return this;
228 };
228 };
229
229
230
230
231 Notebook.prototype.append_cell = function (cell) {
231 Notebook.prototype.append_cell = function (cell) {
232 this.element.find('div.end_space').before(cell.element);
232 this.element.find('div.end_space').before(cell.element);
233 this.dirty = true;
233 this.dirty = true;
234 return this;
234 return this;
235 };
235 };
236
236
237
237
238 Notebook.prototype.insert_cell_after = function (cell, index) {
238 Notebook.prototype.insert_cell_after = function (cell, index) {
239 var ncells = this.ncells();
239 var ncells = this.ncells();
240 if (ncells === 0) {
240 if (ncells === 0) {
241 this.append_cell(cell);
241 this.append_cell(cell);
242 return this;
242 return this;
243 };
243 };
244 if (index >= 0 && index < ncells) {
244 if (index >= 0 && index < ncells) {
245 this.cell_elements().eq(index).after(cell.element);
245 this.cell_elements().eq(index).after(cell.element);
246 };
246 };
247 this.dirty = true;
247 this.dirty = true;
248 return this
248 return this
249 };
249 };
250
250
251
251
252 Notebook.prototype.insert_cell_before = function (cell, index) {
252 Notebook.prototype.insert_cell_before = function (cell, index) {
253 var ncells = this.ncells();
253 var ncells = this.ncells();
254 if (ncells === 0) {
254 if (ncells === 0) {
255 this.append_cell(cell);
255 this.append_cell(cell);
256 return this;
256 return this;
257 };
257 };
258 if (index >= 0 && index < ncells) {
258 if (index >= 0 && index < ncells) {
259 this.cell_elements().eq(index).before(cell.element);
259 this.cell_elements().eq(index).before(cell.element);
260 };
260 };
261 this.dirty = true;
261 this.dirty = true;
262 return this;
262 return this;
263 };
263 };
264
264
265
265
266 Notebook.prototype.move_cell_up = function (index) {
266 Notebook.prototype.move_cell_up = function (index) {
267 var i = index || this.selected_index();
267 var i = index || this.selected_index();
268 if (i !== null && i < this.ncells() && i > 0) {
268 if (i !== null && i < this.ncells() && i > 0) {
269 var pivot = this.cell_elements().eq(i-1);
269 var pivot = this.cell_elements().eq(i-1);
270 var tomove = this.cell_elements().eq(i);
270 var tomove = this.cell_elements().eq(i);
271 if (pivot !== null && tomove !== null) {
271 if (pivot !== null && tomove !== null) {
272 tomove.detach();
272 tomove.detach();
273 pivot.before(tomove);
273 pivot.before(tomove);
274 this.select(i-1);
274 this.select(i-1);
275 };
275 };
276 };
276 };
277 this.dirty = true;
277 this.dirty = true;
278 return this;
278 return this;
279 }
279 }
280
280
281
281
282 Notebook.prototype.move_cell_down = function (index) {
282 Notebook.prototype.move_cell_down = function (index) {
283 var i = index || this.selected_index();
283 var i = index || this.selected_index();
284 if (i !== null && i < (this.ncells()-1) && i >= 0) {
284 if (i !== null && i < (this.ncells()-1) && i >= 0) {
285 var pivot = this.cell_elements().eq(i+1)
285 var pivot = this.cell_elements().eq(i+1)
286 var tomove = this.cell_elements().eq(i)
286 var tomove = this.cell_elements().eq(i)
287 if (pivot !== null && tomove !== null) {
287 if (pivot !== null && tomove !== null) {
288 tomove.detach();
288 tomove.detach();
289 pivot.after(tomove);
289 pivot.after(tomove);
290 this.select(i+1);
290 this.select(i+1);
291 };
291 };
292 };
292 };
293 this.dirty = true;
293 this.dirty = true;
294 return this;
294 return this;
295 }
295 }
296
296
297
297
298 Notebook.prototype.sort_cells = function () {
298 Notebook.prototype.sort_cells = function () {
299 var ncells = this.ncells();
299 var ncells = this.ncells();
300 var sindex = this.selected_index();
300 var sindex = this.selected_index();
301 var swapped;
301 var swapped;
302 do {
302 do {
303 swapped = false
303 swapped = false
304 for (var i=1; i<ncells; i++) {
304 for (var i=1; i<ncells; i++) {
305 current = this.cell_elements().eq(i).data("cell");
305 current = this.cell_elements().eq(i).data("cell");
306 previous = this.cell_elements().eq(i-1).data("cell");
306 previous = this.cell_elements().eq(i-1).data("cell");
307 if (previous.input_prompt_number > current.input_prompt_number) {
307 if (previous.input_prompt_number > current.input_prompt_number) {
308 this.move_cell_up(i);
308 this.move_cell_up(i);
309 swapped = true;
309 swapped = true;
310 };
310 };
311 };
311 };
312 } while (swapped);
312 } while (swapped);
313 this.select(sindex);
313 this.select(sindex);
314 return this;
314 return this;
315 };
315 };
316
316
317
317
318 Notebook.prototype.insert_code_cell_before = function (index) {
318 Notebook.prototype.insert_code_cell_before = function (index) {
319 // TODO: Bounds check for i
319 // TODO: Bounds check for i
320 var i = this.index_or_selected(index);
320 var i = this.index_or_selected(index);
321 var cell = new IPython.CodeCell(this);
321 var cell = new IPython.CodeCell(this);
322 cell.set_input_prompt();
322 cell.set_input_prompt();
323 this.insert_cell_before(cell, i);
323 this.insert_cell_before(cell, i);
324 this.select(this.find_cell_index(cell));
324 this.select(this.find_cell_index(cell));
325 return cell;
325 return cell;
326 }
326 }
327
327
328
328
329 Notebook.prototype.insert_code_cell_after = function (index) {
329 Notebook.prototype.insert_code_cell_after = function (index) {
330 // TODO: Bounds check for i
330 // TODO: Bounds check for i
331 var i = this.index_or_selected(index);
331 var i = this.index_or_selected(index);
332 var cell = new IPython.CodeCell(this);
332 var cell = new IPython.CodeCell(this);
333 cell.set_input_prompt();
333 cell.set_input_prompt();
334 this.insert_cell_after(cell, i);
334 this.insert_cell_after(cell, i);
335 this.select(this.find_cell_index(cell));
335 this.select(this.find_cell_index(cell));
336 return cell;
336 return cell;
337 }
337 }
338
338
339
339
340 Notebook.prototype.insert_html_cell_before = function (index) {
340 Notebook.prototype.insert_html_cell_before = function (index) {
341 // TODO: Bounds check for i
341 // TODO: Bounds check for i
342 var i = this.index_or_selected(index);
342 var i = this.index_or_selected(index);
343 var cell = new IPython.HTMLCell(this);
343 var cell = new IPython.HTMLCell(this);
344 cell.config_mathjax();
344 cell.config_mathjax();
345 this.insert_cell_before(cell, i);
345 this.insert_cell_before(cell, i);
346 this.select(this.find_cell_index(cell));
346 this.select(this.find_cell_index(cell));
347 return cell;
347 return cell;
348 }
348 }
349
349
350
350
351 Notebook.prototype.insert_html_cell_after = function (index) {
351 Notebook.prototype.insert_html_cell_after = function (index) {
352 // TODO: Bounds check for i
352 // TODO: Bounds check for i
353 var i = this.index_or_selected(index);
353 var i = this.index_or_selected(index);
354 var cell = new IPython.HTMLCell(this);
354 var cell = new IPython.HTMLCell(this);
355 cell.config_mathjax();
355 cell.config_mathjax();
356 this.insert_cell_after(cell, i);
356 this.insert_cell_after(cell, i);
357 this.select(this.find_cell_index(cell));
357 this.select(this.find_cell_index(cell));
358 return cell;
358 return cell;
359 }
359 }
360
360
361
361
362 Notebook.prototype.insert_markdown_cell_before = function (index) {
362 Notebook.prototype.insert_markdown_cell_before = function (index) {
363 // TODO: Bounds check for i
363 // TODO: Bounds check for i
364 var i = this.index_or_selected(index);
364 var i = this.index_or_selected(index);
365 var cell = new IPython.MarkdownCell(this);
365 var cell = new IPython.MarkdownCell(this);
366 cell.config_mathjax();
366 cell.config_mathjax();
367 this.insert_cell_before(cell, i);
367 this.insert_cell_before(cell, i);
368 this.select(this.find_cell_index(cell));
368 this.select(this.find_cell_index(cell));
369 return cell;
369 return cell;
370 }
370 }
371
371
372
372
373 Notebook.prototype.insert_markdown_cell_after = function (index) {
373 Notebook.prototype.insert_markdown_cell_after = function (index) {
374 // TODO: Bounds check for i
374 // TODO: Bounds check for i
375 var i = this.index_or_selected(index);
375 var i = this.index_or_selected(index);
376 var cell = new IPython.MarkdownCell(this);
376 var cell = new IPython.MarkdownCell(this);
377 cell.config_mathjax();
377 cell.config_mathjax();
378 this.insert_cell_after(cell, i);
378 this.insert_cell_after(cell, i);
379 this.select(this.find_cell_index(cell));
379 this.select(this.find_cell_index(cell));
380 return cell;
380 return cell;
381 }
381 }
382
382
383
383
384 Notebook.prototype.to_code = function (index) {
384 Notebook.prototype.to_code = function (index) {
385 // TODO: Bounds check for i
385 // TODO: Bounds check for i
386 var i = this.index_or_selected(index);
386 var i = this.index_or_selected(index);
387 var source_element = this.cell_elements().eq(i);
387 var source_element = this.cell_elements().eq(i);
388 var source_cell = source_element.data("cell");
388 var source_cell = source_element.data("cell");
389 if (source_cell instanceof IPython.HTMLCell ||
389 if (source_cell instanceof IPython.HTMLCell ||
390 source_cell instanceof IPython.MarkdownCell) {
390 source_cell instanceof IPython.MarkdownCell) {
391 this.insert_code_cell_after(i);
391 this.insert_code_cell_after(i);
392 var target_cell = this.cells()[i+1];
392 var target_cell = this.cells()[i+1];
393 target_cell.set_code(source_cell.get_source());
393 target_cell.set_code(source_cell.get_source());
394 source_element.remove();
394 source_element.remove();
395 target_cell.select();
395 target_cell.select();
396 };
396 };
397 this.dirty = true;
397 this.dirty = true;
398 };
398 };
399
399
400
400
401 Notebook.prototype.to_markdown = function (index) {
401 Notebook.prototype.to_markdown = function (index) {
402 // TODO: Bounds check for i
402 // TODO: Bounds check for i
403 var i = this.index_or_selected(index);
403 var i = this.index_or_selected(index);
404 var source_element = this.cell_elements().eq(i);
404 var source_element = this.cell_elements().eq(i);
405 var source_cell = source_element.data("cell");
405 var source_cell = source_element.data("cell");
406 var target_cell = null;
406 var target_cell = null;
407 if (source_cell instanceof IPython.CodeCell) {
407 if (source_cell instanceof IPython.CodeCell) {
408 this.insert_markdown_cell_after(i);
408 this.insert_markdown_cell_after(i);
409 var target_cell = this.cells()[i+1];
409 var target_cell = this.cells()[i+1];
410 var text = source_cell.get_code();
410 var text = source_cell.get_code();
411 } else if (source_cell instanceof IPython.HTMLCell) {
411 } else if (source_cell instanceof IPython.HTMLCell) {
412 this.insert_markdown_cell_after(i);
412 this.insert_markdown_cell_after(i);
413 var target_cell = this.cells()[i+1];
413 var target_cell = this.cells()[i+1];
414 var text = source_cell.get_source();
414 var text = source_cell.get_source();
415 if (text === source_cell.placeholder) {
415 if (text === source_cell.placeholder) {
416 text = target_cell.placeholder;
416 text = target_cell.placeholder;
417 }
417 }
418 }
418 }
419 if (target_cell !== null) {
419 if (target_cell !== null) {
420 if (text === "") {text = target_cell.placeholder;};
420 if (text === "") {text = target_cell.placeholder;};
421 target_cell.set_source(text);
421 target_cell.set_source(text);
422 source_element.remove();
422 source_element.remove();
423 target_cell.edit();
423 target_cell.edit();
424 }
424 }
425 this.dirty = true;
425 this.dirty = true;
426 };
426 };
427
427
428
428
429 Notebook.prototype.to_html = function (index) {
429 Notebook.prototype.to_html = function (index) {
430 // TODO: Bounds check for i
430 // TODO: Bounds check for i
431 var i = this.index_or_selected(index);
431 var i = this.index_or_selected(index);
432 var source_element = this.cell_elements().eq(i);
432 var source_element = this.cell_elements().eq(i);
433 var source_cell = source_element.data("cell");
433 var source_cell = source_element.data("cell");
434 var target_cell = null;
434 var target_cell = null;
435 if (source_cell instanceof IPython.CodeCell) {
435 if (source_cell instanceof IPython.CodeCell) {
436 this.insert_html_cell_after(i);
436 this.insert_html_cell_after(i);
437 var target_cell = this.cells()[i+1];
437 var target_cell = this.cells()[i+1];
438 var text = source_cell.get_code();
438 var text = source_cell.get_code();
439 } else if (source_cell instanceof IPython.MarkdownCell) {
439 } else if (source_cell instanceof IPython.MarkdownCell) {
440 this.insert_html_cell_after(i);
440 this.insert_html_cell_after(i);
441 var target_cell = this.cells()[i+1];
441 var target_cell = this.cells()[i+1];
442 var text = source_cell.get_source();
442 var text = source_cell.get_source();
443 if (text === source_cell.placeholder) {
443 if (text === source_cell.placeholder) {
444 text = target_cell.placeholder;
444 text = target_cell.placeholder;
445 }
445 }
446 }
446 }
447 if (target_cell !== null) {
447 if (target_cell !== null) {
448 if (text === "") {text = target_cell.placeholder;};
448 if (text === "") {text = target_cell.placeholder;};
449 target_cell.set_source(text);
449 target_cell.set_source(text);
450 source_element.remove();
450 source_element.remove();
451 target_cell.edit();
451 target_cell.edit();
452 }
452 }
453 this.dirty = true;
453 this.dirty = true;
454 };
454 };
455
455
456
456
457 // Cell collapsing and output clearing
457 // Cell collapsing and output clearing
458
458
459 Notebook.prototype.collapse = function (index) {
459 Notebook.prototype.collapse = function (index) {
460 var i = this.index_or_selected(index);
460 var i = this.index_or_selected(index);
461 this.cells()[i].collapse();
461 this.cells()[i].collapse();
462 this.dirty = true;
462 this.dirty = true;
463 };
463 };
464
464
465
465
466 Notebook.prototype.expand = function (index) {
466 Notebook.prototype.expand = function (index) {
467 var i = this.index_or_selected(index);
467 var i = this.index_or_selected(index);
468 this.cells()[i].expand();
468 this.cells()[i].expand();
469 this.dirty = true;
469 this.dirty = true;
470 };
470 };
471
471
472
472
473 Notebook.prototype.set_autoindent = function (state) {
473 Notebook.prototype.set_autoindent = function (state) {
474 var cells = this.cells();
474 var cells = this.cells();
475 len = cells.length;
475 len = cells.length;
476 for (var i=0; i<len; i++) {
476 for (var i=0; i<len; i++) {
477 cells[i].set_autoindent(state)
477 cells[i].set_autoindent(state)
478 };
478 };
479 };
479 };
480
480
481
481
482 Notebook.prototype.clear_all_output = function () {
482 Notebook.prototype.clear_all_output = function () {
483 var ncells = this.ncells();
483 var ncells = this.ncells();
484 var cells = this.cells();
484 var cells = this.cells();
485 for (var i=0; i<ncells; i++) {
485 for (var i=0; i<ncells; i++) {
486 if (cells[i] instanceof IPython.CodeCell) {
486 if (cells[i] instanceof IPython.CodeCell) {
487 cells[i].clear_output();
487 cells[i].clear_output();
488 }
488 }
489 };
489 };
490 this.dirty = true;
490 this.dirty = true;
491 };
491 };
492
492
493
493
494 // Kernel related things
494 // Kernel related things
495
495
496 Notebook.prototype.start_kernel = function () {
496 Notebook.prototype.start_kernel = function () {
497 this.kernel = new IPython.Kernel();
497 this.kernel = new IPython.Kernel();
498 var notebook_id = IPython.save_widget.get_notebook_id();
498 var notebook_id = IPython.save_widget.get_notebook_id();
499 this.kernel.start(notebook_id, $.proxy(this.kernel_started, this));
499 this.kernel.start(notebook_id, $.proxy(this.kernel_started, this));
500 };
500 };
501
501
502
502
503 Notebook.prototype.restart_kernel = function () {
503 Notebook.prototype.restart_kernel = function () {
504 var notebook_id = IPython.save_widget.get_notebook_id();
504 var notebook_id = IPython.save_widget.get_notebook_id();
505 this.kernel.restart($.proxy(this.kernel_started, this));
505 this.kernel.restart($.proxy(this.kernel_started, this));
506 };
506 };
507
507
508
508
509 Notebook.prototype.kernel_started = function () {
509 Notebook.prototype.kernel_started = function () {
510 console.log("Kernel started: ", this.kernel.kernel_id);
510 console.log("Kernel started: ", this.kernel.kernel_id);
511 this.kernel.shell_channel.onmessage = $.proxy(this.handle_shell_reply,this);
511 this.kernel.shell_channel.onmessage = $.proxy(this.handle_shell_reply,this);
512 this.kernel.iopub_channel.onmessage = $.proxy(this.handle_iopub_reply,this);
512 this.kernel.iopub_channel.onmessage = $.proxy(this.handle_iopub_reply,this);
513 };
513 };
514
514
515
515
516 Notebook.prototype.handle_shell_reply = function (e) {
516 Notebook.prototype.handle_shell_reply = function (e) {
517 reply = $.parseJSON(e.data);
517 reply = $.parseJSON(e.data);
518 var header = reply.header;
518 var header = reply.header;
519 var content = reply.content;
519 var content = reply.content;
520 var msg_type = header.msg_type;
520 var msg_type = header.msg_type;
521 // console.log(reply);
521 // console.log(reply);
522 var cell = this.cell_for_msg(reply.parent_header.msg_id);
522 var cell = this.cell_for_msg(reply.parent_header.msg_id);
523 if (msg_type === "execute_reply") {
523 if (msg_type === "execute_reply") {
524 cell.set_input_prompt(content.execution_count);
524 cell.set_input_prompt(content.execution_count);
525 this.dirty = true;
525 this.dirty = true;
526 } else if (msg_type === "complete_reply") {
526 } else if (msg_type === "complete_reply") {
527 cell.finish_completing(content.matched_text, content.matches);
527 cell.finish_completing(content.matched_text, content.matches);
528 };
528 };
529 var payload = content.payload || [];
529 var payload = content.payload || [];
530 this.handle_payload(cell, payload);
530 this.handle_payload(cell, payload);
531 };
531 };
532
532
533
533
534 Notebook.prototype.handle_payload = function (cell, payload) {
534 Notebook.prototype.handle_payload = function (cell, payload) {
535 var l = payload.length;
535 var l = payload.length;
536 for (var i=0; i<l; i++) {
536 for (var i=0; i<l; i++) {
537 if (payload[i].source === 'IPython.zmq.page.page') {
537 if (payload[i].source === 'IPython.zmq.page.page') {
538 IPython.pager.clear();
538 if (payload[i].text.trim() !== '') {
539 IPython.pager.expand();
539 IPython.pager.clear();
540 IPython.pager.append_text(payload[i].text);
540 IPython.pager.expand();
541 IPython.pager.append_text(payload[i].text);
542 }
541 } else if (payload[i].source === 'IPython.zmq.zmqshell.ZMQInteractiveShell.set_next_input') {
543 } else if (payload[i].source === 'IPython.zmq.zmqshell.ZMQInteractiveShell.set_next_input') {
542 var index = this.find_cell_index(cell);
544 var index = this.find_cell_index(cell);
543 var new_cell = this.insert_code_cell_after(index);
545 var new_cell = this.insert_code_cell_after(index);
544 new_cell.set_code(payload[i].text);
546 new_cell.set_code(payload[i].text);
545 this.dirty = true;
547 this.dirty = true;
546 }
548 }
547 };
549 };
548 };
550 };
549
551
550
552
551 Notebook.prototype.handle_iopub_reply = function (e) {
553 Notebook.prototype.handle_iopub_reply = function (e) {
552 reply = $.parseJSON(e.data);
554 reply = $.parseJSON(e.data);
553 var content = reply.content;
555 var content = reply.content;
554 // console.log(reply);
556 // console.log(reply);
555 var msg_type = reply.header.msg_type;
557 var msg_type = reply.header.msg_type;
556 var cell = this.cell_for_msg(reply.parent_header.msg_id);
558 var cell = this.cell_for_msg(reply.parent_header.msg_id);
557 var output_types = ['stream','display_data','pyout','pyerr'];
559 var output_types = ['stream','display_data','pyout','pyerr'];
558 if (output_types.indexOf(msg_type) >= 0) {
560 if (output_types.indexOf(msg_type) >= 0) {
559 this.handle_output(cell, msg_type, content);
561 this.handle_output(cell, msg_type, content);
560 } else if (msg_type === 'status') {
562 } else if (msg_type === 'status') {
561 if (content.execution_state === 'busy') {
563 if (content.execution_state === 'busy') {
562 IPython.kernel_status_widget.status_busy();
564 IPython.kernel_status_widget.status_busy();
563 } else if (content.execution_state === 'idle') {
565 } else if (content.execution_state === 'idle') {
564 IPython.kernel_status_widget.status_idle();
566 IPython.kernel_status_widget.status_idle();
565 } else if (content.execution_state === 'dead') {
567 } else if (content.execution_state === 'dead') {
566 this.handle_status_dead();
568 this.handle_status_dead();
567 };
569 };
568 }
570 }
569 };
571 };
570
572
571
573
572 Notebook.prototype.handle_status_dead = function () {
574 Notebook.prototype.handle_status_dead = function () {
573 var that = this;
575 var that = this;
574 this.kernel.stop_channels();
576 this.kernel.stop_channels();
575 var dialog = $('<div/>');
577 var dialog = $('<div/>');
576 dialog.html('The kernel has died, would you like to restart it? If you do not restart the kernel, you will be able to save the notebook, but running code will not work until the notebook is reopened.');
578 dialog.html('The kernel has died, would you like to restart it? If you do not restart the kernel, you will be able to save the notebook, but running code will not work until the notebook is reopened.');
577 $(document).append(dialog);
579 $(document).append(dialog);
578 dialog.dialog({
580 dialog.dialog({
579 resizable: false,
581 resizable: false,
580 modal: true,
582 modal: true,
581 title: "Dead kernel",
583 title: "Dead kernel",
582 buttons : {
584 buttons : {
583 "Yes": function () {
585 "Yes": function () {
584 that.start_kernel();
586 that.start_kernel();
585 $(this).dialog('close');
587 $(this).dialog('close');
586 },
588 },
587 "No": function () {
589 "No": function () {
588 $(this).dialog('close');
590 $(this).dialog('close');
589 }
591 }
590 }
592 }
591 });
593 });
592 };
594 };
593
595
594
596
595 Notebook.prototype.handle_output = function (cell, msg_type, content) {
597 Notebook.prototype.handle_output = function (cell, msg_type, content) {
596 var json = {};
598 var json = {};
597 json.output_type = msg_type;
599 json.output_type = msg_type;
598 if (msg_type === "stream") {
600 if (msg_type === "stream") {
599 json.text = utils.fixConsole(content.data + '\n');
601 json.text = utils.fixConsole(content.data + '\n');
600 } else if (msg_type === "display_data") {
602 } else if (msg_type === "display_data") {
601 json = this.convert_mime_types(json, content.data);
603 json = this.convert_mime_types(json, content.data);
602 } else if (msg_type === "pyout") {
604 } else if (msg_type === "pyout") {
603 json.prompt_number = content.execution_count;
605 json.prompt_number = content.execution_count;
604 json = this.convert_mime_types(json, content.data);
606 json = this.convert_mime_types(json, content.data);
605 } else if (msg_type === "pyerr") {
607 } else if (msg_type === "pyerr") {
606 json.ename = content.ename;
608 json.ename = content.ename;
607 json.evalue = content.evalue;
609 json.evalue = content.evalue;
608 var traceback = [];
610 var traceback = [];
609 for (var i=0; i<content.traceback.length; i++) {
611 for (var i=0; i<content.traceback.length; i++) {
610 traceback.push(utils.fixConsole(content.traceback[i]));
612 traceback.push(utils.fixConsole(content.traceback[i]));
611 }
613 }
612 json.traceback = traceback;
614 json.traceback = traceback;
613 };
615 };
614 cell.append_output(json);
616 cell.append_output(json);
615 this.dirty = true;
617 this.dirty = true;
616 };
618 };
617
619
618
620
619 Notebook.prototype.convert_mime_types = function (json, data) {
621 Notebook.prototype.convert_mime_types = function (json, data) {
620 if (data['text/plain'] !== undefined) {
622 if (data['text/plain'] !== undefined) {
621 json.text = utils.fixConsole(data['text/plain']);
623 json.text = utils.fixConsole(data['text/plain']);
622 };
624 };
623 if (data['text/html'] !== undefined) {
625 if (data['text/html'] !== undefined) {
624 json.html = data['text/html'];
626 json.html = data['text/html'];
625 };
627 };
626 if (data['image/svg+xml'] !== undefined) {
628 if (data['image/svg+xml'] !== undefined) {
627 json.svg = data['image/svg+xml'];
629 json.svg = data['image/svg+xml'];
628 };
630 };
629 if (data['image/png'] !== undefined) {
631 if (data['image/png'] !== undefined) {
630 json.png = data['image/png'];
632 json.png = data['image/png'];
631 };
633 };
632 if (data['image/jpeg'] !== undefined) {
634 if (data['image/jpeg'] !== undefined) {
633 json.jpeg = data['image/jpeg'];
635 json.jpeg = data['image/jpeg'];
634 };
636 };
635 if (data['text/latex'] !== undefined) {
637 if (data['text/latex'] !== undefined) {
636 json.latex = data['text/latex'];
638 json.latex = data['text/latex'];
637 };
639 };
638 if (data['application/json'] !== undefined) {
640 if (data['application/json'] !== undefined) {
639 json.json = data['application/json'];
641 json.json = data['application/json'];
640 };
642 };
641 if (data['application/javascript'] !== undefined) {
643 if (data['application/javascript'] !== undefined) {
642 json.javascript = data['application/javascript'];
644 json.javascript = data['application/javascript'];
643 }
645 }
644 return json;
646 return json;
645 };
647 };
646
648
647
649
648 Notebook.prototype.execute_selected_cell = function (options) {
650 Notebook.prototype.execute_selected_cell = function (options) {
649 // add_new: should a new cell be added if we are at the end of the nb
651 // add_new: should a new cell be added if we are at the end of the nb
650 // terminal: execute in terminal mode, which stays in the current cell
652 // terminal: execute in terminal mode, which stays in the current cell
651 default_options = {terminal: false, add_new: true}
653 default_options = {terminal: false, add_new: true}
652 $.extend(default_options, options)
654 $.extend(default_options, options)
653 var that = this;
655 var that = this;
654 var cell = that.selected_cell();
656 var cell = that.selected_cell();
655 var cell_index = that.find_cell_index(cell);
657 var cell_index = that.find_cell_index(cell);
656 if (cell instanceof IPython.CodeCell) {
658 if (cell instanceof IPython.CodeCell) {
657 cell.clear_output();
659 cell.clear_output();
658 var code = cell.get_code();
660 var code = cell.get_code();
659 var msg_id = that.kernel.execute(cell.get_code());
661 var msg_id = that.kernel.execute(cell.get_code());
660 that.msg_cell_map[msg_id] = cell.cell_id;
662 that.msg_cell_map[msg_id] = cell.cell_id;
661 } else if (cell instanceof IPython.HTMLCell) {
663 } else if (cell instanceof IPython.HTMLCell) {
662 cell.render();
664 cell.render();
663 }
665 }
664 if (default_options.terminal) {
666 if (default_options.terminal) {
665 cell.clear_input();
667 cell.clear_input();
666 } else {
668 } else {
667 if ((cell_index === (that.ncells()-1)) && default_options.add_new) {
669 if ((cell_index === (that.ncells()-1)) && default_options.add_new) {
668 that.insert_code_cell_after();
670 that.insert_code_cell_after();
669 // If we are adding a new cell at the end, scroll down to show it.
671 // If we are adding a new cell at the end, scroll down to show it.
670 that.scroll_to_bottom();
672 that.scroll_to_bottom();
671 } else {
673 } else {
672 that.select(cell_index+1);
674 that.select(cell_index+1);
673 };
675 };
674 };
676 };
675 this.dirty = true;
677 this.dirty = true;
676 };
678 };
677
679
678
680
679 Notebook.prototype.execute_all_cells = function () {
681 Notebook.prototype.execute_all_cells = function () {
680 var ncells = this.ncells();
682 var ncells = this.ncells();
681 for (var i=0; i<ncells; i++) {
683 for (var i=0; i<ncells; i++) {
682 this.select(i);
684 this.select(i);
683 this.execute_selected_cell({add_new:false});
685 this.execute_selected_cell({add_new:false});
684 };
686 };
685 this.scroll_to_bottom();
687 this.scroll_to_bottom();
686 };
688 };
687
689
688
690
689 Notebook.prototype.complete_cell = function (cell, line, cursor_pos) {
691 Notebook.prototype.complete_cell = function (cell, line, cursor_pos) {
690 var msg_id = this.kernel.complete(line, cursor_pos);
692 var msg_id = this.kernel.complete(line, cursor_pos);
691 this.msg_cell_map[msg_id] = cell.cell_id;
693 this.msg_cell_map[msg_id] = cell.cell_id;
692 };
694 };
693
695
694 // Persistance and loading
696 // Persistance and loading
695
697
696
698
697 Notebook.prototype.fromJSON = function (data) {
699 Notebook.prototype.fromJSON = function (data) {
698 var ncells = this.ncells();
700 var ncells = this.ncells();
699 for (var i=0; i<ncells; i++) {
701 for (var i=0; i<ncells; i++) {
700 // Always delete cell 0 as they get renumbered as they are deleted.
702 // Always delete cell 0 as they get renumbered as they are deleted.
701 this.delete_cell(0);
703 this.delete_cell(0);
702 };
704 };
703 // Only handle 1 worksheet for now.
705 // Only handle 1 worksheet for now.
704 var worksheet = data.worksheets[0];
706 var worksheet = data.worksheets[0];
705 if (worksheet !== undefined) {
707 if (worksheet !== undefined) {
706 var new_cells = worksheet.cells;
708 var new_cells = worksheet.cells;
707 ncells = new_cells.length;
709 ncells = new_cells.length;
708 var cell_data = null;
710 var cell_data = null;
709 var new_cell = null;
711 var new_cell = null;
710 for (var i=0; i<ncells; i++) {
712 for (var i=0; i<ncells; i++) {
711 cell_data = new_cells[i];
713 cell_data = new_cells[i];
712 if (cell_data.cell_type == 'code') {
714 if (cell_data.cell_type == 'code') {
713 new_cell = this.insert_code_cell_after();
715 new_cell = this.insert_code_cell_after();
714 new_cell.fromJSON(cell_data);
716 new_cell.fromJSON(cell_data);
715 } else if (cell_data.cell_type === 'html') {
717 } else if (cell_data.cell_type === 'html') {
716 new_cell = this.insert_html_cell_after();
718 new_cell = this.insert_html_cell_after();
717 new_cell.fromJSON(cell_data);
719 new_cell.fromJSON(cell_data);
718 } else if (cell_data.cell_type === 'markdown') {
720 } else if (cell_data.cell_type === 'markdown') {
719 new_cell = this.insert_markdown_cell_after();
721 new_cell = this.insert_markdown_cell_after();
720 new_cell.fromJSON(cell_data);
722 new_cell.fromJSON(cell_data);
721 };
723 };
722 };
724 };
723 };
725 };
724 };
726 };
725
727
726
728
727 Notebook.prototype.toJSON = function () {
729 Notebook.prototype.toJSON = function () {
728 var cells = this.cells();
730 var cells = this.cells();
729 var ncells = cells.length;
731 var ncells = cells.length;
730 cell_array = new Array(ncells);
732 cell_array = new Array(ncells);
731 for (var i=0; i<ncells; i++) {
733 for (var i=0; i<ncells; i++) {
732 cell_array[i] = cells[i].toJSON();
734 cell_array[i] = cells[i].toJSON();
733 };
735 };
734 data = {
736 data = {
735 // Only handle 1 worksheet for now.
737 // Only handle 1 worksheet for now.
736 worksheets : [{cells:cell_array}]
738 worksheets : [{cells:cell_array}]
737 }
739 }
738 return data
740 return data
739 };
741 };
740
742
741 Notebook.prototype.save_notebook = function () {
743 Notebook.prototype.save_notebook = function () {
742 if (IPython.save_widget.test_notebook_name()) {
744 if (IPython.save_widget.test_notebook_name()) {
743 var notebook_id = IPython.save_widget.get_notebook_id();
745 var notebook_id = IPython.save_widget.get_notebook_id();
744 var nbname = IPython.save_widget.get_notebook_name();
746 var nbname = IPython.save_widget.get_notebook_name();
745 // We may want to move the name/id/nbformat logic inside toJSON?
747 // We may want to move the name/id/nbformat logic inside toJSON?
746 var data = this.toJSON();
748 var data = this.toJSON();
747 data.name = nbname;
749 data.name = nbname;
748 data.nbformat = 2;
750 data.nbformat = 2;
749 // We do the call with settings so we can set cache to false.
751 // We do the call with settings so we can set cache to false.
750 var settings = {
752 var settings = {
751 processData : false,
753 processData : false,
752 cache : false,
754 cache : false,
753 type : "PUT",
755 type : "PUT",
754 data : JSON.stringify(data),
756 data : JSON.stringify(data),
755 headers : {'Content-Type': 'application/json'},
757 headers : {'Content-Type': 'application/json'},
756 success : $.proxy(this.notebook_saved,this)
758 success : $.proxy(this.notebook_saved,this)
757 };
759 };
758 IPython.save_widget.status_saving();
760 IPython.save_widget.status_saving();
759 $.ajax("/notebooks/" + notebook_id, settings);
761 $.ajax("/notebooks/" + notebook_id, settings);
760 };
762 };
761 };
763 };
762
764
763
765
764 Notebook.prototype.notebook_saved = function (data, status, xhr) {
766 Notebook.prototype.notebook_saved = function (data, status, xhr) {
765 this.dirty = false;
767 this.dirty = false;
766 setTimeout($.proxy(IPython.save_widget.status_save,IPython.save_widget),500);
768 setTimeout($.proxy(IPython.save_widget.status_save,IPython.save_widget),500);
767 }
769 }
768
770
769
771
770 Notebook.prototype.load_notebook = function (callback) {
772 Notebook.prototype.load_notebook = function (callback) {
771 var that = this;
773 var that = this;
772 var notebook_id = IPython.save_widget.get_notebook_id();
774 var notebook_id = IPython.save_widget.get_notebook_id();
773 // We do the call with settings so we can set cache to false.
775 // We do the call with settings so we can set cache to false.
774 var settings = {
776 var settings = {
775 processData : false,
777 processData : false,
776 cache : false,
778 cache : false,
777 type : "GET",
779 type : "GET",
778 dataType : "json",
780 dataType : "json",
779 success : function (data, status, xhr) {
781 success : function (data, status, xhr) {
780 that.notebook_loaded(data, status, xhr);
782 that.notebook_loaded(data, status, xhr);
781 if (callback !== undefined) {
783 if (callback !== undefined) {
782 callback();
784 callback();
783 };
785 };
784 }
786 }
785 };
787 };
786 IPython.save_widget.status_loading();
788 IPython.save_widget.status_loading();
787 $.ajax("/notebooks/" + notebook_id, settings);
789 $.ajax("/notebooks/" + notebook_id, settings);
788 }
790 }
789
791
790
792
791 Notebook.prototype.notebook_loaded = function (data, status, xhr) {
793 Notebook.prototype.notebook_loaded = function (data, status, xhr) {
792 this.fromJSON(data);
794 this.fromJSON(data);
793 if (this.ncells() === 0) {
795 if (this.ncells() === 0) {
794 this.insert_code_cell_after();
796 this.insert_code_cell_after();
795 };
797 };
796 IPython.save_widget.status_save();
798 IPython.save_widget.status_save();
797 IPython.save_widget.set_notebook_name(data.name);
799 IPython.save_widget.set_notebook_name(data.name);
798 this.start_kernel();
800 this.start_kernel();
799 this.dirty = false;
801 this.dirty = false;
800 // fromJSON always selects the last cell inserted. We need to wait
802 // fromJSON always selects the last cell inserted. We need to wait
801 // until that is done before scrolling to the top.
803 // until that is done before scrolling to the top.
802 setTimeout(function () {
804 setTimeout(function () {
803 IPython.notebook.select(0);
805 IPython.notebook.select(0);
804 IPython.notebook.scroll_to_top();
806 IPython.notebook.scroll_to_top();
805 }, 50);
807 }, 50);
806 };
808 };
807
809
808 IPython.Notebook = Notebook;
810 IPython.Notebook = Notebook;
809
811
810 return IPython;
812 return IPython;
811
813
812 }(IPython));
814 }(IPython));
813
815
General Comments 0
You need to be logged in to leave comments. Login now