vnote/src/data/extra/web/js/utils.js
2020-12-22 04:40:32 -08:00

117 lines
3.4 KiB
JavaScript

class Utils {
constructor() {
}
static parentFolder(p_path) {
return p_path.substr(0, p_path.lastIndexOf('/'));
}
// @p_type: 'blob'/'text'.
static httpGet(p_url, p_type, p_callback) {
let xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET", p_url);
xmlHttp.responseType = p_type;
xmlHttp.onload = function() {
p_callback(xmlHttp.response);
};
xmlHttp.send(null);
}
static loadScript(p_src, p_callback) {
let script = document.createElement('script');
if (p_callback) {
script.onload = p_callback;
}
script.type = 'text/javascript';
script.src = p_src;
document.head.appendChild(script);
}
static loadScripts(p_srcs, p_callback) {
if (p_srcs.length == 1) {
this.loadScript(p_srcs[0], p_callback);
return;
}
let func = (function() {
let scriptsToLoad = p_srcs.length;
let callback = p_callback;
return function() {
--scriptsToLoad;
if (scriptsToLoad == 0) {
callback();
}
};
})();
let scriptsToLoad = p_srcs.length;
p_srcs.forEach((p_src) => {
this.loadScript(p_src, func);
});
}
// 'lang-' + ['cpp', 'md'] => ['lang-cpp', 'lang-md'].
static addPrefix(p_prefix, p_elements) {
let res = [];
p_elements.forEach(function(p_ele) {
res.push(p_prefix + p_ele);
});
return res;
}
// Check if @p_node contains source line info. If yes, add it to @p_newNode.
static checkSourceLine(p_node, p_newNode) {
if (p_node.classList.contains('source-line')) {
p_newNode.classList.add('source-line');
p_newNode.setAttribute('data-source-line', p_node.getAttribute('data-source-line'));
}
}
// Replace @p_node with @p_newNode.
static replaceNodeWithPreCheck(p_node, p_newNode) {
let childNode = p_node;
let parentNode = p_node.parentNode;
if (parentNode.tagName.toLowerCase() == 'pre') {
childNode = parentNode;
parentNode = parentNode.parentNode;
}
parentNode.replaceChild(p_newNode, childNode);
}
static viewPortRect() {
return {
left: document.documentElement.scrollLeft || document.body.scrollLeft || window.pageXOffset,
top: document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset,
width: document.documentElement.clientWidth || document.body.clientWidth,
height: document.documentElement.clientHeight || document.body.clientHeight
}
}
static nodeRectInContent(p_node) {
let rect = p_node.getBoundingClientRect();
let vrect = this.viewPortRect();
return {
left: vrect.left + rect.left,
top: vrect.top + rect.top,
width: rect.width,
height: rect.height
};
}
static isVisible(p_node) {
let rect = p_node.getBoundingClientRect();
let vrect = this.viewPortRect();
if (rect.top < 0 || rect.left < 0
|| rect.bottom > vrect.height || rect.right > vrect.width) {
return false;
}
return true;
}
static headingSequenceRegExp() {
return /^\d(?:\.\d)*\.? /;
}
}