From 72117c20ecb0e08eca67a03081ad9e3cb6a41f14 Mon Sep 17 00:00:00 2001
From: weru <onewesh@gmail.com>
Date: Mon, 30 Nov 2020 18:03:41 +0000
Subject: [PATCH] update search helpers

---
 assets/js/search.js |   85 +++++++++++++++++++++++++++++++-----------
 1 files changed, 63 insertions(+), 22 deletions(-)

diff --git a/assets/js/search.js b/assets/js/search.js
index f72a2d0..ac0dc8a 100644
--- a/assets/js/search.js
+++ b/assets/js/search.js
@@ -9,6 +9,9 @@
 ];
 
 const searchKeys = ['title', 'link', 'body', 'id'];
+
+const searchPageElement = elem('#searchpage');
+
 const searchOptions = {
   ignoreLocation: true,
   findAllMatches: true,
@@ -23,18 +26,37 @@
 function searchResults(results=[], query="") {
   let resultsFragment = new DocumentFragment();
   let showResults = elem('.search_results');
+  if(searchPageElement) {
+    showResults = searchPageElement;
+  }
   emptyEl(showResults);
   if(results.length) {
     let resultsTitle = createEl('h3');
     resultsTitle.className = 'search_title';
     resultsTitle.innerText = 'Quick Links';
+    if(searchPageElement) {
+      resultsTitle.innerText = 'Search Results';
+    }
     resultsFragment.appendChild(resultsTitle);
     results.slice(0,4).forEach(function(result){
       let item = createEl('a');
       item.href = `${result.link}?query=${query}`;
       item.className = 'search_result';
-      item.textContent = result.title;
       item.style.order = result.score;
+      if(searchPageElement) {
+        pushClass(item, 'passive');
+        let itemTitle = createEl('h3');
+        itemTitle.textContent = result.title;
+        item.appendChild(itemTitle);
+
+        let itemDescription = createEl('p');
+        // position of first search term instance
+        let queryInstance = result.body.indexOf(query);
+        itemDescription.textContent = `... ${result.body.substring(queryInstance, queryInstance + 200)} ...`;
+        item.appendChild(itemDescription);
+      } else {
+        item.textContent = result.title;
+      }
       resultsFragment.appendChild(item);
     });
   } else {
@@ -43,27 +65,35 @@
   showResults.appendChild(resultsFragment);
 }
 
-function search(){
+function search(searchTerm) {
+  // check if searchTerm can be cast as float
+  const isFloat = parseFloat(searchTerm);
+  const minimumSearchTermLength = isFloat ? 2 : 3;
+  if(searchTerm.length >= minimumSearchTermLength) {
+    let rawResults = index.search(searchTerm);
+    rawResults = rawResults.map(function(result){
+      const score = result.score;
+      const resultItem = result.item;
+      resultItem.score = (parseFloat(score) * 50).toFixed(0);
+      return resultItem;
+    });
+    searchResults(rawResults, searchTerm);
+  } else {
+    searchResults();
+  }
+}
+
+function liveSearch() {
   const searchField = elem('.search_field');
 
   if (searchField) {
     searchField.addEventListener('input', function() {
-      const searchTerm = this.value.trim().toLowerCase();
-      // check if searchTerm can be cast as float
-      const isFloat = parseFloat(searchTerm);
-      const minimumSearchTermLength = isFloat ? 2 : 3;
-      if(searchTerm.length >= minimumSearchTermLength) {
-        let rawResults = index.search(searchTerm);
-        rawResults = rawResults.map(function(result){
-          const score = result.score;
-          const resultItem = result.item;
-          resultItem.score = (parseFloat(score) * 50).toFixed(0);
-          return resultItem;
-        });
-        searchResults(rawResults, searchTerm);
-      } else {
-        searchResults();
-      }
+      const searchTerm = searchField.value.trim().toLowerCase();
+      search(searchTerm);
+    });
+    searchField.addEventListener('search', function(){
+      const searchTerm = searchField.value.trim().toLowerCase();
+      window.location.href = `${parentURL}/search/?query=${searchTerm}`;
     });
   }
 }
@@ -80,12 +110,23 @@
   return ["",""];
 }
 
+function passiveSearch() {
+  if(searchPageElement) {
+    const searchTerm = findQuery()[0];
+    search(searchTerm);
+  }
+}
+
 let main = elem('main');
 if(!main) {
   main = elem('.main');
 }
-const searchQuery = findQuery();
-wrapText(searchQuery[0],main);
-wrapText(searchQuery[1],main);
 
-window.addEventListener('load', () => search());
\ No newline at end of file
+window.addEventListener('load', function() {
+  searchPageElement ? false : liveSearch();
+  passiveSearch();
+
+  const searchQuery = findQuery();
+  wrapText(searchQuery[0],main);
+  wrapText(searchQuery[1],main);
+});
\ No newline at end of file

--
Gitblit v1.10.0