Skip to content

Commit d04462e

Browse files
committed
feat: use fzf to search
Using fzf supports CJK languages
1 parent 51efaf2 commit d04462e

File tree

5 files changed

+41
-2
lines changed

5 files changed

+41
-2
lines changed

src/renderer/html_handlebars/search.rs

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ pub fn create_files(search_config: &Search, destination: &Path, book: &Book) ->
5555
utils::fs::write_file(destination, "searcher.js", searcher::JS)?;
5656
utils::fs::write_file(destination, "mark.min.js", searcher::MARK_JS)?;
5757
utils::fs::write_file(destination, "elasticlunr.min.js", searcher::ELASTICLUNR_JS)?;
58+
utils::fs::write_file(destination, "fzf.umd.min.js", searcher::FZF_JS)?;
5859
debug!("Copying search files ✓");
5960
}
6061

src/theme/index.hbs

+1
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@
311311
{{#if search_js}}
312312
<script src="{{ path_to_root }}elasticlunr.min.js"></script>
313313
<script src="{{ path_to_root }}mark.min.js"></script>
314+
<script src="{{ path_to_root }}fzf.umd.min.js"></script>
314315
<script src="{{ path_to_root }}searcher.js"></script>
315316
{{/if}}
316317

src/theme/searcher/fzf.umd.min.js

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/theme/searcher/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@
44
pub static JS: &[u8] = include_bytes!("searcher.js");
55
pub static MARK_JS: &[u8] = include_bytes!("mark.min.js");
66
pub static ELASTICLUNR_JS: &[u8] = include_bytes!("elasticlunr.min.js");
7+
pub static FZF_JS: &[u8] = include_bytes!("fzf.umd.min.js");

src/theme/searcher/searcher.js

+31-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ window.search = window.search || {};
66
// You can use !hasFocus() to prevent keyhandling in your key
77
// event handlers while the user is typing their search.
88

9-
if (!Mark || !elasticlunr) {
9+
const Fzf = window.fzf.Fzf;
10+
11+
if (!Mark || !elasticlunr || !Fzf) {
1012
return;
1113
}
1214

@@ -252,12 +254,39 @@ window.search = window.search || {};
252254
return teaser_split.join('');
253255
}
254256

257+
function fzfLoad(index) {
258+
const docs = index.documentStore.docs;
259+
const fzf = new Fzf(Object.keys(docs), {
260+
selector: (id) => {
261+
const doc = docs[id];
262+
return `${doc.title} ${doc.breadcrumbs} ${doc.body}`
263+
}
264+
});
265+
266+
return {
267+
search: (term, _options) => {
268+
const entries = fzf.find(term);
269+
const res = entries.map((entry) => {
270+
// TODO: use score to rank results
271+
const { item, _score } = entry;
272+
return {
273+
doc: docs[item],
274+
ref: item,
275+
}
276+
});
277+
return res;
278+
}
279+
}
280+
}
281+
255282
function init(config) {
256283
results_options = config.results_options;
257284
search_options = config.search_options;
258285
searchbar_outer = config.searchbar_outer;
259286
doc_urls = config.doc_urls;
260-
searchindex = elasticlunr.Index.load(config.index);
287+
// searchindex = elasticlunr.Index.load(config.index);
288+
searchindex = fzfLoad(config.index);
289+
261290

262291
// Set up events
263292
searchicon.addEventListener('click', function(e) { searchIconClickHandler(); }, false);

0 commit comments

Comments
 (0)