109 lines
2.7 KiB
JavaScript
109 lines
2.7 KiB
JavaScript
function getSearchTermFromLocation() {
|
|
var sPageURL = window.location.search.substring(1);
|
|
var sURLVariables = sPageURL.split('&');
|
|
for (var i = 0; i < sURLVariables.length; i++) {
|
|
var sParameterName = sURLVariables[i].split('=');
|
|
if (sParameterName[0] == 'q') {
|
|
return decodeURIComponent(sParameterName[1].replace(/\+/g, '%20'));
|
|
}
|
|
}
|
|
}
|
|
|
|
function joinUrl(base, path) {
|
|
if (path.substring(0, 1) === '/') {
|
|
// path starts with `/`. Thus it is absolute.
|
|
return path;
|
|
}
|
|
if (base.substring(base.length - 1) === '/') {
|
|
// base ends with `/`
|
|
return base + path;
|
|
}
|
|
return base + '/' + path;
|
|
}
|
|
|
|
function formatResult(location, title, summary) {
|
|
return (
|
|
'<article><h3><a href="' +
|
|
joinUrl(base_url, location) +
|
|
'">' +
|
|
title +
|
|
'</a></h3><p>' +
|
|
summary +
|
|
'</p></article>'
|
|
);
|
|
}
|
|
|
|
function displayResults(results) {
|
|
var search_results = document.getElementById('mkdocs-search-results');
|
|
while (search_results.firstChild) {
|
|
search_results.removeChild(search_results.firstChild);
|
|
}
|
|
if (results.length > 0) {
|
|
for (var i = 0; i < results.length; i++) {
|
|
var result = results[i];
|
|
var html = formatResult(result.location, result.title, result.summary);
|
|
search_results.insertAdjacentHTML('beforeend', html);
|
|
}
|
|
} else {
|
|
search_results.insertAdjacentHTML('beforeend', '<p>No results found</p>');
|
|
}
|
|
}
|
|
|
|
function doSearch() {
|
|
var query = document.getElementById('mkdocs-search-query').value;
|
|
if (query.length > min_search_length) {
|
|
if (!window.Worker) {
|
|
displayResults(search(query));
|
|
} else {
|
|
searchWorker.postMessage({ query: query });
|
|
}
|
|
} else {
|
|
// Clear results for short queries
|
|
displayResults([]);
|
|
}
|
|
}
|
|
|
|
function initSearch() {
|
|
var search_input = document.getElementById('mkdocs-search-query');
|
|
if (search_input) {
|
|
search_input.addEventListener('keyup', doSearch);
|
|
}
|
|
var term = getSearchTermFromLocation();
|
|
if (term) {
|
|
search_input.value = term;
|
|
doSearch();
|
|
}
|
|
}
|
|
|
|
function onWorkerMessage(e) {
|
|
if (e.data.allowSearch) {
|
|
initSearch();
|
|
} else if (e.data.results) {
|
|
var results = e.data.results;
|
|
displayResults(results);
|
|
} else if (e.data.config) {
|
|
min_search_length = e.data.config.min_search_length - 1;
|
|
}
|
|
}
|
|
|
|
if (!window.Worker) {
|
|
console.log('Web Worker API not supported');
|
|
// load index in main thread
|
|
$.getScript(joinUrl(base_url, 'search/worker.js'))
|
|
.done(function () {
|
|
console.log('Loaded worker');
|
|
init();
|
|
window.postMessage = function (msg) {
|
|
onWorkerMessage({ data: msg });
|
|
};
|
|
})
|
|
.fail(function (jqxhr, settings, exception) {
|
|
console.error('Could not load worker.js');
|
|
});
|
|
} else {
|
|
// Wrap search in a web worker
|
|
var searchWorker = new Worker(joinUrl(base_url, 'search/worker.js'));
|
|
searchWorker.postMessage({ init: true });
|
|
searchWorker.onmessage = onWorkerMessage;
|
|
}
|