You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
5.6 KiB

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 = { // updated from server's config & nb metadata
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) {
// if init_cell is undefined, it'll be interpreted as false anyway
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() {
// register action
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);
// add toolbar button
Jupyter.toolbar.add_buttons_group([action_full_name]);
// setup things to run on loading config/notebook
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 () {
// update from metadata
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);
}
// register celltoolbar presets if they haven't been already
if (CellToolbar.list_presets().indexOf(toolbar_preset_name) < 0) {
// Register a callback to create a UI element for a cell toolbar.
CellToolbar.register_callback('init_cell.is_init_cell', init_cell_ui_callback, 'code');
// Register a preset of UI elements forming a cell toolbar.
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') {
// kernel is already ready
run_init_cells();
}
// whenever a (new) kernel becomes ready, run all initialization cells
events.on('kernel_ready.Kernel', run_init_cells);
}
return {
load_ipython_extension : load_ipython_extension
};
});