mirror of
https://github.com/wassname/jupyter_contrib_nbextensions.git
synced 2026-06-27 16:10:24 +08:00
179 lines
6.5 KiB
JavaScript
Executable File
179 lines
6.5 KiB
JavaScript
Executable File
|
|
// Copyright (C) 2014 Jean-Christophe Jaskula
|
|
//
|
|
// Distributed under the terms of the BSD License.
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Execute timings - display when a cell has been executed lastly and how long it took
|
|
// A double click on the box makes it disappear
|
|
define(["require", "jquery", "base/js/namespace", "base/js/events"], function (require, $, IPython, events) {
|
|
"use strict";
|
|
|
|
var firstExecTime=null;
|
|
var execCells=[];
|
|
var toggle_all = null;
|
|
|
|
var month_names = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
|
|
var day_names = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
|
|
|
|
var patchCodecellExecute = function() {
|
|
console.log('patching codecell to trigger ExecuteCell.ExecuteTime');
|
|
IPython.CodeCell.prototype.old_execute = IPython.CodeCell.prototype.execute
|
|
|
|
IPython.CodeCell.prototype.execute = function () {
|
|
this.old_execute(arguments);
|
|
events.trigger('ExecuteCell.ExecuteTime');
|
|
};
|
|
}
|
|
|
|
var toggleDisplay = function() {
|
|
var cell = IPython.notebook.get_selected_cell(); // get the selected cell
|
|
if (cell instanceof IPython.CodeCell) {
|
|
var ce=cell.element;
|
|
|
|
var timing_area=ce.find(".timing_area");
|
|
var vis=timing_area.is(':visible');
|
|
if (vis) {
|
|
ce.find(".input_area").css('border-radius','4px');
|
|
timing_area.hide();
|
|
} else {
|
|
ce.find(".input_area").css('border-radius','4px 4px 0 0');
|
|
timing_area.show();
|
|
}
|
|
}
|
|
};
|
|
|
|
var create_menu = function() {
|
|
var link_current=$("<a/>").text("Current").click(toggleDisplay);
|
|
|
|
var link_all=$("<a/>").text("All").click(function(){
|
|
var ncells = IPython.notebook.ncells()
|
|
var cells = IPython.notebook.get_cells();
|
|
for (var i=0; i<ncells; i++) {
|
|
if (cells[i] instanceof IPython.CodeCell) {
|
|
var timing_area=(cells[i]).element.find(".timing_area");
|
|
var vis=timing_area.is(':visible');
|
|
if (!timing_area.length)
|
|
continue;
|
|
|
|
if (toggle_all === null)
|
|
toggle_all= vis;
|
|
if (toggle_all) {
|
|
(cells[i]).element.find(".input_area").css('border-radius','4px');
|
|
timing_area.hide();
|
|
} else {
|
|
(cells[i]).element.find(".input_area").css('border-radius','4px 4px 0 0');
|
|
timing_area.show();
|
|
}
|
|
}
|
|
}
|
|
toggle_all=null;
|
|
});
|
|
|
|
var cmenu=$("body").find("ul#cell_menu");
|
|
var toggle_timings_menu=$("<li/>").addClass("dropdown-submenu").attr("id","toggle_timings").append($("<a/>").text("Toggle timings"));
|
|
cmenu.append(toggle_timings_menu);
|
|
var timings_submenu=$("<ul/>").addClass("dropdown-menu");
|
|
var toggle_current_timings=$("<li/>").attr({id:"toggle_current_timings", title:"Toggle the current cell timings box"}).append(link_current);
|
|
var toggle_all_timings=$("<li/>").attr({id:"toggle_all_timings", title:"Toggle all timings box"}).append(link_all);
|
|
timings_submenu.append(toggle_current_timings).append(toggle_all_timings);
|
|
toggle_timings_menu.append(timings_submenu);
|
|
}
|
|
|
|
var date_fmt = function(date) {
|
|
var dnames=day_names[date.getDay()] + "";
|
|
var mon=month_names[date.getMonth()] + " ";
|
|
var day=date.getDate() +" ";
|
|
var year= date.getFullYear()+" ";
|
|
|
|
var hour = date.getHours();
|
|
var a_p = (hour < 12) ? "AM" : "PM";
|
|
|
|
hour = (hour == 0) ? 12 : hour;
|
|
hour = (hour > 12) ? hour - 12 : hour;
|
|
|
|
var min = date.getMinutes() + "";
|
|
min = (min.length == 1) ? "0" + min: min;
|
|
|
|
return dnames+ ', ' + mon + day + year + 'at ' + hour + ":" + min + " " + a_p;
|
|
}
|
|
|
|
var executionStartTime = function (event) {
|
|
var cell = IPython.notebook.get_selected_cell(); // get the selected cell
|
|
if (cell instanceof IPython.CodeCell) {
|
|
var ce=cell.element;
|
|
|
|
var execTime=new Date();
|
|
|
|
if (firstExecTime === null)
|
|
firstExecTime=execTime;
|
|
execCells.push([IPython.notebook.get_selected_index()]);
|
|
|
|
var startMsg = 'Lastly executed on ' + date_fmt(execTime);
|
|
|
|
var timing_area=ce.find(".timing_area");
|
|
if (timing_area.length === 0) {
|
|
var timing_area = $('<div/>').addClass('timing_area');
|
|
|
|
timing_area.dblclick(toggleDisplay);
|
|
|
|
ce.find(".input_area").css('border-radius','4px 4px 0 0');
|
|
ce.find(".inner_cell").append(timing_area);
|
|
}
|
|
timing_area.text(startMsg);
|
|
}
|
|
};
|
|
|
|
var executionEndTime = function(event) {
|
|
if (firstExecTime === null) {
|
|
return;
|
|
}
|
|
|
|
var cellNb=execCells.shift();
|
|
|
|
var cell = IPython.notebook.get_cell(cellNb); // get the selected cell
|
|
if (cell instanceof IPython.CodeCell) {
|
|
|
|
var endExecTime=new Date();
|
|
|
|
var UnixBeforeExec = Math.round(firstExecTime.getTime()/1000);
|
|
var end = Math.round(endExecTime.getTime()/1000);
|
|
var ET = (end-UnixBeforeExec);
|
|
|
|
var hours=Math.floor(ET/3600);
|
|
var minutes=Math.floor((ET-hours*3600)/60);
|
|
var seconds=Math.floor(ET-hours*3600-minutes*60);
|
|
var durationMsg = seconds + ' s';
|
|
if (minutes) {
|
|
durationMsg = minutes + ' min ' + durationMsg;
|
|
}
|
|
if (hours) {
|
|
durationMsg = hours + ' h ' + durationMsg;
|
|
}
|
|
durationMsg = ' in ' + durationMsg;
|
|
|
|
var ta=cell.element.find("div.timing_area");
|
|
ta.html(ta.html() + durationMsg);
|
|
ta.hide();
|
|
ta.show('highlight', {color:'#b00000'}, 1000);
|
|
|
|
if (!execCells.length) {
|
|
firstExecTime=null;
|
|
} else {
|
|
firstExecTime=endExecTime;
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
patchCodecellExecute();
|
|
|
|
events.on('ExecuteCell.ExecuteTime',executionStartTime);
|
|
events.on('kernel_idle.Kernel', executionEndTime);
|
|
|
|
$("head").append($("<link rel='stylesheet' href='" + require.toUrl("./ExecuteTime.css") + "' type='text/css' />"));
|
|
create_menu();
|
|
|
|
console.log('Execute Timings loaded');
|
|
});
|