@@ -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