109 lines
3.1 KiB
JavaScript
109 lines
3.1 KiB
JavaScript
$(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();
|
||
});
|
||
});
|
||
}
|