|
define([ |
|
'jquery', |
|
'base/js/dialog', |
|
'base/js/events', |
|
'base/js/namespace', |
|
'notebook/js/celltoolbar', |
|
'notebook/js/codecell', |
|
], function ( |
|
$, |
|
dialog, |
|
events, |
|
Jupyter, |
|
celltoolbar, |
|
codecell |
|
) { |
|
"use strict"; |
|
|
|
var CellToolbar = celltoolbar.CellToolbar; |
|
|
|
var mod_name = 'init_cell'; |
|
var log_prefix = '[' + mod_name + ']'; |
|
var options = { |
|
run_on_kernel_ready: true, |
|
}; |
|
|
|
var toolbar_preset_name = 'Initialization Cell'; |
|
var init_cell_ui_callback = CellToolbar.utils.checkbox_ui_generator( |
|
toolbar_preset_name, |
|
function setter (cell, value) { |
|
if (value) { |
|
cell.metadata.init_cell = true; |
|
} |
|
else { |
|
delete cell.metadata.init_cell; |
|
} |
|
}, |
|
function getter (cell) { |
|
|
|
return cell.metadata.init_cell; |
|
} |
|
); |
|
|
|
function count_init_cells () { |
|
console.log(log_prefix, 'counting initialization cells'); |
|
var num = 0; |
|
var cells = Jupyter.notebook.get_cells(); |
|
for (var ii = 0; ii < cells.length; ii++) { |
|
var cell = cells[ii]; |
|
if ((cell instanceof codecell.CodeCell) && cell.metadata.init_cell === true ) { |
|
num++; |
|
} |
|
} |
|
console.log(log_prefix, 'found ' + num + ' initialization cell' + (num !== 1 ? 's' : '')); |
|
return num |
|
} |
|
|
|
function run_init_cells () { |
|
console.log(log_prefix, 'running all initialization cells'); |
|
var num = 0; |
|
var cells = Jupyter.notebook.get_cells(); |
|
for (var ii = 0; ii < cells.length; ii++) { |
|
var cell = cells[ii]; |
|
if ((cell instanceof codecell.CodeCell) && cell.metadata.init_cell === true ) { |
|
cell.execute(); |
|
num++; |
|
} |
|
} |
|
console.log(log_prefix, 'finished running ' + num + ' initialization cell' + (num !== 1 ? 's' : '')); |
|
} |
|
|
|
var load_ipython_extension = function() { |
|
|
|
var prefix = 'auto'; |
|
var action_name = 'run-initialization-cells'; |
|
var action = { |
|
icon: 'fa-calculator', |
|
help: 'Run all initialization cells', |
|
help_index : 'zz', |
|
handler : run_init_cells |
|
}; |
|
var action_full_name = Jupyter.notebook.keyboard_manager.actions.register(action, action_name, prefix); |
|
|
|
|
|
Jupyter.toolbar.add_buttons_group([action_full_name]); |
|
|
|
|
|
Jupyter.notebook.config.loaded |
|
.then(function update_options_from_config () { |
|
$.extend(true, options, Jupyter.notebook.config.data[mod_name]); |
|
}, function (reason) { |
|
console.warn(log_prefix, 'error loading config:', reason); |
|
}) |
|
.then(function () { |
|
if (Jupyter.notebook._fully_loaded) { |
|
callback_notebook_loaded(); |
|
} |
|
events.on('notebook_loaded.Notebook', callback_notebook_loaded); |
|
}).catch(function (reason) { |
|
console.error(log_prefix, 'unhandled error:', reason); |
|
}); |
|
}; |
|
|
|
function callback_notebook_loaded () { |
|
|
|
var md_opts = Jupyter.notebook.metadata[mod_name]; |
|
if (md_opts !== undefined) { |
|
console.log(log_prefix, 'updating options from notebook metadata:', md_opts); |
|
$.extend(true, options, md_opts); |
|
} |
|
|
|
|
|
if (CellToolbar.list_presets().indexOf(toolbar_preset_name) < 0) { |
|
|
|
CellToolbar.register_callback('init_cell.is_init_cell', init_cell_ui_callback, 'code'); |
|
|
|
CellToolbar.register_preset(toolbar_preset_name, ['init_cell.is_init_cell'], Jupyter.notebook); |
|
} |
|
|
|
if (options.run_on_kernel_ready) { |
|
var num = count_init_cells(); |
|
|
|
if (num) { |
|
if (Jupyter.notebook.trusted) { |
|
run_init_cells_asap() |
|
} |
|
else { |
|
dialog.modal({ |
|
title : 'Untrusted notebook with initialization code', |
|
body : num + ' initialization code cell' + (num !== 1 ? 's' : '') + ' was found but not run since this notebook is untrusted.', |
|
buttons: { |
|
'Trust notebook': { |
|
'class' : 'btn-danger', |
|
'click' : () => Jupyter.notebook.trust_notebook() |
|
}, |
|
'Do nothing': {'class' : 'btn-primary'} |
|
}, |
|
notebook: Jupyter.notebook, |
|
keyboard_manager: Jupyter.keyboard_manager, |
|
}); |
|
} |
|
} |
|
} |
|
} |
|
|
|
function run_init_cells_asap () { |
|
if (Jupyter.notebook && Jupyter.notebook.kernel && Jupyter.notebook.kernel.info_reply.status === 'ok') { |
|
|
|
run_init_cells(); |
|
} |
|
|
|
events.on('kernel_ready.Kernel', run_init_cells); |
|
} |
|
|
|
return { |
|
load_ipython_extension : load_ipython_extension |
|
}; |
|
}); |
|
|