Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/jeremybise/twentynineteen-hugo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Bise <jeremy.bise@thosegeeks.com>2019-04-26 20:24:47 +0300
committerJeremy Bise <jeremy.bise@thosegeeks.com>2019-04-26 20:24:47 +0300
commit6d5f86255b13b1394c8940bdd5c854076e9dd3a0 (patch)
treeb738df8b789d70fdc1556f8e8b3b125f60652032
parentc75e6e0b7595d5fb56d10df17b7bc1c63384e2d0 (diff)
variable URL for search.json
-rw-r--r--layouts/_default/search.html132
-rw-r--r--static/js/search.js128
2 files changed, 131 insertions, 129 deletions
diff --git a/layouts/_default/search.html b/layouts/_default/search.html
index d2a1738..bfd8f3e 100644
--- a/layouts/_default/search.html
+++ b/layouts/_default/search.html
@@ -32,5 +32,135 @@
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fuse.js/3.2.0/fuse.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/jquery.mark.min.js"></script>
- <script src="{{ "js/search.js" | absURL }}"></script>
+
+ <script>
+ summaryInclude = 60;
+ var fuseOptions = {
+ shouldSort: true,
+ includeMatches: true,
+ threshold: 0.0,
+ tokenize: true,
+ location: 0,
+ distance: 100,
+ maxPatternLength: 32,
+ minMatchCharLength: 1,
+ keys: [
+ { name: "title", weight: 0.8 },
+ { name: "contents", weight: 0.5 },
+ { name: "tags", weight: 0.3 },
+ { name: "categories", weight: 0.3 }
+ ]
+ };
+
+ var searchQuery = param("s");
+ if (searchQuery) {
+ $("#search-query").val(searchQuery);
+ executeSearch(searchQuery);
+ } else {
+ $("#search-results").append("<p>Please enter a word or phrase above</p>");
+ }
+
+ function executeSearch(searchQuery) {
+ $.getJSON({{ "/index.json" | absURL }}, function(data) {
+ var pages = data;
+ var fuse = new Fuse(pages, fuseOptions);
+ var result = fuse.search(searchQuery);
+ console.log({ matches: result });
+ if (result.length > 0) {
+ populateResults(result);
+ } else {
+ $("#search-results").append(
+ "<article class='post entry'><div class='entry-content'>No matches found</div></article>"
+ );
+ }
+ });
+ }
+
+ function populateResults(result) {
+ $.each(result, function(key, value) {
+ var contents = value.item.contents;
+ var snippet = "";
+ var snippetHighlights = [];
+ var tags = [];
+ if (fuseOptions.tokenize) {
+ snippetHighlights.push(searchQuery);
+ } else {
+ $.each(value.matches, function(matchKey, mvalue) {
+ if (mvalue.key == "tags" || mvalue.key == "categories") {
+ snippetHighlights.push(mvalue.value);
+ } else if (mvalue.key == "contents") {
+ start =
+ mvalue.indices[0][0] - summaryInclude > 0
+ ? mvalue.indices[0][0] - summaryInclude
+ : 0;
+ end =
+ mvalue.indices[0][1] + summaryInclude < contents.length
+ ? mvalue.indices[0][1] + summaryInclude
+ : contents.length;
+ snippet += contents.substring(start, end);
+ snippetHighlights.push(
+ mvalue.value.substring(
+ mvalue.indices[0][0],
+ mvalue.indices[0][1] - mvalue.indices[0][0] + 1
+ )
+ );
+ }
+ });
+ }
+
+ if (snippet.length < 1) {
+ snippet += contents.substring(0, summaryInclude * 2);
+ }
+ //pull template from hugo templarte definition
+ var templateDefinition = $("#search-result-template").html();
+ //replace values
+ var output = render(templateDefinition, {
+ key: key,
+ title: value.item.title,
+ link: value.item.permalink,
+ tags: value.item.tags,
+ categories: value.item.categories,
+ snippet: snippet
+ });
+ $("#search-results").append(output);
+
+ $.each(snippetHighlights, function(snipkey, snipvalue) {
+ $("#summary-" + key).mark(snipvalue);
+ });
+ });
+ }
+
+ function param(name) {
+ return decodeURIComponent(
+ (location.search.split(name + "=")[1] || "").split("&")[0]
+ ).replace(/\+/g, " ");
+ }
+
+ function render(templateString, data) {
+ var conditionalMatches, conditionalPattern, copy;
+ conditionalPattern = /\$\{\s*isset ([a-zA-Z]*) \s*\}(.*)\$\{\s*end\s*}/g;
+ //since loop below depends on re.lastInxdex, we use a copy to capture any manipulations whilst inside the loop
+ copy = templateString;
+ while (
+ (conditionalMatches = conditionalPattern.exec(templateString)) !== null
+ ) {
+ if (data[conditionalMatches[1]]) {
+ //valid key, remove conditionals, leave contents.
+ copy = copy.replace(conditionalMatches[0], conditionalMatches[2]);
+ } else {
+ //not valid, remove entire section
+ copy = copy.replace(conditionalMatches[0], "");
+ }
+ }
+ templateString = copy;
+ //now any conditionals removed we can do simple substitution
+ var key, find, re;
+ for (key in data) {
+ find = "\\$\\{\\s*" + key + "\\s*\\}";
+ re = new RegExp(find, "g");
+ templateString = templateString.replace(re, data[key]);
+ }
+ return templateString;
+ }
+ </script>
{{ end }}
diff --git a/static/js/search.js b/static/js/search.js
deleted file mode 100644
index 17ac0f9..0000000
--- a/static/js/search.js
+++ /dev/null
@@ -1,128 +0,0 @@
-summaryInclude = 60;
-var fuseOptions = {
- shouldSort: true,
- includeMatches: true,
- threshold: 0.0,
- tokenize: true,
- location: 0,
- distance: 100,
- maxPatternLength: 32,
- minMatchCharLength: 1,
- keys: [
- { name: "title", weight: 0.8 },
- { name: "contents", weight: 0.5 },
- { name: "tags", weight: 0.3 },
- { name: "categories", weight: 0.3 }
- ]
-};
-
-var searchQuery = param("s");
-if (searchQuery) {
- $("#search-query").val(searchQuery);
- executeSearch(searchQuery);
-} else {
- $("#search-results").append("<p>Please enter a word or phrase above</p>");
-}
-
-function executeSearch(searchQuery) {
- $.getJSON("/index.json", function(data) {
- var pages = data;
- var fuse = new Fuse(pages, fuseOptions);
- var result = fuse.search(searchQuery);
- console.log({ matches: result });
- if (result.length > 0) {
- populateResults(result);
- } else {
- $("#search-results").append(
- "<article class='post entry'><div class='entry-content'>No matches found</div></article>"
- );
- }
- });
-}
-
-function populateResults(result) {
- $.each(result, function(key, value) {
- var contents = value.item.contents;
- var snippet = "";
- var snippetHighlights = [];
- var tags = [];
- if (fuseOptions.tokenize) {
- snippetHighlights.push(searchQuery);
- } else {
- $.each(value.matches, function(matchKey, mvalue) {
- if (mvalue.key == "tags" || mvalue.key == "categories") {
- snippetHighlights.push(mvalue.value);
- } else if (mvalue.key == "contents") {
- start =
- mvalue.indices[0][0] - summaryInclude > 0
- ? mvalue.indices[0][0] - summaryInclude
- : 0;
- end =
- mvalue.indices[0][1] + summaryInclude < contents.length
- ? mvalue.indices[0][1] + summaryInclude
- : contents.length;
- snippet += contents.substring(start, end);
- snippetHighlights.push(
- mvalue.value.substring(
- mvalue.indices[0][0],
- mvalue.indices[0][1] - mvalue.indices[0][0] + 1
- )
- );
- }
- });
- }
-
- if (snippet.length < 1) {
- snippet += contents.substring(0, summaryInclude * 2);
- }
- //pull template from hugo templarte definition
- var templateDefinition = $("#search-result-template").html();
- //replace values
- var output = render(templateDefinition, {
- key: key,
- title: value.item.title,
- link: value.item.permalink,
- tags: value.item.tags,
- categories: value.item.categories,
- snippet: snippet
- });
- $("#search-results").append(output);
-
- $.each(snippetHighlights, function(snipkey, snipvalue) {
- $("#summary-" + key).mark(snipvalue);
- });
- });
-}
-
-function param(name) {
- return decodeURIComponent(
- (location.search.split(name + "=")[1] || "").split("&")[0]
- ).replace(/\+/g, " ");
-}
-
-function render(templateString, data) {
- var conditionalMatches, conditionalPattern, copy;
- conditionalPattern = /\$\{\s*isset ([a-zA-Z]*) \s*\}(.*)\$\{\s*end\s*}/g;
- //since loop below depends on re.lastInxdex, we use a copy to capture any manipulations whilst inside the loop
- copy = templateString;
- while (
- (conditionalMatches = conditionalPattern.exec(templateString)) !== null
- ) {
- if (data[conditionalMatches[1]]) {
- //valid key, remove conditionals, leave contents.
- copy = copy.replace(conditionalMatches[0], conditionalMatches[2]);
- } else {
- //not valid, remove entire section
- copy = copy.replace(conditionalMatches[0], "");
- }
- }
- templateString = copy;
- //now any conditionals removed we can do simple substitution
- var key, find, re;
- for (key in data) {
- find = "\\$\\{\\s*" + key + "\\s*\\}";
- re = new RegExp(find, "g");
- templateString = templateString.replace(re, data[key]);
- }
- return templateString;
-}