From 2c382a58d30ffe031dee25b3597e4a5aaa3fd87c Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Wed, 2 Apr 2025 11:10:37 +0200 Subject: [PATCH 1/3] Greatly speed up search index load --- src/renderer/html_handlebars/search.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/renderer/html_handlebars/search.rs b/src/renderer/html_handlebars/search.rs index ffa104b3e6..fe2edd5bef 100644 --- a/src/renderer/html_handlebars/search.rs +++ b/src/renderer/html_handlebars/search.rs @@ -66,7 +66,13 @@ pub fn create_files( if search_config.copy_js { static_files.add_builtin( "searchindex.js", - format!("Object.assign(window.search, {});", index).as_bytes(), + // To reduce the size of the generated JSON by preventing all `"` characters to be + // escaped, we instead surround the string with much less common `'` character. + format!( + "window.search = JSON.parse('{}');", + index.replace("\\", "\\\\").replace("'", "\\'") + ) + .as_bytes(), ); static_files.add_builtin("searcher.js", searcher::JS); static_files.add_builtin("mark.min.js", searcher::MARK_JS); From 0ed1cbe486af13cba8ba43515e0610f40c359113 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Wed, 2 Apr 2025 11:14:38 +0200 Subject: [PATCH 2/3] Fix JS error --- src/front-end/searcher/searcher.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/front-end/searcher/searcher.js b/src/front-end/searcher/searcher.js index 4d18b138c8..13eb0f5a20 100644 --- a/src/front-end/searcher/searcher.js +++ b/src/front-end/searcher/searcher.js @@ -3,7 +3,7 @@ /* global Mark, elasticlunr, path_to_root */ window.search = window.search || {}; -(function search(search) { +(function search() { // Search functionality // // You can use !hasFocus() to prevent keyhandling in your key @@ -288,6 +288,9 @@ window.search = window.search || {}; // If reloaded, do the search or mark again, depending on the current url parameters doSearchOrMarkFromUrl(); + + // Exported functions + config.hasFocus = hasFocus; } function unfocusSearchbar() { @@ -521,6 +524,4 @@ window.search = window.search || {}; loadScript(path_to_root + '{{ resource "searchindex.js" }}', 'search-index'); - // Exported functions - search.hasFocus = hasFocus; })(window.search); From 7acc7a03a81fd237cba41aa2c90de11201588862 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Wed, 2 Apr 2025 21:03:01 +0200 Subject: [PATCH 3/3] Update JSON loader in search tests --- tests/rendered_output.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/rendered_output.rs b/tests/rendered_output.rs index beb83ebd48..ab69a35933 100644 --- a/tests/rendered_output.rs +++ b/tests/rendered_output.rs @@ -773,9 +773,10 @@ mod search { fn read_book_index(root: &Path) -> serde_json::Value { let index = root.join("book/searchindex.js"); let index = fs::read_to_string(index).unwrap(); - let index = index.trim_start_matches("Object.assign(window.search, "); - let index = index.trim_end_matches(");"); - serde_json::from_str(index).unwrap() + let index = index.trim_start_matches("window.search = JSON.parse('"); + let index = index.trim_end_matches("');"); + // We need unescape the string as it's supposed to be an escaped JS string. + serde_json::from_str(&index.replace("\\'", "'").replace("\\\\", "\\")).unwrap() } #[test]