@@ -3,13 +3,15 @@ defmodule ExDoc.ModuleNode do
3
3
Structure that represents a *module*
4
4
"""
5
5
6
- defstruct id: nil , title: nil , module: nil , doc: nil , doc_line: nil ,
7
- docs: [ ] , typespecs: [ ] , source_path: nil , source_url: nil , type: nil
6
+ defstruct id: nil , title: nil , module: nil , group: nil , doc: nil ,
7
+ doc_line: nil , docs: [ ] , typespecs: [ ] , source_path: nil ,
8
+ source_url: nil , type: nil
8
9
9
10
@ type t :: % __MODULE__ {
10
11
id: nil | String . t ,
11
12
title: nil | String . t ,
12
13
module: nil | String . t ,
14
+ group: nil | String . t ,
13
15
docs: list ( ) ,
14
16
doc: nil | String . t ,
15
17
doc_line: non_neg_integer ( ) ,
@@ -115,7 +117,7 @@ defmodule ExDoc.Retriever do
115
117
modules
116
118
|> Enum . map ( & get_module ( & 1 , config ) )
117
119
|> Enum . filter ( & ( & 1 ) )
118
- |> Enum . sort ( & ( & 1 . id <= & 2 . id ) )
120
+ |> Enum . sort_by ( & ( { & 1 . group , & 1 . id } ) )
119
121
end
120
122
121
123
defp filename_to_module ( name ) do
@@ -157,6 +159,7 @@ defmodule ExDoc.Retriever do
157
159
end
158
160
159
161
defp generate_node ( module , type , config ) do
162
+ module_group_patterns = config . module_groups
160
163
source_url = config . source_url_pattern
161
164
source_path = source_path ( module , config )
162
165
source = % { url: source_url , path: source_path }
@@ -171,10 +174,13 @@ defmodule ExDoc.Retriever do
171
174
172
175
{ title , id } = module_title_and_id ( module , type )
173
176
177
+ module_group = module_group ( module , module_group_patterns )
178
+
174
179
% ExDoc.ModuleNode {
175
180
id: id ,
176
181
title: title ,
177
182
module: module_info . name ,
183
+ group: module_group ,
178
184
type: type ,
179
185
docs: docs ,
180
186
doc: moduledoc ,
@@ -458,6 +464,25 @@ defmodule ExDoc.Retriever do
458
464
{ id , id }
459
465
end
460
466
467
+ defp module_group ( module , group_patterns ) do
468
+ Enum . find_value ( group_patterns , fn { group , patterns } ->
469
+ patterns = List . wrap patterns
470
+ module_in_patterns ( module , patterns ) && Atom . to_string ( group )
471
+ end )
472
+ end
473
+
474
+ defp module_in_patterns ( module , patterns ) do
475
+ "Elixir." <> module_string = Atom . to_string module
476
+
477
+ Enum . any? ( patterns , fn pattern ->
478
+ case pattern do
479
+ % Regex { } = regex -> Regex . match? ( regex , module_string )
480
+ string when is_binary ( string ) -> module_string === string
481
+ atom -> atom === module
482
+ end
483
+ end )
484
+ end
485
+
461
486
defp module_id ( module ) do
462
487
case inspect ( module ) do
463
488
":" <> inspected -> inspected
0 commit comments