Skip to content

Commit e85d853

Browse files
authored
Display description text in docs groups (#2113)
1 parent c17125a commit e85d853

20 files changed

+399
-145
lines changed

assets/css/content/general.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@
7171
margin: 1.5em 0 0.5em;
7272
}
7373

74+
.content-inner div.group-description {
75+
margin: 0 0 3em;
76+
}
77+
7478
.content-inner h1 small {
7579
font-weight: 400;
7680
}

formatters/html/dist/html-elixir-BHUPNQFZ.css

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

formatters/html/dist/html-elixir-KV3YOVJ3.css

Lines changed: 0 additions & 6 deletions
This file was deleted.

formatters/html/dist/html-erlang-DQDXQC7W.css

Lines changed: 0 additions & 6 deletions
This file was deleted.

formatters/html/dist/html-erlang-U4PKJ7EN.css

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/ex_doc/formatter/epub/templates.ex

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ defmodule ExDoc.Formatter.EPUB.Templates do
1616
Generate content from the module template for a given `node`
1717
"""
1818
def module_page(config, module_node) do
19-
summary = H.module_summary(module_node)
20-
module_template(config, module_node, summary)
19+
module_template(config, module_node)
2120
end
2221

2322
@doc """
@@ -53,7 +52,7 @@ defmodule ExDoc.Formatter.EPUB.Templates do
5352
:def,
5453
:module_template,
5554
Path.expand("templates/module_template.eex", __DIR__),
56-
[:config, :module, :summary],
55+
[:config, :module],
5756
trim: true
5857
)
5958

lib/ex_doc/formatter/epub/templates/module_template.eex

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,23 @@
1515
</section>
1616
<% end %>
1717

18-
<%= if summary != [] do %>
18+
<%= if module.docs_groups != [] do %>
1919
<section id="summary" class="details-list">
2020
<h1 class="section-heading">Summary</h1>
21-
<%= for {name, nodes} <- summary, do: H.summary_template(name, nodes) %>
21+
<%= for group <- module.docs_groups, do: H.summary_template(group.title, group.docs) %>
2222
</section>
2323
<% end %>
2424

25-
<%= for {name, nodes} <- summary, key = text_to_id(name) do %>
25+
<%= for group <- module.docs_groups, key = text_to_id(group.title) do %>
2626
<section id="<%= key %>" class="details-list">
27-
<h1 class="section-heading"><%=h to_string(name) %></h1>
27+
<h1 class="section-heading"><%=h to_string(group.title) %></h1>
28+
<%= if doc = group.doc do %>
29+
<div class="group-description" id="group-description-<%= key %>">
30+
<%= render_doc(doc) %>
31+
</div>
32+
<% end %>
2833
<div class="<%= key %>-list">
29-
<%= for node <- nodes, do: H.detail_template(node, module) %>
34+
<%= for node <- group.docs, do: H.detail_template(node, module) %>
3035
</div>
3136
</section>
3237
<% end %>

lib/ex_doc/formatter/html.ex

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -87,27 +87,32 @@ defmodule ExDoc.Formatter.HTML do
8787
language: language
8888
] ++ base
8989

90-
docs =
91-
for child_node <- node.docs do
92-
id = id(node, child_node)
93-
94-
autolink_opts =
95-
autolink_opts ++
96-
[
97-
id: id,
98-
line: child_node.doc_line,
99-
file: child_node.doc_file,
100-
current_kfa: {child_node.type, child_node.name, child_node.arity}
101-
]
102-
103-
specs = Enum.map(child_node.specs, &language.autolink_spec(&1, autolink_opts))
104-
child_node = %{child_node | specs: specs}
105-
render_doc(child_node, language, autolink_opts, opts)
90+
docs_groups =
91+
for group <- node.docs_groups do
92+
docs =
93+
for child_node <- group.docs do
94+
id = id(node, child_node)
95+
96+
autolink_opts =
97+
autolink_opts ++
98+
[
99+
id: id,
100+
line: child_node.doc_line,
101+
file: child_node.doc_file,
102+
current_kfa: {child_node.type, child_node.name, child_node.arity}
103+
]
104+
105+
specs = Enum.map(child_node.specs, &language.autolink_spec(&1, autolink_opts))
106+
child_node = %{child_node | specs: specs}
107+
render_doc(child_node, language, autolink_opts, opts)
108+
end
109+
110+
%{render_doc(group, language, autolink_opts, opts) | docs: docs}
106111
end
107112

108113
%{
109114
render_doc(node, language, [{:id, node.id} | autolink_opts], opts)
110-
| docs: docs
115+
| docs_groups: docs_groups
111116
}
112117
end,
113118
timeout: :infinity

lib/ex_doc/formatter/html/search_data.ex

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,12 @@ defmodule ExDoc.Formatter.HTML.SearchData do
4444
page = URI.encode(node.id) <> ".html"
4545
{intro, sections} = extract_sections(node.source_format, node, "module-")
4646
module = encode(page, node.title, node.type, intro)
47-
docs = Enum.flat_map(node.docs, &node_child(&1, node, page))
47+
48+
docs =
49+
node.docs_groups
50+
|> Enum.flat_map(& &1.docs)
51+
|> Enum.flat_map(&node_child(&1, node, page))
52+
4853
[module] ++ render_sections(sections, page, node.title, node.type) ++ docs
4954
end
5055

lib/ex_doc/formatter/html/templates.ex

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ defmodule ExDoc.Formatter.HTML.Templates do
1616
Generate content from the module template for a given `node`
1717
"""
1818
def module_page(module_node, config) do
19-
summary = module_summary(module_node)
20-
module_template(config, module_node, summary)
19+
module_template(config, module_node)
2120
end
2221

2322
@doc """
@@ -99,9 +98,7 @@ defmodule ExDoc.Formatter.HTML.Templates do
9998
modules =
10099
for module <- modules do
101100
groups =
102-
module
103-
|> module_summary()
104-
|> case do
101+
case module.docs_groups do
105102
[] -> []
106103
entries -> [nodeGroups: Enum.map(entries, &sidebar_entries/1)]
107104
end
@@ -123,9 +120,9 @@ defmodule ExDoc.Formatter.HTML.Templates do
123120
{id, modules}
124121
end
125122

126-
defp sidebar_entries({group, nodes}) do
123+
defp sidebar_entries(group) do
127124
nodes =
128-
for node <- nodes do
125+
for node <- group.docs do
129126
id =
130127
if "struct" in node.annotations do
131128
node.signature
@@ -142,7 +139,7 @@ defmodule ExDoc.Formatter.HTML.Templates do
142139
%{id: id, title: node.signature, anchor: URI.encode(node.id), deprecated: deprecated?}
143140
end
144141

145-
%{key: text_to_id(group), name: group, nodes: nodes}
142+
%{key: text_to_id(group.title), name: group.title, nodes: nodes}
146143
end
147144

148145
defp headers(doc) do
@@ -153,11 +150,6 @@ defmodule ExDoc.Formatter.HTML.Templates do
153150
end)
154151
end
155152

156-
def module_summary(module_node) do
157-
# TODO: Maybe it should be moved to retriever and it already returned grouped metadata
158-
ExDoc.GroupMatcher.group_by(module_node.docs_groups, module_node.docs, & &1.group)
159-
end
160-
161153
defp favicon_path(%{favicon: nil}), do: nil
162154
defp favicon_path(%{favicon: favicon}), do: "assets/favicon#{Path.extname(favicon)}"
163155

@@ -225,7 +217,7 @@ defmodule ExDoc.Formatter.HTML.Templates do
225217
detail_template: [:node, :module],
226218
footer_template: [:config, :source_path],
227219
head_template: [:config, :title, :noindex],
228-
module_template: [:config, :module, :summary],
220+
module_template: [:config, :module],
229221
not_found_template: [:config],
230222
api_reference_entry_template: [:module_node],
231223
api_reference_template: [:config, :nodes_map],

lib/ex_doc/formatter/html/templates/module_template.eex

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,28 +31,33 @@
3131
<% end %>
3232
</div>
3333

34-
<%= if summary != [] do %>
34+
<%= if module.docs_groups != [] do %>
3535
<section id="summary" class="details-list">
3636
<h1 class="section-heading">
3737
<a class="hover-link" href="#summary">
3838
<i class="ri-link-m" aria-hidden="true"></i>
3939
</a>
4040
<span class="text">Summary</span>
4141
</h1>
42-
<%= for {name, nodes} <- summary, do: summary_template(name, nodes) %>
42+
<%= for group <- module.docs_groups, do: summary_template(group.title, group.docs) %>
4343
</section>
4444
<% end %>
4545

46-
<%= for {name, nodes} <- summary, key = text_to_id(name) do %>
46+
<%= for group <- module.docs_groups, key = text_to_id(group.title) do %>
4747
<section id="<%= key %>" class="details-list">
4848
<h1 class="section-heading">
4949
<a class="hover-link" href="#<%= key %>">
5050
<i class="ri-link-m" aria-hidden="true"></i>
5151
</a>
52-
<span class="text"><%= name %></span>
52+
<span class="text"><%= group.title %></span>
5353
</h1>
54+
<%= if doc = group.doc do %>
55+
<div class="group-description" id="group-description-<%= key %>">
56+
<%= render_doc(doc) %>
57+
</div>
58+
<% end %>
5459
<div class="<%= key %>-list">
55-
<%= for node <- nodes, do: detail_template(node, module) %>
60+
<%= for node <- group.docs, do: detail_template(node, module) %>
5661
</div>
5762
</section>
5863
<% end %>

lib/ex_doc/group_matcher.ex

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,6 @@ defmodule ExDoc.GroupMatcher do
1414
Enum.find_index(groups, fn {k, _v} -> k == group end) || -1
1515
end
1616

17-
@doc """
18-
Group the following entries and while preserving the order in `groups`.
19-
"""
20-
def group_by(groups, entries, by) do
21-
entries = Enum.group_by(entries, by)
22-
23-
{groups, leftovers} =
24-
Enum.flat_map_reduce(groups, entries, fn group, grouped_nodes ->
25-
case Map.pop(grouped_nodes, group, []) do
26-
{[], grouped_nodes} -> {[], grouped_nodes}
27-
{entries, grouped_nodes} -> {[{group, entries}], grouped_nodes}
28-
end
29-
end)
30-
31-
groups ++ Enum.sort(leftovers)
32-
end
33-
3417
@doc """
3518
Finds a matching group for the given module name, id, and metadata.
3619
"""

lib/ex_doc/nodes.ex

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ defmodule ExDoc.ModuleNode do
1717
source_path: nil,
1818
source_url: nil,
1919
docs_groups: [],
20-
docs: [],
2120
typespecs: [],
2221
type: nil,
2322
language: nil,
@@ -41,8 +40,7 @@ defmodule ExDoc.ModuleNode do
4140
moduledoc_file: String.t(),
4241
source_path: String.t() | nil,
4342
source_url: String.t() | nil,
44-
docs_groups: [atom()],
45-
docs: [ExDoc.DocNode.t()],
43+
docs_groups: [ExDoc.DocGroupNode.t()],
4644
typespecs: [ExDoc.DocNode.t()],
4745
type: atom(),
4846
language: module(),
@@ -83,11 +81,22 @@ defmodule ExDoc.DocNode do
8381
source_doc: term() | nil,
8482
type: atom(),
8583
signature: String.t(),
86-
specs: [ExDoc.Language.spec_ast()],
84+
specs: [ExDoc.Language.spec_ast() | String.t()],
8785
annotations: [annotation()],
88-
group: atom() | nil,
86+
group: String.t() | nil,
8987
doc_file: String.t(),
9088
doc_line: non_neg_integer(),
9189
source_url: String.t() | nil
9290
}
9391
end
92+
93+
defmodule ExDoc.DocGroupNode do
94+
defstruct title: nil, description: nil, doc: nil, docs: []
95+
96+
@type t :: %__MODULE__{
97+
title: String.t() | atom(),
98+
description: String.t() | nil,
99+
doc: ExDoc.DocAST.t() | nil,
100+
docs: [ExDoc.DocNode.t()]
101+
}
102+
end

0 commit comments

Comments
 (0)