@@ -6,62 +6,96 @@ namespace Elastic.Markdown.IO;
66
77public class DocumentationFolder
88{
9- public MarkdownFile ? Index { get ; }
9+ public MarkdownFile ? Index { get ; set ; }
1010
11- public List < MarkdownFile > FilesInOrder { get ; } = new ( ) ;
12- public List < DocumentationFolder > GroupsInOrder { get ; } = new ( ) ;
11+ public List < MarkdownFile > FilesInOrder { get ; }
12+ public List < DocumentationFolder > GroupsInOrder { get ; }
13+
14+ public required DocumentationFolder ? Parent { get ; init ; }
1315
1416 private HashSet < MarkdownFile > OwnFiles { get ; }
1517
1618 public int Level { get ; }
1719
18- public DocumentationFolder ( IReadOnlyCollection < ITocItem > toc ,
20+ public DocumentationFolder (
21+ IReadOnlyCollection < ITocItem > toc ,
1922 IDictionary < string , DocumentationFile > lookup ,
2023 IDictionary < string , DocumentationFile [ ] > folderLookup ,
2124 int level = 0 ,
22- MarkdownFile ? index = null )
25+ MarkdownFile ? index = null
26+ )
2327 {
2428 Level = level ;
25- Index = index ;
29+ var foundIndex = ProcessTocItems ( toc , lookup , folderLookup , level , out var groupsInOrder , out var filesInOrder ) ;
30+
31+ GroupsInOrder = groupsInOrder ;
32+ FilesInOrder = filesInOrder ;
33+ Index = index ?? foundIndex ;
34+
35+ if ( Index is not null )
36+ {
37+ FilesInOrder = FilesInOrder . Except ( [ Index ] ) . ToList ( ) ;
38+ Index . Parent ??= this ;
39+ }
40+
41+ OwnFiles = [ .. FilesInOrder ] ;
42+ }
2643
44+ private MarkdownFile ? ProcessTocItems (
45+ IReadOnlyCollection < ITocItem > toc ,
46+ IDictionary < string , DocumentationFile > lookup ,
47+ IDictionary < string , DocumentationFile [ ] > folderLookup ,
48+ int level ,
49+ out List < DocumentationFolder > groupsInOrder ,
50+ out List < MarkdownFile > filesInOrder
51+ )
52+ {
53+ groupsInOrder = [ ] ;
54+ filesInOrder = [ ] ;
55+ MarkdownFile ? index = null ;
2756 foreach ( var tocItem in toc )
2857 {
2958 if ( tocItem is TocFile file )
3059 {
3160 if ( ! lookup . TryGetValue ( file . Path , out var d ) || d is not MarkdownFile md )
3261 continue ;
3362
63+ md . Parent = this ;
64+
3465 if ( file . Children . Count > 0 && d is MarkdownFile virtualIndex )
3566 {
36- var group = new DocumentationFolder ( file . Children , lookup , folderLookup , level + 1 , virtualIndex ) ;
37- GroupsInOrder . Add ( group ) ;
67+ var group = new DocumentationFolder ( file . Children , lookup , folderLookup , level + 1 , virtualIndex )
68+ {
69+ Parent = this
70+ } ;
71+ groupsInOrder . Add ( group ) ;
3872 continue ;
3973 }
4074
41- FilesInOrder . Add ( md ) ;
75+ filesInOrder . Add ( md ) ;
4276 if ( file . Path . EndsWith ( "index.md" ) && d is MarkdownFile i )
43- Index ??= i ;
77+ index ??= i ;
4478 }
4579 else if ( tocItem is TocFolder folder )
4680 {
4781 var children = folder . Children ;
4882 if ( children . Count == 0
49- && folderLookup . TryGetValue ( folder . Path , out var documentationFiles ) )
83+ && folderLookup . TryGetValue ( folder . Path , out var documentationFiles ) )
5084 {
5185 children = documentationFiles
5286 . Select ( d => new TocFile ( d . RelativePath , true , [ ] ) )
5387 . ToArray ( ) ;
5488 }
5589
56- var group = new DocumentationFolder ( children , lookup , folderLookup , level + 1 ) ;
57- GroupsInOrder . Add ( group ) ;
90+ var group = new DocumentationFolder ( children , lookup , folderLookup , level + 1 )
91+ {
92+ Parent = this
93+ } ;
94+ groupsInOrder . Add ( group ) ;
5895 }
5996 }
6097
61- Index ??= FilesInOrder . FirstOrDefault ( ) ;
62- if ( Index != null )
63- FilesInOrder = FilesInOrder . Except ( new [ ] { Index } ) . ToList ( ) ;
64- OwnFiles = [ .. FilesInOrder ] ;
98+ return index ?? filesInOrder . FirstOrDefault ( ) ;
6599 }
66100
67101 public bool HoldsCurrent ( MarkdownFile current ) =>
0 commit comments