Packages
ex_doc
0.21.0
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
alias ExDoc.Formatter.HTML
def create(nodes, extras) do
items = Enum.flat_map(nodes, &module_node/1) ++ Enum.flat_map(extras, &extra/1)
["searchNodes=[", Enum.intersperse(items, ?,), "]"]
end
@h2_split_regex ~r/<h2.*?>/
@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(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(%{id: id, type: type, rendered_doc: doc}, module) do
encode(
"#{module}.html##{HTML.link_id(id, type)}",
"#{module}.#{id}",
type,
doc
)
end
defp encode(ref, title, type, doc) do
[
"{\"ref\":",
[?", ref, ?"],
",\"title\":",
[?", title, ?"],
",\"type\":",
[?", Atom.to_string(type), ?"],
",\"doc\":",
clean_doc(doc),
"}"
]
end
defp clean_doc(doc) do
doc
|> Kernel.||("")
|> HTML.strip_tags()
|> String.replace(~r/\s+/, " ")
|> String.trim()
|> inspect(printable_limit: :infinity)
end
end