in src/Elastic.Markdown/IO/Navigation/DocumentationGroup.cs [204:316]
private MarkdownFile? ProcessTocItems(
BuildContext context,
DocumentationGroup topLevelGroup,
MarkdownFile? configuredIndex,
NavigationLookups lookups,
int depth,
ref int fileIndex,
out List<DocumentationGroup> groups,
out List<MarkdownFile> files,
out List<INavigationItem> navigationItems)
{
groups = [];
navigationItems = [];
files = [];
var indexFile = configuredIndex;
foreach (var (tocItem, index) in lookups.TableOfContents.Select((t, i) => (t, i)))
{
if (tocItem is FileReference file)
{
if (!lookups.FlatMappedFiles.TryGetValue(file.RelativePath, out var d))
{
context.EmitError(context.ConfigurationPath,
$"The following file could not be located: {file.RelativePath} it may be excluded from the build in docset.yml");
continue;
}
if (d is ExcludedFile excluded && excluded.RelativePath.EndsWith(".md"))
{
context.EmitError(context.ConfigurationPath, $"{excluded.RelativePath} matches exclusion glob from docset.yml yet appears in TOC");
continue;
}
if (d is not MarkdownFile md)
continue;
md.Hidden = file.Hidden;
var navigationIndex = Interlocked.Increment(ref fileIndex);
md.NavigationIndex = navigationIndex;
md.ScopeDirectory = file.TableOfContentsScope.ScopeDirectory;
md.NavigationRoot = topLevelGroup;
md.NavigationSource = NavigationSource;
foreach (var extension in lookups.EnabledExtensions)
extension.Visit(d, tocItem);
if (file.Children.Count > 0 && d is MarkdownFile virtualIndex)
{
if (file.Hidden)
context.EmitError(context.ConfigurationPath, $"The following file is hidden but has children: {file.RelativePath}");
var group = new DocumentationGroup(virtualIndex.RelativePath,
_treeCollector, context, lookups with
{
TableOfContents = file.Children
}, NavigationSource, ref fileIndex, depth + 1, topLevelGroup, this, virtualIndex);
groups.Add(group);
navigationItems.Add(new GroupNavigationItem(depth, group, this));
indexFile ??= virtualIndex;
continue;
}
files.Add(md);
if (file.RelativePath.EndsWith("index.md") && d is MarkdownFile i)
indexFile ??= i;
// add the page to navigation items unless it's the index file
// the index file can either be the discovered `index.md` or the parent group's
// explicit index page. E.g. when grouping related files together.
// if the page is referenced as hidden in the TOC do not include it in the navigation
if (indexFile != md && !md.Hidden)
navigationItems.Add(new FileNavigationItem(depth, md, this));
}
else if (tocItem is FolderReference folder)
{
var children = folder.Children;
if (children.Count == 0 && lookups.FilesGroupedByFolder.TryGetValue(folder.RelativePath, out var documentationFiles))
{
children =
[
.. documentationFiles
.Select(d => new FileReference(folder.TableOfContentsScope, d.RelativePath, false, []))
];
}
DocumentationGroup group;
if (folder is TocReference tocReference)
{
var toc = new TableOfContentsTree(tocReference.Source, folder.RelativePath, _treeCollector, context, lookups with
{
TableOfContents = children
}, ref fileIndex, depth + 1, topLevelGroup, this);
group = toc;
navigationItems.Add(new TocNavigationItem(depth, toc, tocReference.Source, this));
}
else
{
group = new DocumentationGroup(folder.RelativePath, _treeCollector, context, lookups with
{
TableOfContents = children
}, NavigationSource, ref fileIndex, depth + 1, topLevelGroup, this);
navigationItems.Add(new GroupNavigationItem(depth, group, this));
}
groups.Add(group);
}
}
if (indexFile is not null)
indexFile.IsIndex = true;
return indexFile ?? files.FirstOrDefault();
}