funky-framadate-front/site/search/main.js

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;
}