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.
 
 
 
 
 
 

188 lines
6.5 KiB

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