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
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
|
|
};
|
|
});
|