mirror of
https://github.com/tjtanjin/QuickTax.git
synced 2024-12-02 07:43:22 +01:00
105 lines
2.9 KiB
JavaScript
105 lines
2.9 KiB
JavaScript
|
(function () {
|
||
|
function getQueryVariable(variable) {
|
||
|
var query = window.location.search.substring(1),
|
||
|
vars = query.split("&");
|
||
|
|
||
|
for (var i = 0; i < vars.length; i++) {
|
||
|
var pair = vars[i].split("=");
|
||
|
|
||
|
if (pair[0] === variable) {
|
||
|
return decodeURIComponent(pair[1].replace(/\+/g, '%20')).trim();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function getPreview(query, content, previewLength) {
|
||
|
previewLength = previewLength || (content.length * 2);
|
||
|
|
||
|
var parts = query.split(" "),
|
||
|
match = content.toLowerCase().indexOf(query.toLowerCase()),
|
||
|
matchLength = query.length,
|
||
|
preview;
|
||
|
|
||
|
// Find a relevant location in content
|
||
|
for (var i = 0; i < parts.length; i++) {
|
||
|
if (match >= 0) {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
match = content.toLowerCase().indexOf(parts[i].toLowerCase());
|
||
|
matchLength = parts[i].length;
|
||
|
}
|
||
|
|
||
|
// Create preview
|
||
|
if (match >= 0) {
|
||
|
var start = match - (previewLength / 2),
|
||
|
end = start > 0 ? match + matchLength + (previewLength / 2) : previewLength;
|
||
|
|
||
|
preview = content.substring(start, end).trim();
|
||
|
|
||
|
if (start > 0) {
|
||
|
preview = "..." + preview;
|
||
|
}
|
||
|
|
||
|
if (end < content.length) {
|
||
|
preview = preview + "...";
|
||
|
}
|
||
|
|
||
|
// Highlight query parts
|
||
|
preview = preview.replace(new RegExp("(" + parts.join("|") + ")", "gi"), "<strong>$1</strong>");
|
||
|
} else {
|
||
|
// Use start of content if no match found
|
||
|
preview = content.substring(0, previewLength).trim() + (content.length > previewLength ? "..." : "");
|
||
|
}
|
||
|
|
||
|
return preview;
|
||
|
}
|
||
|
|
||
|
function displaySearchResults(results, query) {
|
||
|
var searchResultsEl = document.getElementById("search-results"),
|
||
|
searchProcessEl = document.getElementById("search-process");
|
||
|
|
||
|
if (results.length) {
|
||
|
var resultsHTML = "";
|
||
|
results.forEach(function (result) {
|
||
|
|
||
|
var item = window.data[result.ref]
|
||
|
if (item.title) {
|
||
|
contentPreview = getPreview(query, item.content, 170),
|
||
|
titlePreview = getPreview(query, item.title);
|
||
|
resultsHTML += "<li><h4><a href='/quicktax" + item.url.trim() + "'>" + titlePreview + "</a></h4><p><small>" + contentPreview + "</small></p></li>";
|
||
|
}
|
||
|
});
|
||
|
|
||
|
searchResultsEl.innerHTML = resultsHTML;
|
||
|
searchProcessEl.innerText = "Showing";
|
||
|
} else {
|
||
|
searchResultsEl.style.display = "none";
|
||
|
searchProcessEl.innerText = "No";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
window.index = lunr(function () {
|
||
|
this.field("id");
|
||
|
this.field("title", {boost: 10});
|
||
|
this.field("categories");
|
||
|
this.field("url");
|
||
|
this.field("content");
|
||
|
});
|
||
|
|
||
|
var query = decodeURIComponent((getQueryVariable("q") || "").replace(/\+/g, "%20")),
|
||
|
searchQueryContainerEl = document.getElementById("search-query-container"),
|
||
|
searchQueryEl = document.getElementById("search-query");
|
||
|
|
||
|
searchQueryEl.innerText = query;
|
||
|
if (query != ""){
|
||
|
searchQueryContainerEl.style.display = "inline";
|
||
|
}
|
||
|
|
||
|
for (var key in window.data) {
|
||
|
window.index.add(window.data[key]);
|
||
|
}
|
||
|
|
||
|
displaySearchResults(window.index.search(query), query); // Hand the results off to be displayed
|
||
|
})();
|