Packages
ex_doc
0.28.4
0.40.3
0.40.2
0.40.1
0.40.0
0.39.3
0.39.2
0.39.1
0.39.0
0.38.4
0.38.3
0.38.2
0.38.1
0.38.0
0.37.3
0.37.2
0.37.1
0.37.0
0.37.0-rc.2
0.37.0-rc.1
0.37.0-rc.0
0.36.1
0.36.0
0.35.1
0.35.0
0.34.2
0.34.1
0.34.0
0.33.0
0.32.2
0.32.1
0.32.0
0.31.2
0.31.1
0.31.0
0.30.9
0.30.8
0.30.7
0.30.6
0.30.5
0.30.4
0.30.3
0.30.2
0.30.1
0.30.0
0.29.4
0.29.3
0.29.2
0.29.1
0.29.0
0.28.6
0.28.5
0.28.4
0.28.3
0.28.2
0.28.1
0.28.0
0.27.3
0.27.2
0.27.1
0.27.0
0.26.0
0.25.5
0.25.4
0.25.3
0.25.2
0.25.1
0.25.0
0.24.2
0.24.1
0.24.0
0.23.0
0.22.6
0.22.5
0.22.4
0.22.2
0.22.1
0.22.0
0.21.3
0.21.2
0.21.1
0.21.0
0.20.2
0.20.1
0.20.0
0.19.3
0.19.2
0.19.1
0.19.0
0.19.0-rc
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
retired
0.17.1
0.17.0
retired
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.1
0.15.0
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.2
0.13.1
0.13.0
0.12.0
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.3
0.7.2
0.7.1
0.7.0
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
ExDoc is a documentation generation tool for Elixir
Current section
Files
Jump to
Current section
Files
lib/ex_doc/formatter/html/search_items.ex
defmodule ExDoc.Formatter.HTML.SearchItems do
@moduledoc false
# TODO: It should not depend on the parent module
# TODO: Add tests that assert on the returned structured, not on JSON
alias ExDoc.Formatter.HTML
def create(nodes, extras) do
items = Enum.flat_map(nodes, &module/1) ++ Enum.flat_map(extras, &extra/1)
["searchNodes=" | ExDoc.Utils.to_json(items)]
end
@h2_split_regex ~r/<h2\b.*?>/
@header_body_regex ~r/(?<header>.+)<\/h2>(?<body>.*)/s
defp extra(%{id: id, title: title, content: content}) do
[intro | sections] = Regex.split(@h2_split_regex, content)
intro_json_item = encode("#{id}.html", title, :extras, intro)
section_json_items =
sections
|> Enum.map(&Regex.named_captures(@header_body_regex, &1))
|> Enum.map(&extra_section(title, &1["header"], &1["body"], id))
[intro_json_item | section_json_items]
end
defp extra_section(title, header, body, id) do
header = HTML.strip_tags(header)
encode(
"#{id}.html##{HTML.text_to_id(header)}",
"#{title} - #{header}",
:extras,
body
)
end
defp module(node = %ExDoc.ModuleNode{id: id, type: type, rendered_doc: doc}) do
module = encode("#{id}.html", id, type, doc)
functions = Enum.map(node.docs, &node_child(&1, id))
types = Enum.map(node.typespecs, &node_child(&1, id))
[module] ++ functions ++ types
end
defp node_child(node, module) do
encode(
"#{module}.html##{node.id}",
"#{module}.#{node.name}/#{node.arity}",
node.type,
node.rendered_doc
)
end
defp encode(ref, title, type, doc) do
%{ref: URI.encode(ref), title: title, type: type, doc: clean_doc(doc)}
end
defp clean_doc(doc) do
doc
|> Kernel.||("")
|> HTML.strip_tags(" ")
|> String.replace(~r/\s+/, " ")
|> String.trim()
end
end