jupyterhub/theme/static/js/utils.js

140 lines
4.3 KiB
JavaScript
Raw Normal View History

2023-01-20 13:01:31 +00:00
// Based on IPython's base.js.utils
// Original Copyright (c) IPython Development Team.
// Distributed under the terms of the Modified BSD License.
// Modifications Copyright (c) Jupyter Development Team.
// Distributed under the terms of the Modified BSD License.
define(["jquery"], function ($) {
"use strict";
var url_path_join = function () {
// join a sequence of url components with '/'
var url = "";
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] === "") {
continue;
}
if (url.length > 0 && url[url.length - 1] != "/") {
url = url + "/" + arguments[i];
} else {
url = url + arguments[i];
}
}
url = url.replace(/\/\/+/, "/");
return url;
};
var parse_url = function (url) {
// 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"
var a = document.createElement("a");
a.href = url;
return a;
};
var encode_uri_components = function (uri) {
// encode just the components of a multi-segment uri,
// leaving '/' separators
return uri.split("/").map(encodeURIComponent).join("/");
};
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));
};
var escape_html = function (text) {
// escape text to HTML
return $("<div/>").text(text).html();
};
var get_body_data = function (key) {
// 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));
};
// http://stackoverflow.com/questions/2400935/browser-detection-in-javascript
var browser = (function () {
if (typeof navigator === "undefined") {
// navigator undefined in node
return "None";
}
var N = navigator.appName,
ua = navigator.userAgent,
tem;
var M = ua.match(
/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i,
);
if (M && (tem = ua.match(/version\/([\.\d]+)/i)) !== null) M[2] = tem[1];
M = M ? [M[1], M[2]] : [N, navigator.appVersion, "-?"];
return M;
})();
// http://stackoverflow.com/questions/11219582/how-to-detect-my-browser-version-and-operating-system-using-javascript
var platform = (function () {
if (typeof navigator === "undefined") {
// navigator undefined in node
return "None";
}
var OSName = "None";
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";
return OSName;
})();
var ajax_error_msg = function (jqXHR) {
// Return a JSON error message if there is one,
// otherwise the basic HTTP status text.
if (jqXHR.responseJSON && jqXHR.responseJSON.message) {
return jqXHR.responseJSON.message;
} else {
return jqXHR.statusText;
}
};
var log_ajax_error = function (jqXHR, status, error) {
// log ajax failures with informative messages
var msg = "API request failed (" + jqXHR.status + "): ";
console.log(jqXHR);
msg += ajax_error_msg(jqXHR);
console.log(msg);
return msg;
};
var ajax_error_dialog = function (jqXHR, status, error) {
console.log("ajax dialog", arguments);
var msg = log_ajax_error(jqXHR, status, error);
var dialog = $("#error-dialog");
dialog.find(".ajax-error").text(msg);
dialog.modal();
};
var utils = {
url_path_join: url_path_join,
url_join_encode: url_join_encode,
encode_uri_components: encode_uri_components,
escape_html: escape_html,
get_body_data: get_body_data,
parse_url: parse_url,
browser: browser,
platform: platform,
ajax_error_msg: ajax_error_msg,
log_ajax_error: log_ajax_error,
ajax_error_dialog: ajax_error_dialog,
};
return utils;
});