Skip to content

Commit ce7af3b

Browse files
committed
index gleam
1 parent 47015d0 commit ce7af3b

File tree

1 file changed

+67
-21
lines changed

1 file changed

+67
-21
lines changed

lib/hexdocs/queue.ex

Lines changed: 67 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -268,36 +268,82 @@ defmodule Hexdocs.Queue do
268268
end
269269

270270
defp find_search_items(package, version, files) do
271-
search_data_json =
271+
search_data =
272272
Enum.find_value(files, fn {path, content} ->
273273
case Path.basename(path) do
274-
"search_data-" <> _digest ->
275-
"searchData=" <> json = content
276-
json
277-
278-
_other ->
279-
nil
274+
"search_data-" <> _digest -> {:elixir, content}
275+
"search-data.js" -> {:gleam, content}
276+
_other -> nil
280277
end
281278
end)
282279

283-
unless search_data_json do
284-
Logger.info("Failed to find search data for #{package} #{version}")
280+
case search_data do
281+
{:elixir, content} ->
282+
extract_elixir_search_items(package, version, content)
283+
284+
{:gleam, content} ->
285+
extract_gleam_search_items(package, version, content)
286+
287+
nil ->
288+
Logger.info("Failed to find search data for #{package} #{version}")
289+
nil
290+
end
291+
end
292+
293+
defp extract_gleam_search_items(package, version, search_data) do
294+
"window.Gleam.initSearch(" <> search_items_js = search_data
295+
296+
search_items =
297+
case Jason.decode(search_items_js) do
298+
{:ok, search_items} ->
299+
search_items
300+
301+
{:error, %Jason.DecodeError{position: position}} ->
302+
case Jason.decode(:binary.part(search_items_js, 0, position)) do
303+
{:ok, search_items} ->
304+
search_items
305+
306+
{:error, error} ->
307+
Logger.error(
308+
"Failed to decode search data json for #{package} #{version}: " <>
309+
Exception.message(error)
310+
)
311+
312+
nil
313+
end
314+
end
315+
316+
case search_items do
317+
items when is_list(items) ->
318+
Enum.map(items, fn item ->
319+
%{"content" => doc, "doc" => _, "title" => title, "url" => ref} = item
320+
%{"doc" => doc, "title" => title, "ref" => ref}
321+
end)
322+
323+
nil ->
324+
nil
325+
326+
_ ->
327+
Logger.error("Failed to extract search items from search data for #{package} #{version}")
328+
nil
285329
end
330+
end
331+
332+
defp extract_elixir_search_items(package, version, search_data) do
333+
"searchData=" <> search_data_json = search_data
286334

287335
search_data =
288-
if search_data_json do
289-
case Jason.decode(search_data_json) do
290-
{:ok, search_data} ->
291-
search_data
292-
293-
{:error, error} ->
294-
Logger.error(
295-
"Failed to decode search data json for #{package} #{version}: " <>
296-
Exception.message(error)
297-
)
336+
case Jason.decode(search_data_json) do
337+
{:ok, search_data} ->
338+
search_data
298339

299-
nil
300-
end
340+
{:error, error} ->
341+
Logger.error(
342+
"Failed to decode search data json for #{package} #{version}: " <>
343+
Exception.message(error)
344+
)
345+
346+
nil
301347
end
302348

303349
case search_data do

0 commit comments

Comments
 (0)