hisat-3n/docs/assets/js/search.js

109 lines
3.1 KiB
JavaScript
Raw Normal View History

2025-01-18 13:09:52 +00:00
$(function () {
var query = getQuery(["q", "t", "a", "d"]);
var targets;
switch (query.key) {
case "t":
targets = ["tags"];
break;
case "a":
targets = ["author"];
break;
case "d":
targets = ["date"];
break;
case "q":
default:
targets = ["title", "tags", "author", "url", "date", "content"];
break;
}
showPosts(query.words, targets);
if (query.key == "q") {
$("#search").val(query.query).focus();
}
});
function getQuery(keys)
{
var query = "";
var key = "";
var words = [];
keys.forEach(function (queryKey) {
var regex = RegExp("[?&]" + queryKey + "=([^&]+)", 'i');
var matched;
if (matched = window.location.search.match(regex)) {
query = decodeURIComponent(matched[1]).replace(/( | |\+)+/g, ' ');
words = query.split(' ');
key = queryKey;
return false; // break;
}
return true; // continue;
});
return { query: query, key: key, words: words };
}
function showPosts(words, targets)
{
var getJson = function () {
var dfd = $.Deferred();
$.ajax({
url: baseurl + "/search.json",
dataType: "json",
timeout: 3000, // 3 sec
success: function (posts) {
var matchedPosts = [];
posts.forEach(function (post) {
// concatenate target fields as a string.
var searchee = "";
for (var i = 0; i < targets.length; i++) {
var target = post[targets[i]];
var targetString = "";
if (target instanceof Array) {
for (var j = 0; j < target.length; j++) {
targetString += target[j];
}
} else if (typeof target == "object") {
for (key in target) {
targetString += target[key];
}
} else {
targetString = target;
}
searchee += targetString;
}
// matching.
var matched = true;
words.forEach(function (word) {
var regex = new RegExp(word, 'i');
if (searchee.match(regex) == null) {
matched = false;
return false; // break;
}
return true; // continue;
});
if (matched) {
matchedPosts.push(post);
}
});
dfd.resolve(matchedPosts);
}
});
return dfd.promise();
};
getJson().then(function (matchedPosts) {
matchedPosts.forEach(function (post) {
$("#search-results").find("#" + post.id).show();
});
});
}