in src/TemplateRefGenerator/Generators/TocGenerator.cs [13:81]
private record TocItem(
string Name,
List<TocItem> Items,
string? Href = null,
string? DisplayName = null);
private static string GetIndent(int indentLevel)
=> indentLevel > 0 ? string.Join("", Enumerable.Repeat(" ", indentLevel)) : "";
public static string GenerateReferenceToc(MarkdownGenerator.GroupedTypes groupedTypes)
{
TocItem latestVersionToc = new("<placeholder>", new());
foreach (var (resourceType, apiVersion) in groupedTypes.GetLatestApiVersionByType().OrderBy(x => x.Key, StringComparer.OrdinalIgnoreCase))
{
var parentToc = latestVersionToc;
var segments = resourceType.Split('/').Skip(1).ToArray();
foreach (var parentSegment in segments[0..^1])
{
var folderName = $"{parentSegment}/";
if (parentToc.Items.FirstOrDefault(x => StringComparer.OrdinalIgnoreCase.Equals(x.Name, folderName)) is not {} nextParentToc)
{
nextParentToc = new(folderName, new());
parentToc.Items.Add(nextParentToc);
}
parentToc = nextParentToc;
}
var mdPath = $"./{string.Join('/', segments)}.md".ToLowerInvariant();
TocItem childToc = new(segments.Last(), new(), mdPath);
parentToc.Items.Add(childToc);
}
TocItem apiVersionsToc = new("(Api versions)", new());
foreach (var (apiVersion, resourceTypes) in groupedTypes.ResourceTypeByApiVersion.OrderByDescending(x => x.Key, ApiVersionComparer.Instance))
{
TocItem apiVersionToc = new(apiVersion, new());
apiVersionsToc.Items.Add(apiVersionToc);
foreach (var resourceType in resourceTypes.OrderBy(x => x, StringComparer.OrdinalIgnoreCase))
{
var parentToc = apiVersionToc;
var segments = resourceType.Split('/').Skip(1).ToArray();
foreach (var parentSegment in segments[0..^1])
{
var folderName = $"{parentSegment}/";
if (parentToc.Items.FirstOrDefault(x => StringComparer.OrdinalIgnoreCase.Equals(x.Name, folderName)) is not {} nextParentToc)
{
nextParentToc = new(folderName, new());
parentToc.Items.Add(nextParentToc);
}
parentToc = nextParentToc;
}
var mdPath = $"./{apiVersion}/{string.Join('/', segments)}.md".ToLowerInvariant();
TocItem childToc = new(segments.Last(), new(), mdPath);
parentToc.Items.Add(childToc);
}
}
var sb = new StringBuilder();
foreach (var toc in latestVersionToc.Items)
{
Print(toc, sb, 0);
}
Print(apiVersionsToc, sb, 0);
return sb.ToString();
}