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); 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); 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]