89 lines
3.1 KiB
JavaScript
89 lines
3.1 KiB
JavaScript
(function($){
|
|
|
|
/* Adapted from http://www.kryogenix.org/code/browser/searchhi/ */
|
|
$.fn.highlightText = function(text, className, caseSensitive) {
|
|
function highlight(node) {
|
|
if (node.nodeType == 3) { // Node.TEXT_NODE
|
|
var val = node.nodeValue;
|
|
var pos = (caseSensitive ? val : val.toLowerCase()).indexOf(text);
|
|
if (pos >= 0 && !$(node.parentNode).hasClass(className)) {
|
|
var span = document.createElement("span");
|
|
span.className = className;
|
|
var txt = document.createTextNode(val.substr(pos, text.length));
|
|
span.appendChild(txt);
|
|
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
|
|
document.createTextNode(val.substr(pos + text.length)),
|
|
node.nextSibling));
|
|
node.nodeValue = val.substr(0, pos);
|
|
}
|
|
} else if (!$(node).is("button, select, textarea")) {
|
|
$.each(node.childNodes, function() { highlight(this) });
|
|
}
|
|
}
|
|
return this.each(function() { highlight(this) });
|
|
}
|
|
|
|
$(document).ready(function() {
|
|
var elems = $(".searchable");
|
|
if (!elems.length) return;
|
|
|
|
function getSearchTerms(url) {
|
|
if (url.indexOf("?") == -1) return [];
|
|
var params = url.substr(url.indexOf("?") + 1).split("&");
|
|
for (var p in params) {
|
|
var param = params[p].split("=");
|
|
if (param.length < 2) continue;
|
|
if (param[0] == "q" || param[0] == "p") {// q= for Google, p= for Yahoo
|
|
var query = decodeURIComponent(param[1].replace(/\+/g, " "));
|
|
if (query[0] == "!") query = query.slice(1);
|
|
var terms = [];
|
|
$.each(query.split(/(".*?"|'.*?'|\s+)/), function() {
|
|
if (terms.length < 10) {
|
|
term = this.replace(/^\s+$/, "")
|
|
.replace(/^['"]/, "")
|
|
.replace(/['"]$/, "");
|
|
if (term.length >= 3)
|
|
terms.push(term);
|
|
}
|
|
});
|
|
return terms;
|
|
}
|
|
}
|
|
return [];
|
|
}
|
|
|
|
var terms = getSearchTerms(document.URL);
|
|
if (!terms.length) terms = getSearchTerms(document.referrer);
|
|
if (terms.length) {
|
|
$.each(terms, function(idx) {
|
|
elems.highlightText(this.toLowerCase(), "searchword" + (idx % 5));
|
|
});
|
|
} else {
|
|
function scrollToHashSearchMatch() {
|
|
var h = window.location.hash;
|
|
var direction = h[1];
|
|
var case_insensitive = h.match(/\/i$/);
|
|
if (direction == '/' || direction == '?') {
|
|
var hterm = h.substr(2);
|
|
if (case_insensitive)
|
|
hterm = hterm.substr(0, hterm.length - 2).toLowerCase();
|
|
$('.searchword0').each(function() {
|
|
$(this).after($(this).html()).remove();
|
|
});
|
|
elems.highlightText(hterm, "searchword0", !case_insensitive);
|
|
var hmatches = $('.searchword0');
|
|
if (direction == '?')
|
|
hmatches = hmatches.last();
|
|
hmatches.first().each(function() {
|
|
var offset = $(this).offset().top;
|
|
window.scrollTo(0, offset);
|
|
});
|
|
}
|
|
}
|
|
window.onhashchange = scrollToHashSearchMatch;
|
|
scrollToHashSearchMatch();
|
|
}
|
|
});
|
|
|
|
})(jQuery);
|