Skip to content

Commit

Permalink
Fetch all Lunr scripts in parallel
Browse files Browse the repository at this point in the history
  • Loading branch information
Yeray Diaz Diaz committed Feb 3, 2018
1 parent db1a84a commit 7c81e90
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 71 deletions.
5 changes: 4 additions & 1 deletion mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,7 @@ copyright: Copyright &copy; 2014 <a href="https://twitter.com/_tomchristie">Tom
google_analytics: ['UA-27795084-5', 'mkdocs.org']

plugins:
- search
- search:
lang:
- en
- es
2 changes: 1 addition & 1 deletion mkdocs/contrib/search/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class SearchPlugin(BasePlugin):
""" Add a search feature to MkDocs. """

config_scheme = (
('lang', config_options.Type(list, default=['en']),
('lang', config_options.Type(list, default=['en'])),
('seperator', config_options.Type(utils.string_types, default=r'[\s\-]+')),
)

Expand Down
80 changes: 38 additions & 42 deletions mkdocs/contrib/search/templates/search/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,33 +29,37 @@ function displayResults (results) {
}
}

function doSearch () {
var query = document.getElementById('mkdocs-search-query').value;
if (query.length > 2) {
console.log('Searching with query: ' + query);
!window.Worker
? displayResults(search(query))
: searchWorker.postMessage({query: query});
}
}

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

if (!window.Worker) {
console.log('Web Worker API not supported');
// load index in main thread
$.getScript(base_url + "/search/worker.js", function () {
$.getScript(base_url + "/search/worker.js").done(function () {
console.log('Loaded worker');
init();

function doSearch () {
var query = document.getElementById('mkdocs-search-query').value;
if (query.length > 2) {
console.log('Searching with query: ' + query);
var results = search(query);
displayResults(results);
}
}

$(function() {
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();
}
});
}).fail(function (jqxhr, settings, exception) {
console.error('Could not load worker.js')
});
} else {
// Wrap search in a web worker
Expand All @@ -69,25 +73,17 @@ if (!window.Worker) {
var searchWorker = new Worker(base_url + "/search/worker.js");
searchWorker.postMessage({baseUrl: base_url});
searchWorker.onmessage = onWorkerMessage;
}

function doSearch () {
var query = document.getElementById('mkdocs-search-query').value;
if (query.length > 2) {
console.log('Sending search query for: ' + query);
searchWorker.postMessage({query: query});
}
$(function() {
var search_input = document.getElementById('mkdocs-search-query');
if (search_input) {
search_input.addEventListener("keyup", doSearch);
}

$(function() {
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();
}
});
}
var term = getSearchTermFromLocation();
if (term) {
search_input.value = term;
doSearch();
}
});
74 changes: 47 additions & 27 deletions mkdocs/contrib/search/templates/search/worker.js
Original file line number Diff line number Diff line change
@@ -1,50 +1,63 @@
function loadScript(url) {
var base_url = 'function' === typeof importScripts ? '.' : '/search/';
var allowSearch = false
var index;
var documents = {};
var lang = ['en'];
var data;

function getScripts(scripts, callback) {
console.log('Loading scripts: ' + scripts);
var progress = 0;
scripts.forEach(function(script) {
$.getScript(base_url + script).done(function () {
if (++progress == scripts.length) callback();
}).fail(function (jqxhr, settings, exception) {
console.log(exception);
});
});
}

function loadScripts(urls, callback) {
if( 'function' === typeof importScripts ){
importScripts(url);
importScripts.apply(null, urls);
callback();
} else {
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = base_url + "/search/" + url;
head.appendChild(script);
getScripts(urls, callback);
}
}

loadScript('lunr.js');
if( 'function' === typeof importScripts ){
var base_url = '.';
}

var index;
var documents = {};

function onLoad () {
var data = JSON.parse(this.responseText);
var lang = ['en'];
function onJSONLoaded () {
data = JSON.parse(this.responseText);
if (data.config) {
if (data.config.lang && data.config.lang.length) {
lang = data.config.lang;
var scriptsToLoad = ['lunr.js']
if (lang.length > 1 || lang[0] !== "en") {
loadScript('lunr.stemmer.support.js');
scriptsToLoad.push('lunr.stemmer.support.js');
if (lang.length > 1) {
loadScript('lunr.multi.js');
scriptsToLoad.push('lunr.multi.js');
}
for (var i=0; i < lang.length; i++) {
if (lang[i] != 'en') {
loadScript(['lunr', lang[i], 'js'].join('.'));
scriptsToLoad.push(['lunr', lang[i], 'js'].join('.'));
}
}
}
}
if (data.config.seperator && data.config.seperator.length) {
lunr.tokenizer.seperator = new RegExp(data.config.seperator);
loadScripts(scriptsToLoad, onScriptsLoaded);
}
}
}

function onScriptsLoaded () {
console.log('All search scripts loaded, building Lunr index...')
if (data.config.seperator && data.config.seperator.length) {
lunr.tokenizer.seperator = new RegExp(data.config.seperator);
}
index = lunr(function () {
if (lang.length === 1 && lang[0] !== "en" && lunr[lang[0]]) {
this.use(lunr[lang[0]])
} else if (lang.length > 1) {
this.use(lunr.multiLanguage(...lang))
this.use(lunr.multiLanguage.apply(null, lang)) // spread operator not supported in all browsers: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator#Browser_compatibility
}
this.field('title', { boost: 10 });
this.field('text');
Expand All @@ -57,12 +70,14 @@ function onLoad () {
documents[doc.location] = doc;
}
});
allowSearch = true;
console.log('Lunr index built, search ready')
}

function init () {
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", onLoad);
var index_path = base_url + '/search/search_index.json';
oReq.addEventListener("load", onJSONLoaded);
var index_path = base_url + '/search_index.json';
if( 'function' === typeof importScripts ){
index_path = 'search_index.json';
}
Expand All @@ -71,6 +86,11 @@ function init () {
}

function search (query) {
if (!allowSearch) {
console.error('Assets for search still loading');
return;
}

var resultDocuments = [];
var results = index.search(query);
for (var i=0; i < results.length; i++){
Expand Down

0 comments on commit 7c81e90

Please sign in to comment.