From e92f6ced66fb25a6730264a7515f76099c540679 Mon Sep 17 00:00:00 2001
From: weru <onewesh@gmail.com>
Date: Mon, 05 Oct 2020 20:12:31 +0000
Subject: [PATCH] refactor
---
assets/js/search.js | 84 +++++++++++
assets/js/index.js | 179 +------------------------
assets/js/functions.js | 108 +++++++++++++++
3 files changed, 199 insertions(+), 172 deletions(-)
diff --git a/assets/js/functions.js b/assets/js/functions.js
new file mode 100644
index 0000000..abeffb6
--- /dev/null
+++ b/assets/js/functions.js
@@ -0,0 +1,108 @@
+const parentURL = '{{ absURL "" }}';
+const doc = document.documentElement;
+
+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
+ }
+}
\ No newline at end of file
diff --git a/assets/js/index.js b/assets/js/index.js
index ffc8c5d..a7e6b9f 100644
--- a/assets/js/index.js
+++ b/assets/js/index.js
@@ -1,113 +1,7 @@
-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 calcNavHeight(){
const nav = elem('.nav_header');
const navHeight = nav.offsetHeight + 25;
- const docContent = elem('main');
+ const docContent = elem('main');
docContent.style.paddingTop = `${navHeight}px`;
return navHeight;
})();
@@ -118,7 +12,7 @@
codeBlocks.forEach(function(codeBlock){
if(!hasClasses(codeBlock)) {
codeBlock.children.length ? false : pushClass(codeBlock, 'noClass');
- }
+ }
});
}
})();
@@ -144,10 +38,6 @@
};
function loadActions() {
-
- const parentURL = '{{ absURL "" }}';
- const doc = document.documentElement;
-
(function updateDate() {
const date = new Date();
const year = date.getFullYear();
@@ -165,10 +55,10 @@
pushClass(toc, 'toc');
if(toc.children.length >= 1) {
const tocItems = Array.from(toc.children[0].children);
-
+
const previousHeading = toc.previousElementSibling;
previousHeading.matches('.active') ? pushClass(toc, tocActive) : false;
-
+
tocItems.forEach(function(item){
pushClass(item, 'toc_item');
pushClass(item.firstElementChild, 'toc_link');
@@ -184,13 +74,13 @@
const pageIds = pageInternalLinks.map(function(link){
return link.hash;
});
-
+
const linkPositions = pageIds.map(function(id){
const heading = elem(id);
const position = heading.offsetTop;
return position;
});
-
+
pageInternalLinks.forEach(function(link, index){
link.dataset.position = linkPositions[index]
});
@@ -206,57 +96,6 @@
}
})();
- function searchResults(results=[], order =[]) {
- let resultsFragment = new DocumentFragment();
- let showResults = elem('.search_results');
- emptyEl(showResults);
- let index = 0
- results.forEach(function(result){
- let item = createEl('a');
- item.href = result.link;
- item.className = 'search_result';
- item.textContent = result.title;
- item.style.order = order[index];
- resultsFragment.appendChild(item);
- index += 1
- });
-
- showResults.appendChild(resultsFragment);
- }
-
- (function search(){
- const searchField = elem('.search_field');
-
- if (searchField) {
- searchField.addEventListener('input', function() {
- let rawResults = idx.search(`${ this.value }`).slice(0,6);
- let refs = rawResults.map(function(ref){
- // return id and score in a single string
- return `${ref.ref}:${ref.score}`;
- });
-
- let ids = refs.map(function(id){
- let positionOfSeparator = id.indexOf(":");
- id = id.substring(0,positionOfSeparator)
- return Number(id);
- });
-
- let scores = refs.map(function(score){
- let positionOfSeparator = score.indexOf(":");
- score = score.substring((positionOfSeparator + 1), (score.length - 1));
- return (parseFloat(score) * 50).toFixed(0);
- });
-
- let matchedDocuments = simpleIndex.filter(function(doc){
- return ids.includes(doc.id);
- });
-
- matchedDocuments.length >= 1 ? searchResults(matchedDocuments, scores) : false;
- });
- }
-
- })();
-
(function markExternalLinks(){
let links = elems('a');
const contentWrapperClass = '.content';
@@ -265,7 +104,6 @@
let target, rel, blank, noopener, attr1, attr2, url, isExternal;
url = elemAttribute(link, 'href');
isExternal = (url && typeof url == 'string' && url.startsWith('http')) && !url.startsWith(parentURL) && link.closest(contentWrapperClass);
- index === 1 ? console.log(parentURL) : false;
if(isExternal) {
target = 'target';
rel = 'rel';
@@ -290,7 +128,7 @@
results = document.getElementsByTagName(tag);
Array.prototype.push.apply(headingNodes, results);
});
-
+
function sanitizeURL(url) {
// removes any existing id on url
const hash = '#';
@@ -372,11 +210,10 @@
(function lazyLoadImages() {
const images = elems('img');
images.forEach(function(image){
- // supported natively by most modern browsers.
+ // supported natively by most modern browsers.
image.loading = "lazy";
});
})();
-
}
window.addEventListener('load', loadActions());
diff --git a/assets/js/search.js b/assets/js/search.js
index e2608fe..5ddacc1 100644
--- a/assets/js/search.js
+++ b/assets/js/search.js
@@ -9,7 +9,7 @@
"id": "{{ $index }}",
"link": "{{ .Permalink }}",
"title": "{{ .Title }}",
- "body": "{{ .PlainWords }}",
+ "body": "{{ .PlainWords }}".toLowerCase(),
});
{{ end }}
});
@@ -23,3 +23,85 @@
},
{{ end }}
];
+
+function searchResults(results=[], order =[],query="") {
+ let resultsFragment = new DocumentFragment();
+ let showResults = elem('.search_results');
+ emptyEl(showResults);
+ let index = 0
+ if(results.length) {
+ let resultsTitle = createEl('h3');
+ resultsTitle.className = 'search_title';
+ resultsTitle.innerText = 'Quick Links';
+ resultsFragment.appendChild(resultsTitle);
+ results.slice(0,6).forEach(function(result){
+ let item = createEl('a');
+ item.href = `${result.link}?query=${query}`;
+ item.className = 'search_result';
+ item.textContent = result.title;
+ item.style.order = order[index];
+ resultsFragment.appendChild(item);
+ index += 1
+ });
+ } else {
+ showResults.innerHTML = "";
+ }
+ showResults.appendChild(resultsFragment);
+}
+
+function search(){
+ const searchField = elem('.search_field');
+
+ if (searchField) {
+ searchField.addEventListener('input', function(event) {
+ const searchTerm = this.value.trim().replaceAll(" ", " +").toLowerCase();
+ if(searchTerm.length >= 3) {
+ let rawResults = idx.search(`+${searchTerm}`);
+
+ console.log(rawResults, searchTerm);
+
+ if(rawResults.length) {
+
+ let refs = rawResults.map(function(ref){
+ // return id and score in a single string
+ return `${ref.ref}:${ref.score}`;
+ });
+
+ let ids = refs.map(function(id){
+ let positionOfSeparator = id.indexOf(":");
+ id = id.substring(0,positionOfSeparator)
+ return Number(id);
+ });
+
+ let scores = refs.map(function(score){
+ let positionOfSeparator = score.indexOf(":");
+ score = score.substring((positionOfSeparator + 1), (score.length - 1));
+ return (parseFloat(score) * 50).toFixed(0);
+ });
+
+ console.log(scores, 'scores is');
+
+ let matchedDocuments = simpleIndex.filter(function(doc){
+ return ids.includes(doc.id);
+ });
+
+ console.log('matches are', matchedDocuments);
+
+ matchedDocuments.length >= 1 ? searchResults(matchedDocuments, scores,searchTerm) : false;
+ } else {
+ searchResults();
+ }
+
+ } else {
+ searchResults();
+ }
+ });
+ }
+}
+
+let alltext = doc.innerHTML;
+console.log(typeof alltext);
+// doc.innerHTML = alltext.replaceAll('is', '<span class="is">is</span>');
+
+
+window.addEventListener('load', () => search());
\ No newline at end of file
--
Gitblit v1.10.0