From 7111ab6981d0750a3fdef156e789b3089a1bd07a Mon Sep 17 00:00:00 2001 From: Aaruni Kaushik Date: Fri, 31 May 2024 19:40:16 +0200 Subject: [PATCH 1/2] Change search_index to be a JSON file Not the best thing at the moment, because the fetch() function assumes site is served from / So it won't find search_index.json if site is project.com/docs instead of docs.project.com --- assets/html/js/search.js | 8 ++++---- docs/src/man/guide.md | 2 +- src/html/HTMLWriter.jl | 7 +++---- src/utilities/JSDependencies.jl | 9 +++++++++ 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/assets/html/js/search.js b/assets/html/js/search.js index 5e0b840a72..79521bae4a 100644 --- a/assets/html/js/search.js +++ b/assets/html/js/search.js @@ -65,12 +65,12 @@ update_search /////// SEARCH WORKER /////// -function worker_function(documenterSearchIndex, documenterBaseURL, filters) { +function worker_function(Index, documenterBaseURL, filters) { importScripts( "https://cdn.jsdelivr.net/npm/minisearch@6.1.0/dist/umd/index.min.js" ); - let data = documenterSearchIndex.map((x, key) => { + let data = Index.map((x, key) => { x["id"] = key; // minisearch requires a unique for each object return x; }); @@ -360,13 +360,13 @@ function worker_function(documenterSearchIndex, documenterBaseURL, filters) { // `worker = Threads.@spawn worker_function(documenterSearchIndex)`, but in JavaScript! const filters = [ - ...new Set(documenterSearchIndex["docs"].map((x) => x.category)), + ...new Set(documenterSearchIndex.map((x) => x.category)), ]; const worker_str = "(" + worker_function.toString() + ")(" + - JSON.stringify(documenterSearchIndex["docs"]) + + JSON.stringify(documenterSearchIndex) + "," + JSON.stringify(documenterBaseURL) + "," + diff --git a/docs/src/man/guide.md b/docs/src/man/guide.md index 5af5c04929..43132ba7cf 100644 --- a/docs/src/man/guide.md +++ b/docs/src/man/guide.md @@ -144,7 +144,7 @@ build/ ├── index.html ├── search │   └── index.html -└── search_index.js +└── search_index.json ``` !!! note diff --git a/src/html/HTMLWriter.jl b/src/html/HTMLWriter.jl index bd15fffb53..0ce812ae72 100644 --- a/src/html/HTMLWriter.jl +++ b/src/html/HTMLWriter.jl @@ -740,7 +740,7 @@ function render(doc::Documenter.Document, settings::HTML=HTML()) end ctx = HTMLContext(doc, settings) - ctx.search_index_js = "search_index.js" + ctx.search_index_js = "search_index.json" ctx.themeswap_js = copy_asset("themeswap.js", doc) ctx.warner_js = copy_asset("warner.js", doc) @@ -807,9 +807,8 @@ function render(doc::Documenter.Document, settings::HTML=HTML()) all(size_limit_successes) || throw(HTMLSizeThresholdError()) open(joinpath(doc.user.build, ctx.search_index_js), "w") do io - println(io, "var documenterSearchIndex = {\"docs\":") # convert Vector{SearchRecord} to a JSON string + do additional JS escaping - println(io, JSDependencies.json_jsescape(ctx.search_index), "\n}") + println(io, JSDependencies.json_jsescape(ctx.search_index)) end write_inventory(doc, ctx) @@ -994,7 +993,7 @@ function render_head(ctx, navnode) :src => RD.requirejs_cdn, Symbol("data-main") => relhref(src, ctx.documenter_js) ], - script[:src => relhref(src, ctx.search_index_js)], + #script[:src => relhref(src, ctx.search_index_js)], script[:src => relhref(src, "siteinfo.js")], script[:src => relhref(src, "../versions.js")], diff --git a/src/utilities/JSDependencies.jl b/src/utilities/JSDependencies.jl index f424d691b8..902273683e 100644 --- a/src/utilities/JSDependencies.jl +++ b/src/utilities/JSDependencies.jl @@ -174,6 +174,15 @@ function writejs(io::IO, r::RequireJS) isempty(shim) ? write(io, '\n') : write(io, ",\n shim: ", json_jsescape(shim, 2)) write(io, "});\n") + fetchstring = """fetch("./search_index.json") // assuming docs is served from root + .then(result => result.json()) + .then(json => + { + documenterSearchIndex = json; + } + );\n""" + write(io, fetchstring) + for s in r.snippets args = join(s.args, ", ") # Note: not string literals => no escaping deps = join(("\'$(jsescape(d))\'" for d in s.deps), ", ") From d6dd0abea9af66a5abf2a757340450bcdefe8450 Mon Sep 17 00:00:00 2001 From: Aaruni Kaushik Date: Fri, 7 Jun 2024 12:37:52 +0200 Subject: [PATCH 2/2] Load search index for all pages --- src/html/HTMLWriter.jl | 13 ++++++++++++- src/utilities/JSDependencies.jl | 9 --------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/html/HTMLWriter.jl b/src/html/HTMLWriter.jl index 0ce812ae72..4e700f2b14 100644 --- a/src/html/HTMLWriter.jl +++ b/src/html/HTMLWriter.jl @@ -958,6 +958,17 @@ function render_head(ctx, navnode) RD.katex_css, ] + fetchstring = """ + fetch("$(relhref(src, ctx.search_index_js))") + .then(result => result.json()) + .then(json => + { + documenterSearchIndex = json; + } + ); + """ + minifiedfetchstring = replace(fetchstring, r"\s+" => "") #minified string + head( meta[:charset=>"UTF-8"], meta[:name => "viewport", :content => "width=device-width, initial-scale=1.0"], @@ -993,7 +1004,7 @@ function render_head(ctx, navnode) :src => RD.requirejs_cdn, Symbol("data-main") => relhref(src, ctx.documenter_js) ], - #script[:src => relhref(src, ctx.search_index_js)], + script(minifiedfetchstring), # loads search index into js variable documenterSearchIndex script[:src => relhref(src, "siteinfo.js")], script[:src => relhref(src, "../versions.js")], diff --git a/src/utilities/JSDependencies.jl b/src/utilities/JSDependencies.jl index 902273683e..f424d691b8 100644 --- a/src/utilities/JSDependencies.jl +++ b/src/utilities/JSDependencies.jl @@ -174,15 +174,6 @@ function writejs(io::IO, r::RequireJS) isempty(shim) ? write(io, '\n') : write(io, ",\n shim: ", json_jsescape(shim, 2)) write(io, "});\n") - fetchstring = """fetch("./search_index.json") // assuming docs is served from root - .then(result => result.json()) - .then(json => - { - documenterSearchIndex = json; - } - );\n""" - write(io, fetchstring) - for s in r.snippets args = join(s.args, ", ") # Note: not string literals => no escaping deps = join(("\'$(jsescape(d))\'" for d in s.deps), ", ")