Skip to content

Commit 891db7c

Browse files
authored
Fix RootNavigation on MarkdownFile (#1649)
* Fix RootNavigation on MarkdownFile * Update src/tooling/docs-assembler/Navigation/GlobalNavigationHtmlWriter.cs
1 parent bb4e835 commit 891db7c

File tree

3 files changed

+22
-18
lines changed

3 files changed

+22
-18
lines changed

src/tooling/docs-assembler/Cli/RepositoryCommands.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ public async Task<int> BuildAll(
169169
var navigation = new GlobalNavigation(assembleSources, navigationFile);
170170

171171
var pathProvider = new GlobalNavigationPathProvider(navigationFile, assembleSources, assembleContext);
172-
var htmlWriter = new GlobalNavigationHtmlWriter(logFactory, navigation);
172+
var htmlWriter = new GlobalNavigationHtmlWriter(logFactory, navigation, collector);
173173
var legacyPageChecker = new LegacyPageChecker();
174174
var historyMapper = new PageLegacyUrlMapper(legacyPageChecker, assembleSources.HistoryMappings);
175175

src/tooling/docs-assembler/Navigation/GlobalNavigation.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public GlobalNavigation(AssembleSources assembleSources, GlobalNavigationFile na
4747

4848
var navigationIndex = 0;
4949
var allNavigationItems = new HashSet<INavigationItem>();
50-
UpdateParent(allNavigationItems, NavigationItems, null);
50+
UpdateParent(allNavigationItems, NavigationItems, null, null);
5151
UpdateNavigationIndex(NavigationItems, ref navigationIndex);
5252
TopLevelItems = NavigationItems.OfType<TableOfContentsTree>().Where(t => !t.Hidden).ToList();
5353
NavigationLookup = TopLevelItems.ToDictionary(kv => kv.Source, kv => kv);
@@ -64,23 +64,30 @@ public GlobalNavigation(AssembleSources assembleSources, GlobalNavigationFile na
6464
private void UpdateParent(
6565
HashSet<INavigationItem> allNavigationItems,
6666
IReadOnlyCollection<INavigationItem> navigationItems,
67-
INodeNavigationItem<INavigationModel, INavigationItem>? parent
67+
INodeNavigationItem<INavigationModel, INavigationItem>? parent,
68+
IRootNavigationItem<INavigationModel, INavigationItem>? topLevelNavigation
6869
)
6970
{
71+
if (parent is IRootNavigationItem<INavigationModel, INavigationItem> tree)
72+
topLevelNavigation ??= tree;
7073
foreach (var item in navigationItems)
7174
{
7275
switch (item)
7376
{
7477
case FileNavigationItem fileNavigationItem:
7578
if (parent is not null)
7679
fileNavigationItem.Parent = parent;
80+
if (topLevelNavigation is not null)
81+
fileNavigationItem.Model.NavigationRoot = topLevelNavigation;
7782
_ = allNavigationItems.Add(fileNavigationItem);
7883
break;
7984
case DocumentationGroup documentationGroup:
8085
if (parent is not null)
8186
documentationGroup.Parent = parent;
87+
if (topLevelNavigation is not null)
88+
documentationGroup.Index.NavigationRoot = topLevelNavigation;
8289
_ = allNavigationItems.Add(documentationGroup);
83-
UpdateParent(allNavigationItems, documentationGroup.NavigationItems, documentationGroup);
90+
UpdateParent(allNavigationItems, documentationGroup.NavigationItems, documentationGroup, topLevelNavigation);
8491
break;
8592
default:
8693
_navigationFile.EmitError($"Unhandled navigation item type: {item.GetType()}");

src/tooling/docs-assembler/Navigation/GlobalNavigationHtmlWriter.cs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,48 +3,45 @@
33
// See the LICENSE file in the project root for more information
44

55
using System.Collections.Concurrent;
6+
using Elastic.Documentation.Diagnostics;
67
using Elastic.Documentation.Site.Navigation;
78
using Elastic.Markdown.IO.Navigation;
89
using Microsoft.Extensions.Logging;
910

1011
namespace Documentation.Assembler.Navigation;
1112

12-
public class GlobalNavigationHtmlWriter(ILoggerFactory logFactory, GlobalNavigation globalNavigation) : INavigationHtmlWriter
13+
public class GlobalNavigationHtmlWriter(ILoggerFactory logFactory, GlobalNavigation globalNavigation, DiagnosticsCollector collector) : INavigationHtmlWriter
1314
{
1415
private readonly ILogger<Program> _logger = logFactory.CreateLogger<Program>();
1516

1617
private readonly ConcurrentDictionary<(string, int), string> _renderedNavigationCache = [];
1718

1819
public async Task<NavigationRenderResult> RenderNavigation(IRootNavigationItem<INavigationModel, INavigationItem> currentRootNavigation, int maxLevel, Cancel ctx = default)
1920
{
20-
INodeNavigationItem<INavigationModel, INavigationItem> lastParentBeforeRoot = currentRootNavigation;
21-
INodeNavigationItem<INavigationModel, INavigationItem> parent = currentRootNavigation;
22-
while (parent.Parent is not null)
23-
{
24-
lastParentBeforeRoot = parent;
25-
parent = parent.Parent;
26-
}
27-
if (_renderedNavigationCache.TryGetValue((lastParentBeforeRoot.Id, maxLevel), out var html))
21+
if (currentRootNavigation.Parent is not null && currentRootNavigation.Parent.Depth != 0)
22+
collector.EmitGlobalError($"Passed root is not actually a top level navigation item {currentRootNavigation.NavigationTitle} ({currentRootNavigation.Id}) in {currentRootNavigation.Url}");
23+
24+
if (_renderedNavigationCache.TryGetValue((currentRootNavigation.Id, maxLevel), out var html))
2825
{
2926
return new NavigationRenderResult
3027
{
3128
Html = html,
32-
Id = lastParentBeforeRoot.Id
29+
Id = currentRootNavigation.Id
3330
};
3431
}
3532

36-
_logger.LogInformation("Rendering navigation for {NavigationTitle} ({Id})", lastParentBeforeRoot.NavigationTitle, lastParentBeforeRoot.Id);
33+
_logger.LogInformation("Rendering navigation for {NavigationTitle} ({Id})", currentRootNavigation.NavigationTitle, currentRootNavigation.Id);
3734

38-
if (lastParentBeforeRoot is not DocumentationGroup group)
35+
if (currentRootNavigation is not DocumentationGroup group)
3936
return NavigationRenderResult.Empty;
4037

4138
var model = CreateNavigationModel(group, maxLevel);
4239
html = await ((INavigationHtmlWriter)this).Render(model, ctx);
43-
_renderedNavigationCache[(lastParentBeforeRoot.Id, maxLevel)] = html;
40+
_renderedNavigationCache[(currentRootNavigation.Id, maxLevel)] = html;
4441
return new NavigationRenderResult
4542
{
4643
Html = html,
47-
Id = lastParentBeforeRoot.Id
44+
Id = currentRootNavigation.Id
4845
};
4946
}
5047

0 commit comments

Comments
 (0)