##// END OF EJS Templates
Fix imports of "modules",...
Fix imports of "modules", required after converting everything into dictionary returns.

File last commit:

r17200:00ca3eee
r17202:a3cc0b0b
Show More
utils.js
557 lines | 19.7 KiB | application/javascript | JavascriptLexer
MinRK
update completion_ and objection_info_request...
r16580 // Copyright (c) IPython Development Team.
// Distributed under the terms of the Modified BSD License.
Brian E. Granger
Splitting notebook.js into muliple files for development ease.
r4349
Jonathan Frederic
Make page.html require.js friendly.
r17188 define([
'base/js/namespace',
Jonathan Frederic
MWE,...
r17200 'jquery',
Jonathan Frederic
Make page.html require.js friendly.
r17188 ], function(IPython, $){
Matthias BUSSONNIER
"use strict" in most (if not all) our javascript...
r12103 "use strict";
MinRK
add IPython.load_extensions in js
r15228
IPython.load_extensions = function () {
// load one or more IPython notebook extensions with requirejs
var extensions = [];
var extension_names = arguments;
for (var i = 0; i < extension_names.length; i++) {
extensions.push("nbextensions/" + arguments[i]);
}
require(extensions,
function () {
for (var i = 0; i < arguments.length; i++) {
var ext = arguments[i];
var ext_name = extension_names[i];
// success callback
console.log("Loaded extension: " + ext_name);
if (ext && ext.load_ipython_extension !== undefined) {
ext.load_ipython_extension();
}
}
},
function (err) {
// failure callback
console.log("Failed to load extension(s):", err.requireModules, err);
}
);
};
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Aron Ahmadia
partial refactor, can't quite get environments working
r8565 //============================================================================
// Cross-browser RegEx Split
//============================================================================
// This code has been MODIFIED from the code licensed below to not replace the
// default browser split. The license is reproduced here.
// see http://blog.stevenlevithan.com/archives/cross-browser-split for more info:
/*!
* Cross-Browser Split 1.1.1
* Copyright 2007-2012 Steven Levithan <stevenlevithan.com>
* Available under the MIT License
* ECMAScript compliant, uniform cross-browser split method
*/
/**
* Splits a string into an array of strings using a regex or string
* separator. Matches of the separator are not included in the result array.
* However, if `separator` is a regex that contains capturing groups,
* backreferences are spliced into the result each time `separator` is
* matched. Fixes browser bugs compared to the native
* `String.prototype.split` and can be used reliably cross-browser.
* @param {String} str String to split.
* @param {RegExp|String} separator Regex or string to use for separating
* the string.
* @param {Number} [limit] Maximum number of items to include in the result
* array.
* @returns {Array} Array of substrings.
* @example
*
* // Basic use
* regex_split('a b c d', ' ');
* // -> ['a', 'b', 'c', 'd']
*
* // With limit
* regex_split('a b c d', ' ', 2);
* // -> ['a', 'b']
*
* // Backreferences in result array
* regex_split('..word1 word2..', /([a-z]+)(\d+)/i);
* // -> ['..', 'word', '1', ' ', 'word', '2', '..']
*/
var regex_split = function (str, separator, limit) {
// If `separator` is not a regex, use `split`
if (Object.prototype.toString.call(separator) !== "[object RegExp]") {
return split.call(str, separator, limit);
}
var output = [],
flags = (separator.ignoreCase ? "i" : "") +
(separator.multiline ? "m" : "") +
(separator.extended ? "x" : "") + // Proposed for ES6
(separator.sticky ? "y" : ""), // Firefox 3+
lastLastIndex = 0,
// Make `global` and avoid `lastIndex` issues by working with a copy
separator = new RegExp(separator.source, flags + "g"),
separator2, match, lastIndex, lastLength;
str += ""; // Type-convert
MinRK
expand ANSI color support...
r11307 var compliantExecNpcg = typeof(/()??/.exec("")[1]) === "undefined";
Aron Ahmadia
partial refactor, can't quite get environments working
r8565 if (!compliantExecNpcg) {
// Doesn't need flags gy, but they don't hurt
separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags);
}
/* Values for `limit`, per the spec:
* If undefined: 4294967295 // Math.pow(2, 32) - 1
* If 0, Infinity, or NaN: 0
* If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;
* If negative number: 4294967296 - Math.floor(Math.abs(limit))
* If other: Type-convert, then use the above rules
*/
limit = typeof(limit) === "undefined" ?
-1 >>> 0 : // Math.pow(2, 32) - 1
limit >>> 0; // ToUint32(limit)
while (match = separator.exec(str)) {
// `separator.lastIndex` is not reliable cross-browser
lastIndex = match.index + match[0].length;
if (lastIndex > lastLastIndex) {
output.push(str.slice(lastLastIndex, match.index));
// Fix browsers whose `exec` methods don't consistently return `undefined` for
// nonparticipating capturing groups
if (!compliantExecNpcg && match.length > 1) {
match[0].replace(separator2, function () {
for (var i = 1; i < arguments.length - 2; i++) {
if (typeof(arguments[i]) === "undefined") {
match[i] = undefined;
}
}
});
}
if (match.length > 1 && match.index < str.length) {
Array.prototype.push.apply(output, match.slice(1));
}
lastLength = match[0].length;
lastLastIndex = lastIndex;
if (output.length >= limit) {
break;
}
}
if (separator.lastIndex === match.index) {
separator.lastIndex++; // Avoid an infinite loop
}
}
if (lastLastIndex === str.length) {
if (lastLength || !separator.test("")) {
output.push("");
}
} else {
output.push(str.slice(lastLastIndex));
}
return output.length > limit ? output.slice(0, limit) : output;
};
//============================================================================
// End contributed Cross-browser RegEx Split
//============================================================================
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 var uuid = function () {
// http://www.ietf.org/rfc/rfc4122.txt
var s = [];
var hexDigits = "0123456789ABCDEF";
for (var i = 0; i < 32; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[12] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
s[16] = hexDigits.substr((s[16] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
var uuid = s.join("");
return uuid;
};
//Fix raw text to parse correctly in crazy XML
function xmlencode(string) {
return string.replace(/\&/g,'&'+'amp;')
.replace(/</g,'&'+'lt;')
.replace(/>/g,'&'+'gt;')
.replace(/\'/g,'&'+'apos;')
.replace(/\"/g,'&'+'quot;')
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 .replace(/`/g,'&'+'#96;');
Brian E. Granger
Splitting notebook.js into muliple files for development ease.
r4349 }
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Brian E. Granger
Pager is working again.
r4361
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 //Map from terminal commands to CSS classes
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var ansi_colormap = {
MinRK
use much faster regexp for ansi coloring...
r10250 "01":"ansibold",
MinRK
add indexed-color in 256-color support
r11313
MinRK
use much faster regexp for ansi coloring...
r10250 "30":"ansiblack",
"31":"ansired",
"32":"ansigreen",
"33":"ansiyellow",
"34":"ansiblue",
"35":"ansipurple",
"36":"ansicyan",
MinRK
add ansi background colors
r11312 "37":"ansigray",
MinRK
add indexed-color in 256-color support
r11313
MinRK
add ansi background colors
r11312 "40":"ansibgblack",
"41":"ansibgred",
"42":"ansibggreen",
Andrea Bedini
Fix ansi color code for background yellow
r12095 "43":"ansibgyellow",
MinRK
add ansi background colors
r11312 "44":"ansibgblue",
"45":"ansibgpurple",
"46":"ansibgcyan",
"47":"ansibggray"
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
MinRK
expand ANSI color support...
r11307
function _process_numbers(attrs, numbers) {
// process ansi escapes
var n = numbers.shift();
if (ansi_colormap[n]) {
if ( ! attrs["class"] ) {
attrs["class"] = ansi_colormap[n];
} else {
attrs["class"] += " " + ansi_colormap[n];
}
} else if (n == "38" || n == "48") {
MinRK
be pedantic about VT100 vs ANSI in comments
r11314 // VT100 256 color or 24 bit RGB
MinRK
expand ANSI color support...
r11307 if (numbers.length < 2) {
MinRK
be pedantic about VT100 vs ANSI in comments
r11314 console.log("Not enough fields for VT100 color", numbers);
MinRK
expand ANSI color support...
r11307 return;
}
var index_or_rgb = numbers.shift();
var r,g,b;
if (index_or_rgb == "5") {
MinRK
be pedantic about VT100 vs ANSI in comments
r11314 // 256 color
MinRK
expand ANSI color support...
r11307 var idx = parseInt(numbers.shift());
if (idx < 16) {
MinRK
add indexed-color in 256-color support
r11313 // indexed ANSI
// ignore bright / non-bright distinction
idx = idx % 8;
var ansiclass = ansi_colormap[n[0] + (idx % 8).toString()];
if ( ! attrs["class"] ) {
attrs["class"] = ansiclass;
} else {
attrs["class"] += " " + ansiclass;
}
return;
MinRK
expand ANSI color support...
r11307 } else if (idx < 232) {
MinRK
add indexed-color in 256-color support
r11313 // 216 color 6x6x6 RGB
MinRK
expand ANSI color support...
r11307 idx = idx - 16;
b = idx % 6;
g = Math.floor(idx / 6) % 6;
r = Math.floor(idx / 36) % 6;
// convert to rgb
r = (r * 51);
g = (g * 51);
b = (b * 51);
} else {
// grayscale
idx = idx - 231;
// it's 1-24 and should *not* include black or white,
// so a 26 point scale
MinRK
add indexed-color in 256-color support
r11313 r = g = b = Math.floor(idx * 256 / 26);
MinRK
expand ANSI color support...
r11307 }
} else if (index_or_rgb == "2") {
MinRK
add indexed-color in 256-color support
r11313 // Simple 24 bit RGB
MinRK
expand ANSI color support...
r11307 if (numbers.length > 3) {
console.log("Not enough fields for RGB", numbers);
return;
}
r = numbers.shift();
g = numbers.shift();
b = numbers.shift();
} else {
console.log("unrecognized control", numbers);
return;
}
if (r !== undefined) {
// apply the rgb color
var line;
if (n == "38") {
line = "color: ";
} else {
line = "background-color: ";
}
line = line + "rgb(" + r + "," + g + "," + b + ");"
if ( !attrs["style"] ) {
attrs["style"] = line;
} else {
attrs["style"] += " " + line;
}
}
}
}
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
MinRK
use much faster regexp for ansi coloring...
r10250 function ansispan(str) {
// ansispan function adapted from github.com/mmalecki/ansispan (MIT License)
MinRK
expand ANSI color support...
r11307 // regular ansi escapes (using the table above)
return str.replace(/\033\[(0?[01]|22|39)?([;\d]+)?m/g, function(match, prefix, pattern) {
if (!pattern) {
// [(01|22|39|)m close spans
return "</span>";
}
// consume sequence of color escapes
var numbers = pattern.match(/\d+/g);
var attrs = {};
while (numbers.length > 0) {
_process_numbers(attrs, numbers);
}
var span = "<span ";
for (var attr in attrs) {
var value = attrs[attr];
span = span + " " + attr + '="' + attrs[attr] + '"';
}
return span + ">";
MinRK
use much faster regexp for ansi coloring...
r10250 });
MinRK
expand ANSI color support...
r11307 };
MinRK
use much faster regexp for ansi coloring...
r10250
Michael Droettboom
Handle carriage return characters ("\r") in HTML notebook output....
r7339 // Transform ANSI color escape codes into HTML <span> tags with css
Brian Granger
Colors now working in tracebacks and the pager....
r4383 // classes listed in the above ansi_colormap object. The actual color used
// are set in the css file.
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 function fixConsole(txt) {
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 txt = xmlencode(txt);
MinRK
[notebook] clear_output is handled after a delay...
r6423 var re = /\033\[([\dA-Fa-f;]*?)m/;
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 var opened = false;
var cmds = [];
var opener = "";
var closer = "";
Jack Feser
Strip non color related ANSI escape sequences from notebook output....
r10140
// Strip all ANSI codes that are not color related. Matches
// all ANSI codes that do not end with "m".
var ignored_re = /(?=(\033\[[\d;=]*[a-ln-zA-Z]{1}))\1(?!m)/g;
txt = txt.replace(ignored_re, "");
MinRK
use much faster regexp for ansi coloring...
r10250
// color ansi codes
txt = ansispan(txt);
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 return txt;
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 }
Michael Droettboom
Fix carriage-return handling regular expression so it doesn't treat "\r\n" as "\r".
r7338 // Remove chunks that should be overridden by the effect of
// carriage return characters
function fixCarriageReturn(txt) {
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var tmp = txt;
Michael Droettboom
Fix carriage-return handling regular expression so it doesn't treat "\r\n" as "\r".
r7338 do {
txt = tmp;
Thomas Kluyver
Fix display of plain text containing multiple carriage returns before line feed....
r8702 tmp = txt.replace(/\r+\n/gm, '\n'); // \r followed by \n --> newline
tmp = tmp.replace(/^.*\r+/gm, ''); // Other \r --> clear line
Michael Droettboom
Fix carriage-return handling regular expression so it doesn't treat "\r\n" as "\r".
r7338 } while (tmp.length < txt.length);
return txt;
}
Brian E. Granger
Pager is working again.
r4361
MinRK
fix regular expression for detecting links in stdout...
r10045 // Locate any URLs and convert them to a anchor tag
Erik M. Bray
Locate URLs in text output and convert them to hyperlinks.
r8528 function autoLinkUrls(txt) {
MinRK
fix regular expression for detecting links in stdout...
r10045 return txt.replace(/(^|\s)(https?|ftp)(:[^'">\s]+)/gi,
"$1<a target=\"_blank\" href=\"$2$3\">$2$3</a>");
Erik M. Bray
Locate URLs in text output and convert them to hyperlinks.
r8528 }
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var points_to_pixels = function (points) {
Brian Granger
Resolving conflict in utils.js.
r7353 // A reasonably good way of converting between points and pixels.
var test = $('<div style="display: none; width: 10000pt; padding:0; border:0;"></div>');
$(body).append(test);
var pixel_per_point = test.width()/10000;
test.remove();
return Math.floor(points*pixel_per_point);
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 };
MinRK
add utils.always_new...
r13206
var always_new = function (constructor) {
// wrapper around contructor to avoid requiring `var a = new constructor()`
// useful for passing constructors as callbacks,
// not for programmer laziness.
// from http://programmers.stackexchange.com/questions/118798
return function () {
var obj = Object.create(constructor.prototype);
constructor.apply(obj, arguments);
return obj;
};
};
Brian Granger
Resolving conflict in utils.js.
r7353
MinRK
add utils.url_path_join...
r13063 var url_path_join = function () {
// join a sequence of url components with '/'
var url = '';
for (var i = 0; i < arguments.length; i++) {
MinRK
don't let empty strings introduce extra slashes in url_path_join
r13080 if (arguments[i] === '') {
continue;
}
MinRK
add utils.url_path_join...
r13063 if (url.length > 0 && url[url.length-1] != '/') {
url = url + '/' + arguments[i];
} else {
url = url + arguments[i];
}
}
MinRK
add utils.parse_url...
r15241 url = url.replace(/\/\/+/, '/');
MinRK
add utils.url_path_join...
r13063 return url;
};
MinRK
add utils.url_join_encode...
r13686
MinRK
add utils.parse_url...
r15241 var parse_url = function (url) {
MinRK
document utils.parse_url
r15243 // an `a` element with an href allows attr-access to the parsed segments of a URL
// a = parse_url("http://localhost:8888/path/name#hash")
// a.protocol = "http:"
// a.host = "localhost:8888"
// a.hostname = "localhost"
// a.port = 8888
// a.pathname = "/path/name"
// a.hash = "#hash"
MinRK
add utils.parse_url...
r15241 var a = document.createElement("a");
a.href = url;
return a;
};
MinRK
add utils.url_join_encode...
r13686
var encode_uri_components = function (uri) {
// encode just the components of a multi-segment uri,
// leaving '/' separators
return uri.split('/').map(encodeURIComponent).join('/');
MinRK
add utils.parse_url...
r15241 };
MinRK
add utils.url_join_encode...
r13686
var url_join_encode = function () {
// join a sequence of url components with '/',
// encoding each component with encodeURIComponent
return encode_uri_components(url_path_join.apply(null, arguments));
};
MinRK
add utils.url_path_join...
r13063
MinRK
add utils.splitext to js...
r13120 var splitext = function (filename) {
// mimic Python os.path.splitext
// Returns ['base', '.ext']
var idx = filename.lastIndexOf('.');
if (idx > 0) {
return [filename.slice(0, idx), filename.slice(idx)];
} else {
return [filename, ''];
}
MinRK
add utils.get_data...
r15233 };
MinRK
add utils.escape_html
r15331 var escape_html = function (text) {
// escape text to HTML
return $("<div/>").text(text).html();
MinRK
update completion_ and objection_info_request...
r16580 };
MinRK
add utils.escape_html
r15331
MinRK
s/get_data/get_body_data/
r15240 var get_body_data = function(key) {
MinRK
add utils.get_data...
r15233 // get a url-encoded item from body.data and decode it
// we should never have any encoded URLs anywhere else in code
// until we are building an actual request
return decodeURIComponent($('body').data(key));
};
MinRK
update completion_ and objection_info_request...
r16580
MinRK
complete_reply has cursor_start and cursor_end, not matched_text
r16588 var to_absolute_cursor_pos = function (cm, cursor) {
MinRK
update completion_ and objection_info_request...
r16580 // get the absolute cursor position from CodeMirror's col, ch
if (!cursor) {
cursor = cm.getCursor();
}
var cursor_pos = cursor.ch;
for (var i = 0; i < cursor.line; i++) {
cursor_pos += cm.getLine(i).length + 1;
}
return cursor_pos;
};
MinRK
complete_reply has cursor_start and cursor_end, not matched_text
r16588 var from_absolute_cursor_pos = function (cm, cursor_pos) {
// turn absolute cursor postion into CodeMirror col, ch cursor
var i, line;
var offset = 0;
for (i = 0, line=cm.getLine(i); line !== undefined; i++, line=cm.getLine(i)) {
if (offset + line.length < cursor_pos) {
offset += line.length + 1;
} else {
return {
line : i,
ch : cursor_pos - offset,
};
}
}
// reached end, return endpoint
return {
ch : line.length - 1,
line : i - 1,
};
};
Brian E. Granger
Removing call to $.browser which went away in jQuery 1.9....
r9227 // http://stackoverflow.com/questions/2400935/browser-detection-in-javascript
Matthias BUSSONNIER
"use strict" in most (if not all) our javascript...
r12103 var browser = (function() {
MinRK
allow utils.js to be loaded in node...
r14205 if (typeof navigator === 'undefined') {
// navigator undefined in node
return 'None';
}
Brian E. Granger
Removing call to $.browser which went away in jQuery 1.9....
r9227 var N= navigator.appName, ua= navigator.userAgent, tem;
var M= ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
MinRK
complete_reply has cursor_start and cursor_end, not matched_text
r16588 if (M && (tem= ua.match(/version\/([\.\d]+)/i)) !== null) M[2]= tem[1];
Brian E. Granger
Removing call to $.browser which went away in jQuery 1.9....
r9227 M= M? [M[1], M[2]]: [N, navigator.appVersion,'-?'];
return M;
})();
Brian E. Granger
Added platform dep. logic.
r14816 // http://stackoverflow.com/questions/11219582/how-to-detect-my-browser-version-and-operating-system-using-javascript
var platform = (function () {
Brian E. Granger
Protect against navigator undefined in platform.
r14826 if (typeof navigator === 'undefined') {
// navigator undefined in node
return 'None';
}
var OSName="None";
Brian E. Granger
Added platform dep. logic.
r14816 if (navigator.appVersion.indexOf("Win")!=-1) OSName="Windows";
if (navigator.appVersion.indexOf("Mac")!=-1) OSName="MacOS";
if (navigator.appVersion.indexOf("X11")!=-1) OSName="UNIX";
if (navigator.appVersion.indexOf("Linux")!=-1) OSName="Linux";
MinRK
update completion_ and objection_info_request...
r16580 return OSName;
Brian E. Granger
Added platform dep. logic.
r14816 })();
Brian E. Granger
Using a more specific approach for managing CM focus....
r14033 var is_or_has = function (a, b) {
// Is b a child of a or a itself?
return a.has(b).length !==0 || a.is(b);
MinRK
update completion_ and objection_info_request...
r16580 };
Brian E. Granger
Using a more specific approach for managing CM focus....
r14033
var is_focused = function (e) {
// Is element e, or one of its children focused?
e = $(e);
var target = $(document.activeElement);
if (target.length > 0) {
if (is_or_has(e, target)) {
return true;
} else {
return false;
}
} else {
return false;
}
MinRK
update completion_ and objection_info_request...
r16580 };
MinRK
log all failed ajax API requests
r16445
var log_ajax_error = function (jqXHR, status, error) {
// log ajax failures with informative messages
var msg = "API request failed (" + jqXHR.status + "): ";
console.log(jqXHR);
if (jqXHR.responseJSON && jqXHR.responseJSON.message) {
msg += jqXHR.responseJSON.message;
} else {
msg += jqXHR.statusText;
}
console.log(msg);
};
Jonathan Frederic
Make page.html require.js friendly.
r17188
var Utils = {
Aron Ahmadia
partial refactor, can't quite get environments working
r8565 regex_split : regex_split,
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 uuid : uuid,
Brian E. Granger
Pager is working again.
r4361 fixConsole : fixConsole,
Min RK
fix missing comma
r7357 fixCarriageReturn : fixCarriageReturn,
Erik M. Bray
Locate URLs in text output and convert them to hyperlinks.
r8528 autoLinkUrls : autoLinkUrls,
Brian E. Granger
Removing call to $.browser which went away in jQuery 1.9....
r9227 points_to_pixels : points_to_pixels,
MinRK
s/get_data/get_body_data/
r15240 get_body_data : get_body_data,
MinRK
add utils.parse_url...
r15241 parse_url : parse_url,
MinRK
add utils.url_path_join...
r13063 url_path_join : url_path_join,
MinRK
add utils.url_join_encode...
r13686 url_join_encode : url_join_encode,
encode_uri_components : encode_uri_components,
MinRK
add utils.splitext to js...
r13120 splitext : splitext,
MinRK
add utils.escape_html
r15331 escape_html : escape_html,
MinRK
add utils.always_new...
r13206 always_new : always_new,
MinRK
complete_reply has cursor_start and cursor_end, not matched_text
r16588 to_absolute_cursor_pos : to_absolute_cursor_pos,
from_absolute_cursor_pos : from_absolute_cursor_pos,
Brian E. Granger
Using a more specific approach for managing CM focus....
r14033 browser : browser,
Brian E. Granger
Added platform dep. logic.
r14816 platform: platform,
Brian E. Granger
Using a more specific approach for managing CM focus....
r14033 is_or_has : is_or_has,
MinRK
log all failed ajax API requests
r16445 is_focused : is_focused,
log_ajax_error : log_ajax_error,
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Jonathan Frederic
Progress...
r17196 // Backwards compatability.
Jonathan Frederic
Make page.html require.js friendly.
r17188 IPython.Utils = Utils;
Jonathan Frederic
Progress...
r17196
Jonathan Frederic
Make page.html require.js friendly.
r17188 return Utils;
});