Browse Source

Refactor TOC generation to use level count instead of max level

Replaces the use of a fixed max TOC level with a level count parameter in TOC generation methods and logic. This change improves flexibility by allowing the number of heading levels included in the TOC to be specified, rather than a maximum heading level value.
pull/23666/head
Ahmet Çelik 11 months ago
parent
commit
e850b4b463
  1. 4
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs
  2. 4
      modules/docs/src/Volo.Docs.Web/TableOfContents/ITocGeneratorService.cs
  3. 18
      modules/docs/src/Volo.Docs.Web/TableOfContents/TocGeneratorService.cs

4
modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs

@ -101,7 +101,7 @@ namespace Volo.Docs.Pages.Documents.Project
public DocumentNavigationsDto DocumentNavigationsDto { get; private set; }
private const int MaxDescriptionMetaTagLength = 200;
private const int MaxTocLevel = 3;
private const int TocLevelCount = 2;
private readonly IDocumentAppService _documentAppService;
private readonly IDocumentToHtmlConverterFactory _documentToHtmlConverterFactory;
private readonly IProjectAppService _projectAppService;
@ -544,7 +544,7 @@ namespace Volo.Docs.Pages.Documents.Project
if (Document != null && !Document.Content.IsNullOrEmpty())
{
TocItems = _tocGeneratorService.GenerateTocItems(Document.Content, MaxTocLevel);
TocItems = _tocGeneratorService.GenerateTocItems(Document.Content, TocLevelCount);
}
await ConvertDocumentContentToHtmlAsync();

4
modules/docs/src/Volo.Docs.Web/TableOfContents/ITocGeneratorService.cs

@ -7,9 +7,9 @@ public interface ITocGeneratorService : IApplicationService
{
List<TocHeading> GenerateTocHeadings(string markdownContent);
List<TocItem> GenerateTocItems(List<TocHeading> tocHeadings, int topLevel, int maxLevel);
List<TocItem> GenerateTocItems(List<TocHeading> tocHeadings, int topLevel, int levelCount);
int GetTopLevel(List<TocHeading> tocHeadings);
List<TocItem> GenerateTocItems(string markdownContent, int maxLevel, int? topLevel = null);
List<TocItem> GenerateTocItems(string markdownContent, int levelCount, int? topLevel = null);
}

18
modules/docs/src/Volo.Docs.Web/TableOfContents/TocGeneratorService.cs

@ -32,8 +32,10 @@ public class TocGeneratorService : ITocGeneratorService, ITransientDependency
.ToList();
}
public virtual List<TocItem> GenerateTocItems(List<TocHeading> tocHeadings, int topLevel, int maxLevel)
public virtual List<TocItem> GenerateTocItems(List<TocHeading> tocHeadings, int topLevel, int levelCount)
{
var maxLevel = GetMaxLevel(tocHeadings, topLevel, levelCount);
var filteredHeadings = tocHeadings
.Where(heading => heading.Level >= topLevel && heading.Level <= maxLevel)
.ToList();
@ -47,7 +49,7 @@ public class TocGeneratorService : ITocGeneratorService, ITransientDependency
.FirstOrDefault(level => headings.Count(h => h.Level == level) > 1, MinHeadingLevel);
}
public virtual List<TocItem> GenerateTocItems(string markdownContent, int maxLevel, int? topLevel = null)
public virtual List<TocItem> GenerateTocItems(string markdownContent, int levelCount, int? topLevel = null)
{
var headings = GenerateTocHeadings(markdownContent);
if (headings.Count == 0)
@ -56,7 +58,7 @@ public class TocGeneratorService : ITocGeneratorService, ITransientDependency
}
var resolvedTopLevel = topLevel ?? GetTopLevel(headings);
return GenerateTocItems(headings, resolvedTopLevel, maxLevel);
return GenerateTocItems(headings, resolvedTopLevel, levelCount);
}
protected virtual MarkdownPipeline CreateMarkdownPipeline()
@ -180,6 +182,16 @@ public class TocGeneratorService : ITocGeneratorService, ITransientDependency
}
}
protected virtual int GetMaxLevel(List<TocHeading> tocHeadings, int topLevel, int levelCount)
{
return tocHeadings.Where(h => h.Level >= topLevel)
.Select(h => h.Level)
.Distinct()
.OrderBy(level => level)
.Skip(levelCount - 1)
.FirstOrDefault(topLevel);
}
protected virtual bool HasExactCount<T>(IEnumerable<T> enumerable, int count)
{
var itemCount = 0;

Loading…
Cancel
Save