Files
klammertext/sks/kutil/js/kutil.js

261 lines
7.2 KiB
JavaScript
Raw Normal View History

const K = (function() {
function get(selector_or_node) {
let result = selector_or_node;
if (typeof selector_or_node === "string") {
result = document.querySelector(selector_or_node);
}
//console.log("NODE: " + selector_or_node + " "
// + typeof result + " " + result.nodeName);
return result;
}
function getv(selector) {
return document.querySelectorAll(selector);
}
function visible(node, new_state) {
const nd = K.get(node);
if (!nd) { console.warn("K.visible: element not found:", node); return false; }
let result = nd;
if (new_state === "hide") {
nd.setAttribute("original-display", nd.style.display);
nd.style.display = "none";
} else if (new_state === "show") {
nd.style.display = nd.getAttribute("original-display");
} else if (new_state) {
alert("Klammertext: Bad visible state for function K.visible: "
+ new_state);
} else {
result = nd.style.display !== "none";
}
return result;
}
async function fetch_html(url) {
//console.log("fetch_html: " + url);
return await (await fetch(url)).text();
}
async function load(node, url) {
const nd = get(node);
nd.innerHTML = await fetch_html(url);
}
function width(node, new_width) {
let nd = K.get(node);
if (nd === null || typeof nd === 'undefined') {
console.warn("K.width: element not found:", node);
return 0;
}
let result;
if (new_width !== undefined) {
if (!nd.style) {
nd.style = {};
}
new_width = Math.max(0, new_width);
nd.style.width = new_width + "px";
result = new_width;
} else {
result = nd.offsetWidth;
}
return result;
}
function height(node, new_height) {
let nd = K.get(node);
if (nd === null) {
console.warn("K.height: element not found:", node);
return 0;
}
//console.log("height: " + node + " " + nd);
let result = nd;
if (new_height !== undefined) {
new_height = Math.max(0, new_height);
nd.style.height = new_height + "px";
result = new_height;
} else {
result = nd.offsetHeight;
}
return result;
}
function top(node) {
return K.get(node).getBoundingClientRect().top;
}
function bottom(node) {
return K.get(node).getBoundingClientRect().bottom;
}
function left(node) {
return K.get(node).getBoundingClientRect().left;
}
function right(node) {
return K.get(node).getBoundingClientRect().right;
}
function attr(node, attr_name, new_value) {
const nd = K.get(node);
if (!nd) { console.warn("K.attr: element not found:", node); return undefined; }
let result = new_value;
if (new_value) {
nd.setAttribute(attr_name, new_value);
} else {
result = nd.getAttribute(attr_name);
}
return result;
}
function map(selector, func) {
return [...(K.getv(selector))].map(func);
}
function has_class(node_or_vector, cls) {
if (!node_or_vector) { console.warn("K.has_class: null element"); return node_or_vector; }
let result;
if (node_or_vector.length) {
[...node_or_vector].map(function(elt) {
result = elt.classList.contains(cls);
});
} else {
result = node_or_vector.classList.contains(cls);
}
return result;
}
function add_class(node_or_vector, cls) {
if (!node_or_vector) { console.warn("K.add_class: null element"); return node_or_vector; }
if (node_or_vector.length) {
[...node_or_vector].map(function(elt) {
elt.classList.add(cls);
});
} else {
node_or_vector.classList.add(cls);
}
return node_or_vector;
}
function remove_class(node_or_vector, cls) {
if (!node_or_vector) { console.warn("K.remove_class: null element"); return node_or_vector; }
if (node_or_vector.length) {
[...node_or_vector].map(function(elt) {
elt.classList.remove(cls);
});
} else {
node_or_vector.classList.remove(cls);
}
return node_or_vector;
}
function text(node, new_text) {
let result = new_text;
if (new_text) {
K.get(node).textContent = new_text;
} else {
result = K.get(node).textContent;
}
return result;
}
function style(node, name, new_value) {
const nd = K.get(node);
let result;
if (new_value) {
nd.style.setProperty(name, new_value);
result = new_value;
} else {
result = window.getComputedStyle(nd).getPropertyValue(name);
}
return result;
}
function hpad(selector) {
const node = K.get(selector);
let result = parseInt(K.style(node, "padding-left"))
+ parseInt(K.style(node, "padding-right"));
return result;
}
return {add_class, attr, bottom, get, getv, has_class,
height, hpad, left, load, map, remove_class, right,
style, text, top, visible, width};
}());
function current_basename()
{
//var result = window.location.hash.toString().split("#")[1];
let parts = window.location.href.split("#");
let result;
if (parts.length > 1) {
result = parts[1];
} else {
result = "";
}
return result;
}
function search_not_active() {
return document.activeElement.getAttribute("id") !== "search_input";
}
function define_keypress(letter, id) {
let uppercase = letter.charCodeAt();
let lowercase = uppercase + 32;
K.get("html").addEventListener(
"keypress",
function (event) {
if (search_not_active()) {
if (event.which === uppercase || event.which === lowercase) {
K.get(id).click();
}
}
});
}
function update_page_title(element) {
let element_text = element.firstChild;
let regex = /((?:Part )?[0-9.]*)(.*)/;
let parts = regex.exec(element_text);
let title;
if (element_text) {
if (!parts[1]) {
title = parts[2].trim();
} else {
title = parts[1] + " - " + parts[2];
}
K.text("title", title);
}
}
//window.scrollY + document.querySelector('#elementId')
// .getBoundingClientRect().top // Y
function count_highlighted_toc_items() {
const highlighted = K.map(
".section-title",
function (o) {
return K.has_class(o, "highlight");
});
const count = highlighted.filter(
function (x) {
return x === true;
}).length;
return count;
}
function remove_toc_highlighting() {
[...K.getv(".section-title")].forEach(function (toc_item) {
K.remove_class(toc_item, "highlight");
});
}
function displayed_text() {
return K.get("#text") || K.get("#search_page") || K.get("#help_page");
}