search almost done
This commit is contained in:
parent
9be79cf76f
commit
5b5995e2b5
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"cmake.configureOnOpen": false
|
||||||
|
}
|
@ -22,5 +22,5 @@ theme = "fiscleconsult"
|
|||||||
|
|
||||||
|
|
||||||
[outputs]
|
[outputs]
|
||||||
home = [ "HTML", "RSS", "SearchIndex" ]
|
home = ["HTML", "RSS", "JSON"]
|
||||||
page = ["HTML"]
|
page = ["HTML"]
|
@ -3,6 +3,7 @@ title: "Fiscale maatregelen van het Ministerie van Financiën in het kader van C
|
|||||||
date: 2020-01-26T23:11:13Z
|
date: 2020-01-26T23:11:13Z
|
||||||
summary: "Veel gestelde vragen (FAQ) over de (versoepelde) fiscale maatregelen van het Ministerie van Financiën in het kader van COVID-19"
|
summary: "Veel gestelde vragen (FAQ) over de (versoepelde) fiscale maatregelen van het Ministerie van Financiën in het kader van COVID-19"
|
||||||
image : https://via.placeholder.com/150
|
image : https://via.placeholder.com/150
|
||||||
|
tags: ["NL"]
|
||||||
---
|
---
|
||||||
|
|
||||||
**LOONBELASTING EN INKOMSTENBELASTING**
|
**LOONBELASTING EN INKOMSTENBELASTING**
|
||||||
|
10
themes/fiscleconsult/layouts/index.json
Normal file
10
themes/fiscleconsult/layouts/index.json
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{{- $.Scratch.Add "pagesIndex" slice -}}
|
||||||
|
{{- range $index, $page := .Site.Pages -}}
|
||||||
|
|
||||||
|
{{- if in (slice "category" ) $page.Type -}}
|
||||||
|
{{- if gt (len $page.Content) 0 -}}
|
||||||
|
{{- $pageData := (dict "title" $page.Title "href" $page.Permalink "categories" (delimit $page.Params.tags " ; ") "content" $page.Plain ) -}} {{- $.Scratch.Add "pagesIndex" $pageData -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- $.Scratch.Get "pagesIndex" | jsonify -}}
|
@ -11,7 +11,6 @@
|
|||||||
{{ $text }}
|
{{ $text }}
|
||||||
</a>
|
</a>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
<a href="javascript:void(0);" class="icon" onclick="myFunction()">
|
|
||||||
<i data-feather="menu" color="black"></i></a>
|
|
||||||
</nav>
|
</nav>
|
||||||
<br>
|
<br>
|
||||||
|
<!-- {{ partial "search.html" . }} -->
|
||||||
|
@ -18,3 +18,5 @@
|
|||||||
|
|
||||||
<!-- search -->
|
<!-- search -->
|
||||||
<script src="https://unpkg.com/lunr/lunr.js"></script>
|
<script src="https://unpkg.com/lunr/lunr.js"></script>
|
||||||
|
<!-- <script src="/js/search.js"></script> -->
|
||||||
|
<script src="/js/search2.js"></script>
|
17
themes/fiscleconsult/layouts/partials/search.html
Normal file
17
themes/fiscleconsult/layouts/partials/search.html
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
<form id="search" class="search" >
|
||||||
|
<label for="search-input">
|
||||||
|
<i data-feather="search"></i>
|
||||||
|
</label>
|
||||||
|
<input type="search" id="search-input" class="search-input">
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<template id="search-result" >
|
||||||
|
<article class="content post">
|
||||||
|
<h2 class="post-title"><a class="summary-title-link"></a></h2>
|
||||||
|
<summary class="summary"></summary>
|
||||||
|
<div class="read-more-container">
|
||||||
|
<a class="read-more-link">{{ i18n "readMore" }} »</a>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
</template>
|
159
themes/fiscleconsult/static/js/search.js
Normal file
159
themes/fiscleconsult/static/js/search.js
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
window.addEventListener("DOMContentLoaded", function(event)
|
||||||
|
{
|
||||||
|
var index = null;
|
||||||
|
var lookup = null;
|
||||||
|
var queuedTerm = null;
|
||||||
|
|
||||||
|
var form = document.getElementById("search");
|
||||||
|
var input = document.getElementById("search-input");
|
||||||
|
|
||||||
|
form.addEventListener("submit", function(event)
|
||||||
|
{
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
var term = input.value.trim();
|
||||||
|
if (!term)
|
||||||
|
return;
|
||||||
|
|
||||||
|
startSearch(term);
|
||||||
|
}, false);
|
||||||
|
|
||||||
|
function startSearch(term)
|
||||||
|
{
|
||||||
|
// Start icon animation.
|
||||||
|
form.setAttribute("data-running", "true");
|
||||||
|
|
||||||
|
if (index)
|
||||||
|
{
|
||||||
|
// Index already present, search directly.
|
||||||
|
search(term);
|
||||||
|
}
|
||||||
|
else if (queuedTerm)
|
||||||
|
{
|
||||||
|
// Index is being loaded, replace the term we want to search for.
|
||||||
|
queuedTerm = term;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Start loading index, perform the search when done.
|
||||||
|
queuedTerm = term;
|
||||||
|
initIndex();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function searchDone()
|
||||||
|
{
|
||||||
|
// Stop icon animation.
|
||||||
|
form.removeAttribute("data-running");
|
||||||
|
|
||||||
|
queuedTerm = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function initIndex()
|
||||||
|
{
|
||||||
|
var request = new XMLHttpRequest();
|
||||||
|
request.open("GET", "/index.json");
|
||||||
|
request.responseType = "json";
|
||||||
|
request.addEventListener("load", function(event)
|
||||||
|
{
|
||||||
|
lookup = {};
|
||||||
|
index = lunr(function()
|
||||||
|
{
|
||||||
|
// Uncomment the following line and replace de by the right language
|
||||||
|
// code to use a lunr language pack.
|
||||||
|
|
||||||
|
// this.use(lunr.nl);
|
||||||
|
|
||||||
|
this.ref("uri");
|
||||||
|
|
||||||
|
// If you added more searchable fields to the search index, list them here.
|
||||||
|
this.field("title");
|
||||||
|
this.field("content");
|
||||||
|
this.field("description");
|
||||||
|
this.field("categories");
|
||||||
|
|
||||||
|
for (var doc of request.response)
|
||||||
|
{
|
||||||
|
this.add(doc);
|
||||||
|
lookup[doc.uri] = doc;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Search index is ready, perform the search now
|
||||||
|
search(queuedTerm);
|
||||||
|
}, false);
|
||||||
|
request.addEventListener("error", searchDone, false);
|
||||||
|
request.send(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
function search(term)
|
||||||
|
{
|
||||||
|
var results = index.search(term);
|
||||||
|
console.log(results);
|
||||||
|
|
||||||
|
// The element where search results should be displayed, adjust as needed.
|
||||||
|
var target = document.querySelector("#search-result");
|
||||||
|
|
||||||
|
while (target.firstChild)
|
||||||
|
target.removeChild(target.firstChild);
|
||||||
|
|
||||||
|
var title = document.createElement("h1");
|
||||||
|
title.id = "search-results";
|
||||||
|
title.className = "list-title";
|
||||||
|
|
||||||
|
if (results.length == 0)
|
||||||
|
title.textContent = `No results found for “${term}”`;
|
||||||
|
else if (results.length == 1)
|
||||||
|
title.textContent = `Found one result for “${term}”`;
|
||||||
|
else
|
||||||
|
title.textContent = `Found ${results.length} results for “${term}”`;
|
||||||
|
target.appendChild(title);
|
||||||
|
document.title = title.textContent;
|
||||||
|
|
||||||
|
var template = document.getElementById("search-result");
|
||||||
|
for (var result of results)
|
||||||
|
{
|
||||||
|
var doc = lookup[result.ref];
|
||||||
|
|
||||||
|
// Fill out search result template, adjust as needed.
|
||||||
|
var element = template.content.cloneNode(true);
|
||||||
|
element.querySelector(".summary-title-link").href =
|
||||||
|
element.querySelector(".read-more-link").href = doc.uri;
|
||||||
|
element.querySelector(".summary-title-link").textContent = doc.title;
|
||||||
|
element.querySelector(".summary").textContent = truncate(doc.content, 70);
|
||||||
|
target.appendChild(element);
|
||||||
|
}
|
||||||
|
title.scrollIntoView(true);
|
||||||
|
|
||||||
|
searchDone();
|
||||||
|
}
|
||||||
|
|
||||||
|
// This matches Hugo's own summary logic:
|
||||||
|
// https://github.com/gohugoio/hugo/blob/b5f39d23b8/helpers/content.go#L543
|
||||||
|
function truncate(text, minWords)
|
||||||
|
{
|
||||||
|
var match;
|
||||||
|
var result = "";
|
||||||
|
var wordCount = 0;
|
||||||
|
var regexp = /(\S+)(\s*)/g;
|
||||||
|
while (match = regexp.exec(text))
|
||||||
|
{
|
||||||
|
wordCount++;
|
||||||
|
if (wordCount <= minWords)
|
||||||
|
result += match[0];
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var char1 = match[1][match[1].length - 1];
|
||||||
|
var char2 = match[2][0];
|
||||||
|
if (/[.?!"]/.test(char1) || char2 == "\n")
|
||||||
|
{
|
||||||
|
result += match[1];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
result += match[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}, false);
|
101
themes/fiscleconsult/static/js/search2.js
Normal file
101
themes/fiscleconsult/static/js/search2.js
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
let pagesIndex, searchIndex;
|
||||||
|
const MAX_SUMMARY_LENGTH = 100;
|
||||||
|
const SENTENCE_BOUNDARY_REGEX = /\b\.\s/gm;
|
||||||
|
const WORD_REGEX = /\b(\w*)[\W|\s|\b]?/gm;
|
||||||
|
|
||||||
|
|
||||||
|
async function initSearchIndex() {
|
||||||
|
try {
|
||||||
|
const response = await fetch("/index.json");
|
||||||
|
pagesIndex = await response.json();
|
||||||
|
searchIndex = lunr(function () {
|
||||||
|
this.field("title");
|
||||||
|
this.field("categories");
|
||||||
|
this.field("content");
|
||||||
|
this.ref("href");
|
||||||
|
pagesIndex.forEach(page => this.add(page));
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
initSearchIndex();
|
||||||
|
|
||||||
|
|
||||||
|
function getSearchResults(query) {
|
||||||
|
return searchIndex.search(query).flatMap((hit) => {
|
||||||
|
if (hit.ref == "undefined") return [];
|
||||||
|
let pageMatch = pagesIndex.filter((page) => page.href === hit.ref)[0];
|
||||||
|
pageMatch.score = hit.score;
|
||||||
|
return [pageMatch];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getLunrSearchQuery(query) {
|
||||||
|
const searchTerms = query.split(" ");
|
||||||
|
if (searchTerms.length === 1) {
|
||||||
|
return query;
|
||||||
|
}
|
||||||
|
query = "";
|
||||||
|
for (const term of searchTerms) {
|
||||||
|
query += `+${term} `;
|
||||||
|
}
|
||||||
|
return query.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
function searchSite(query) {
|
||||||
|
const originalQuery = query;
|
||||||
|
query = getLunrSearchQuery(query);
|
||||||
|
let results = getSearchResults(query);
|
||||||
|
return results.length
|
||||||
|
? results
|
||||||
|
: query !== originalQuery
|
||||||
|
? getSearchResults(originalQuery)
|
||||||
|
: [];
|
||||||
|
}
|
||||||
|
const node = document.getElementById("search-input");
|
||||||
|
node.addEventListener('keydown', function (event) {
|
||||||
|
if (event.code === 'Enter') {
|
||||||
|
event.preventDefault();
|
||||||
|
var q = node.value.trim().toLowerCase();
|
||||||
|
var res = searchSite(q);
|
||||||
|
console.log(res);
|
||||||
|
renderSearchResults(res, q);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function renderSearchResults(results, term){
|
||||||
|
|
||||||
|
var target = document.querySelector("#search-result");
|
||||||
|
while (target.firstChild)
|
||||||
|
target.removeChild(target.firstChild);
|
||||||
|
|
||||||
|
var title = document.createElement("h1");
|
||||||
|
title.id = "search-results";
|
||||||
|
title.className = "list-title";
|
||||||
|
|
||||||
|
if (results.length == 0)
|
||||||
|
title.textContent = `No results found for “${term}”`;
|
||||||
|
else if (results.length == 1)
|
||||||
|
title.textContent = `Found one result for “${term}”`;
|
||||||
|
else
|
||||||
|
title.textContent = `Found ${results.length} results for “${term}”`;
|
||||||
|
target.appendChild(title);
|
||||||
|
document.title = title.textContent;
|
||||||
|
|
||||||
|
var template = document.getElementById("search-result");
|
||||||
|
for (var result of results)
|
||||||
|
{
|
||||||
|
var doc = lookup[result.ref];
|
||||||
|
|
||||||
|
// Fill out search result template, adjust as needed.
|
||||||
|
var element = template.content.cloneNode(true);
|
||||||
|
element.querySelector(".summary-title-link").href =
|
||||||
|
element.querySelector(".read-more-link").href = doc.uri;
|
||||||
|
element.querySelector(".summary-title-link").textContent = doc.title;
|
||||||
|
element.querySelector(".summary").textContent = truncate(doc.content, 70);
|
||||||
|
target.appendChild(element);
|
||||||
|
}
|
||||||
|
title.scrollIntoView(true);
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user