define([
|
|
'jquery',
|
|
'base/js/namespace',
|
|
'base/js/dialog',
|
|
'base/js/events',
|
|
'base/js/utils',
|
|
'require',
|
|
], function(
|
|
$,
|
|
Jupyter,
|
|
dialog,
|
|
events,
|
|
utils,
|
|
require
|
|
) {
|
|
"use strict";
|
|
|
|
//==========================================================================
|
|
var appmode_unload_handler = function (e) {
|
|
var nb = Jupyter.notebook;
|
|
var url_parts = [nb.base_url, 'apps', nb.notebook_path];
|
|
var url = utils.url_path_join.apply(null, url_parts);
|
|
|
|
// tell server to clean up session, kernel, and tmp notebook file.
|
|
utils.ajax(url, {cache: false, type: "DELETE", async: false});
|
|
};
|
|
|
|
//==========================================================================
|
|
var kernel_busy_handler = function (e) {
|
|
$('#appmode-busy').css('visibility', 'visible');
|
|
}
|
|
|
|
//==========================================================================
|
|
var kernel_idle_handler = function (e) {
|
|
$('#appmode-busy').css('visibility', 'hidden');
|
|
}
|
|
|
|
//==========================================================================
|
|
function goto_app_mode() {
|
|
// kill Jupyter session
|
|
Jupyter.notebook.session.delete();
|
|
|
|
// build new URL
|
|
var base_url = Jupyter.notebook.base_url;
|
|
var prefix = base_url+"notebooks/"
|
|
var path = window.location.pathname.substring(prefix.length);
|
|
var search = window.location.search;
|
|
var scroll = "appmode_scroll=" + $('#site').scrollTop();
|
|
if (search.search(/appmode_scroll=\d+/) != -1){
|
|
search = search.replace(/appmode_scroll=\d+/g, scroll);
|
|
}else if (search.length == 0) {
|
|
search = "?" + scroll;
|
|
} else {
|
|
search += "&" + scroll;
|
|
}
|
|
|
|
// goto new URL
|
|
window.location.href = base_url + "apps/" + path + search;
|
|
}
|
|
|
|
//==========================================================================
|
|
function goto_normal_mode() {
|
|
// build new URL
|
|
var base_url = Jupyter.notebook.base_url;
|
|
var prefix = base_url+"apps/"
|
|
var path = window.location.pathname.substring(prefix.length);
|
|
var new_url = base_url + "notebooks/" + path + window.location.search;
|
|
|
|
// goto new URL
|
|
// Not using location.pathname as it might urlencode the path again
|
|
window.location.href = new_url;
|
|
}
|
|
|
|
//==========================================================================
|
|
function kernel_inject_url(kernel) {
|
|
kernel.execute("jupyter_notebook_url = '" + window.location + "'");
|
|
}
|
|
|
|
//==========================================================================
|
|
function initialize_step1() {
|
|
if (Jupyter.notebook && Jupyter.notebook._fully_loaded) {
|
|
initialize_step2();
|
|
}else{
|
|
events.one('notebook_loaded.Notebook', initialize_step2);
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
function initialize_step2() {
|
|
// scroll to last position if in normal mode
|
|
var base_url = Jupyter.notebook.base_url;
|
|
if(window.location.pathname.startsWith(base_url+"notebooks/")){
|
|
var url = window.location.href;
|
|
var m = url.match(/appmode_scroll=(\d+)/);
|
|
if(m)
|
|
$('#site').scrollTop(m[1]);
|
|
}
|
|
|
|
var nb = Jupyter.notebook;
|
|
if(nb.kernel && nb.kernel.info_reply.status) {
|
|
initialize_step3();
|
|
}else{
|
|
events.one('kernel_ready.Kernel', initialize_step3);
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
function initialize_step3() {
|
|
kernel_inject_url(Jupyter.notebook.kernel);
|
|
|
|
// run kernel_inject_url() again when a new kernel is created
|
|
events.on('kernel_created.Kernel kernel_created.Session', function(event, data) {
|
|
kernel_inject_url(data.kernel);
|
|
});
|
|
|
|
var base_url = Jupyter.notebook.base_url;
|
|
if(window.location.pathname.startsWith(base_url+"apps/")){
|
|
// appmode is active -> continue intializtion
|
|
initialize_step4();
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
function initialize_step4() {
|
|
// install unload-handler
|
|
window.onbeforeunload = appmode_unload_handler;
|
|
|
|
// disable autosave
|
|
Jupyter.notebook.set_autosave_interval(0);
|
|
|
|
// disable keyboard shortcuts
|
|
Jupyter.keyboard_manager.command_shortcuts.clear_shortcuts();
|
|
Jupyter.keyboard_manager.edit_shortcuts.clear_shortcuts();
|
|
|
|
// disable editing of text cells
|
|
$('.text_cell').off("dblclick");
|
|
|
|
// disable editing of raw cells
|
|
$('.CodeMirror').each(function() {
|
|
this.CodeMirror.setOption('readOnly', "nocursor");
|
|
});
|
|
|
|
// register kernel events
|
|
events.on('kernel_idle.Kernel', kernel_idle_handler);
|
|
events.on('kernel_busy.Kernel', kernel_busy_handler);
|
|
|
|
// register on_click handler
|
|
$('#appmode-leave').click(goto_normal_mode);
|
|
|
|
// clear all cell outputs persisted in the initial notebook
|
|
Jupyter.notebook.clear_all_output();
|
|
// try to load the jupyter-js-widgets extension to see if it's installed
|
|
utils.load_extension('jupyter-js-widgets/extension').then(function(module) {
|
|
// force the extension to initialize if it exists, even if it's a repeat
|
|
// operation, to avoid a race condition with executing cells that contain
|
|
// widgets
|
|
module.load_ipython_extension().then(initialize_step5);
|
|
}).catch(initialize_step5);
|
|
}
|
|
|
|
//==========================================================================
|
|
function initialize_step5() {
|
|
// hide loading screen
|
|
$('#appmode-loader').slideUp();
|
|
// execute all cells
|
|
Jupyter.notebook.execute_all_cells();
|
|
console.log("Appmode: initialization finished");
|
|
};
|
|
|
|
//==========================================================================
|
|
var load_ipython_extension = function() {
|
|
|
|
// add button to toolbar in case appmode is not enabled
|
|
Jupyter.toolbar.add_buttons_group([{
|
|
id : 'toggle_codecells',
|
|
label : 'Appmode',
|
|
icon : 'fa-arrows-alt',
|
|
callback : goto_app_mode
|
|
}]);
|
|
|
|
initialize_step1();
|
|
};
|
|
|
|
//==========================================================================
|
|
return {
|
|
load_ipython_extension : load_ipython_extension
|
|
};
|
|
});
|