function isObj(obj) { return (obj && typeof obj === 'object' && obj !== null) ? true : false; } function createEl(element = 'div') { return document.createElement(element); } function emptyEl(el) { while(el.firstChild) el.removeChild(el.firstChild); } function elem(selector, parent = document){ let elem = isObj(parent) ? parent.querySelector(selector) : false; return elem ? elem : false; } function elems(selector, parent = document) { let elems = isObj(parent) ? parent.querySelectorAll(selector) : []; return elems.length ? elems : false; } function pushClass(el, targetClass) { if (isObj(el) && targetClass) { let elClass = el.classList; elClass.contains(targetClass) ? false : elClass.add(targetClass); } } function deleteClass(el, targetClass) { if (isObj(el) && targetClass) { let elClass = el.classList; elClass.contains(targetClass) ? elClass.remove(targetClass) : false; } } function modifyClass(el, targetClass) { if (isObj(el) && targetClass) { const elClass = el.classList; elClass.contains(targetClass) ? elClass.remove(targetClass) : elClass.add(targetClass); } } function containsClass(el, targetClass) { if (isObj(el) && targetClass && el !== document ) { return el.classList.contains(targetClass) ? true : false; } } function isChild(node, parentClass) { let objectsAreValid = isObj(node) && parentClass && typeof parentClass == 'string'; return (objectsAreValid && node.closest(parentClass)) ? true : false; } function elemAttribute(elem, attr, value = null) { if (value) { elem.setAttribute(attr, value); } else { value = elem.getAttribute(attr); return value ? value : false; } } function deleteChars(str, subs) { let newStr = str; if (Array.isArray(subs)) { for (let i = 0; i < subs.length; i++) { newStr = newStr.replace(subs[i], ''); } } else { newStr = newStr.replace(subs, ''); } return newStr; } function isBlank(str) { return (!str || str.trim().length === 0); } function isMatch(element, selectors) { if(isObj(element)) { if(selectors.isArray) { let matching = selectors.map(function(selector){ return element.matches(selector) }) return matching.includes(true); } return element.matches(selectors) } } function closestInt(goal, collection) { const closest = collection.reduce(function(prev, curr) { return (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev); }); return closest; } function hasClasses(el) { if(isObj(el)) { const classes = el.classList; return classes.length } } function wrapEl(el, wrapper) { el.parentNode.insertBefore(wrapper, el); wrapper.appendChild(el); } function wrapText(text, context, wrapper = 'mark') { let open = `<${wrapper}>`; let close = ``; function wrap(context) { let c = context.innerHTML; let pattern = new RegExp(text, "gi"); let matches = text.length ? c.match(pattern) : null; if(matches) { matches.forEach(function(matchStr){ c = c.replaceAll(matchStr, `${open}${matchStr}${close}`); context.innerHTML = c; }); } } const contents = ["h1", "h2", "h3", "h4", "h5", "h6", "p", "code", "td"]; contents.forEach(function(c){ const cs = elems(c, context); if(cs.length) { cs.forEach(function(cx){ if(cx.children.length >= 1) { wrap(cx); Array.from(cx.children).forEach(function(child){ wrap(child); }) } else { wrap(cx); } // sanitize urls and ids }); } }); const hyperLinks = elems('a'); if(hyperLinks) { hyperLinks.forEach(function(link){ const href = link.href.replaceAll(encodeURI(open), "").replaceAll(encodeURI(close), ""); link.href = href; }); } }