hisat-3n/docs/assets/js/search.js
2025-01-18 21:09:52 +08:00

109 lines
3.1 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

$(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();
});
});
}