Skip to content

Commit cd3b514

Browse files
committed
[runtools] minor efficiency improvements
* don't loop twice in initialization * find cell applying to CodeMirror instance using $().closest rather than looping * use setCells function to simplify marked toggling functions * use is_marked function over duplicating code * use cells.length over notebook.ncells, which calls get_cells again * don't use notebook.get_cell (which gets all cells first, internally) when we already have a list of cells * use function for showing/hiding marked cells' inputs/outputs, rather than duplicating
1 parent f31dc88 commit cd3b514

File tree

1 file changed

+53
-86
lines changed
  • src/jupyter_contrib_nbextensions/nbextensions/runtools

1 file changed

+53
-86
lines changed

src/jupyter_contrib_nbextensions/nbextensions/runtools/main.js

Lines changed: 53 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,11 @@ define([
4040
var cell = cells[i];
4141
if ((cell.cell_type === "code")) {
4242
cell.code_mirror.on("gutterClick", changeEvent);
43-
44-
if (cell.metadata.run_control !== undefined) {
45-
if (cell.metadata.run_control.marked === true) {
46-
var g = cell.code_mirror.getGutterElement();
47-
$(g).css({
48-
"background-color": params.marked_color
49-
});
50-
}
43+
if (is_marked(cell)) {
44+
var g = cell.code_mirror.getGutterElement();
45+
$(g).css({
46+
"background-color": params.marked_color
47+
});
5148
}
5249
}
5350
}
@@ -184,19 +181,23 @@ define([
184181
}
185182
}
186183

184+
function _show_input_output_of_marked(show, char) {
185+
var cells = Jupyter.notebook.get_cells();
186+
var ncells = cells.length;
187+
for (var i = 0; i < ncells; i++) {
188+
var _cell = cells[i];
189+
if (is_marked(_cell))
190+
showCell(_cell, char, show);
191+
}
192+
}
193+
187194
/**
188195
* Hide or show input of all marked code cells
189196
*
190197
* @param show {Boolean} show (true) or hide (false) code cells
191198
*/
192199
function show_input(show) {
193-
var ncells = Jupyter.notebook.ncells();
194-
var cells = Jupyter.notebook.get_cells();
195-
for (var i = 0; i < ncells; i++) {
196-
var _cell = cells[i];
197-
if (_cell.metadata.run_control !== undefined && _cell.metadata.run_control.marked === true)
198-
showCell(_cell, 'i', show);
199-
}
200+
_show_input_output_of_marked(show, 'i');
200201
}
201202

202203
/**
@@ -205,13 +206,7 @@ define([
205206
* @param {Boolean} show show (true) or hide (false)
206207
*/
207208
function show_output(show) {
208-
var ncells = Jupyter.notebook.ncells();
209-
var cells = Jupyter.notebook.get_cells();
210-
for (var i = 0; i < ncells; i++) {
211-
var _cell = cells[i];
212-
if (_cell.metadata.run_control !== undefined && _cell.metadata.run_control.marked === true)
213-
showCell(_cell, 'o', show);
214-
}
209+
_show_input_output_of_marked(show, 'o');
215210
}
216211

217212

@@ -220,11 +215,12 @@ define([
220215
*
221216
*/
222217
function execute_next_marked_cell() {
218+
var cells = Jupyter.notebook.get_cells();
219+
var end = cells.length;
223220
while (run_list.length > 0) {
224221
var runcell = run_list.shift();
225-
var end = IPython.notebook.ncells();
226222
for (var i = 0; i < end; i++) {
227-
if (runcell === IPython.notebook.get_cell(i)) {
223+
if (runcell === cells[i]) {
228224
if (runcell.metadata.run_control !== undefined && runcell.metadata.run_control.marked === true) {
229225
IPython.notebook.select(i);
230226
var g = runcell.code_mirror.getGutterElement();
@@ -244,13 +240,13 @@ define([
244240
*
245241
*/
246242
function run_marked_cells() {
247-
var end = IPython.notebook.ncells();
243+
var cells = Jupyter.notebook.get_cells();
244+
var end = cells.length;
248245
run_list = [];
249-
/* Mark all selected cells as scheduled to be run with new gutter background color */
246+
/* Show all marked cells as scheduled to be run with new gutter background color */
250247
for (var i = 0; i < end; i++) {
251-
IPython.notebook.select(i);
252-
var cell = IPython.notebook.get_selected_cell();
253-
if (cell instanceof IPython.CodeCell) {
248+
var cell = cells[i];
249+
if (cell instanceof codecell.CodeCell) {
254250
var last_line = cell.code_mirror.lastLine();
255251
var cell_empty = ( last_line === 0 && cell.code_mirror.getLine(last_line) === "");
256252
if (cell.metadata.run_control !== undefined && cell_empty === false) {
@@ -275,15 +271,11 @@ define([
275271
var finished_execute_event = function(evt, data) {
276272
var cell = data.cell;
277273
/* Reset gutter color no non-queued state */
278-
if ((cell instanceof IPython.CodeCell)) {
279-
if (cell.metadata.run_control !== undefined) {
280-
if (cell.metadata.run_control.marked === true) {
281-
var g = cell.code_mirror.getGutterElement();
282-
$(g).css({
283-
"background-color": params.marked_color
284-
});
285-
}
286-
}
274+
if (is_marked(cell)) {
275+
var g = cell.code_mirror.getGutterElement();
276+
$(g).css({
277+
"background-color": params.marked_color
278+
});
287279
}
288280
execute_next_marked_cell();
289281
};
@@ -294,6 +286,7 @@ define([
294286
* @param value
295287
*/
296288
function setCell(cell, value) {
289+
if (!(cell instanceof codecell.CodeCell)) return;
297290
if (cell.metadata.run_control === undefined) cell.metadata.run_control = {};
298291
if (cell.metadata.run_control.marked === undefined) cell.metadata.run_control.marked = false;
299292
if (value === undefined) value = !cell.metadata.run_control.marked;
@@ -311,41 +304,32 @@ define([
311304
}
312305
}
313306

307+
function setCellsMarked(cells, value) {
308+
var ncells = cells.length;
309+
for (var i = 0; i < ncells; i++) {
310+
setCell(cells[i], value);
311+
}
312+
}
313+
314314
/**
315315
* Toggle code cell marker
316316
*/
317317
function toggle_marker() {
318-
var cell = Jupyter.notebook.get_selected_cell();
319-
setCell(cell, undefined);
320-
cell.focus_cell();
318+
setCellsMarked(Jupyter.notebook.get_selected_cells(), undefined);
321319
}
322320

323321
/**
324322
*
325323
*/
326324
function mark_all() {
327-
var cell = Jupyter.notebook.get_selected_cell();
328-
var ncells = Jupyter.notebook.ncells();
329-
var cells = Jupyter.notebook.get_cells();
330-
for (var i = 0; i < ncells; i++) {
331-
var _cell = cells[i];
332-
setCell(_cell, true);
333-
}
334-
cell.focus_cell();
325+
setCellsMarked(Jupyter.notebook.get_cells(), true);
335326
}
336327

337328
/**
338329
*
339330
*/
340331
function mark_none() {
341-
var cell = Jupyter.notebook.get_selected_cell();
342-
var ncells = Jupyter.notebook.ncells();
343-
var cells = Jupyter.notebook.get_cells();
344-
for (var i = 0; i < ncells; i++) {
345-
var _cell = cells[i];
346-
setCell(_cell, false);
347-
}
348-
cell.focus_cell();
332+
setCellsMarked(Jupyter.notebook.get_cells(), false);
349333
}
350334

351335
/**
@@ -370,21 +354,10 @@ define([
370354
*/
371355
function changeEvent(cm, line, gutter) {
372356
var cmline = cm.doc.children[0].lines[line];
373-
var cell = Jupyter.notebook.get_selected_cell();
374357
if (cmline === undefined) {
375358
return;
376359
}
377-
378-
if (cell.code_mirror !== cm) {
379-
var ncells = Jupyter.notebook.ncells();
380-
var cells = Jupyter.notebook.get_cells();
381-
for (var i = 0; i < ncells; i++) {
382-
cell = cells[i];
383-
if (cell.code_mirror === cm) {
384-
break;
385-
}
386-
}
387-
}
360+
var cell = $(cm.element).closest('.cell').data('cell');
388361
if (cell.metadata.run_control === undefined)
389362
cell.metadata.run_control = {};
390363
setCell(cell, !cell.metadata.run_control.marked);
@@ -396,12 +369,9 @@ define([
396369
* @returns {boolean} true if marked
397370
*/
398371
var is_marked = function(cell) {
399-
if (cell.metadata.run_control !== undefined) {
400-
if (cell.metadata.run_control.marked === true) {
401-
return true;
402-
}
403-
}
404-
return false;
372+
return (cell instanceof codecell.CodeCell) &&
373+
cell.metadata.run_control !== undefined &&
374+
cell.metadata.run_control.marked;
405375
};
406376

407377
/**
@@ -443,10 +413,10 @@ define([
443413
*
444414
*/
445415
var run_all_cells_ignore_errors = function() {
446-
for (var i = 0; i < Jupyter.notebook.ncells(); i++) {
447-
Jupyter.notebook.select(i);
448-
var cell = Jupyter.notebook.get_selected_cell();
449-
cell.execute(false);
416+
var cells = Jupyter.notebook.get_cells();
417+
var ncells = cells.length;
418+
for (var i = 0; i < ncells; i++) {
419+
cells[i].execute(false);
450420
}
451421
};
452422

@@ -715,8 +685,8 @@ define([
715685
* Initialize all cells with new gutter
716686
*/
717687
var initGutter = function() {
718-
var ncells = Jupyter.notebook.ncells();
719688
var cells = Jupyter.notebook.get_cells();
689+
var ncells = cells.length;
720690
for (var i = 0; i < ncells; i++) {
721691
var cell = cells[i];
722692
if (cell instanceof codecell.CodeCell) {
@@ -726,12 +696,9 @@ define([
726696
cell.code_mirror.setOption('gutters', gutters);
727697
}
728698
}
729-
}
730-
/**
731-
* Restore hide/show status after reload
732-
*/
733-
for (i = 0; i < ncells; i++) {
734-
var cell = cells[i];
699+
/**
700+
* Restore hide/show status after reload
701+
*/
735702
if (cell.metadata.hasOwnProperty('hide_input') && cell.metadata.hide_input === true)
736703
showCell(cell, 'i', false);
737704
if (cell.metadata.hasOwnProperty('hide_output') && cell.metadata.hide_output === true)

0 commit comments

Comments
 (0)