Class
Sealed
public sealed class SearchIndexPhase : IBuildPhase
Namespace: Moka.Docs.Engine.Phases
Builds the client-side search index from all pages.
Inheritance
Inherits from: IBuildPhase
Constructors
| Name | Description |
|---|---|
SearchIndexPhase(SearchIndexPhase> logger) |
Builds the client-side search index from all pages. |
SearchIndexPhase(SearchIndexPhase> logger)
SearchIndexPhase.SearchIndexPhase(ILogger<SearchIndexPhase> logger)
Builds the client-side search index from all pages.
Properties
Methods
| Name | Description |
|---|---|
ExecuteAsync(BuildContext context, CancellationToken ct) |
Type Relationships
classDiagram
style SearchIndexPhase fill:#f9f,stroke:#333,stroke-width:2px
SearchIndexPhase --|> IBuildPhase : inherits
View Source
/// <summary>
/// Builds the client-side search index from all pages.
/// </summary>
public sealed class SearchIndexPhase(ILogger<SearchIndexPhase> logger) : IBuildPhase
{
/// <inheritdoc/>
public string Name => "SearchIndex";
/// <inheritdoc/>
public int Order => 700;
/// <inheritdoc/>
public Task ExecuteAsync(BuildContext context, CancellationToken ct = default)
{
if (!context.Config.Features.Search.Enabled)
{
logger.LogInformation("Search is disabled, skipping index build");
return Task.CompletedTask;
}
var entries = new List<SearchEntry>();
foreach (DocPage page in context.Pages)
{
if (page.FrontMatter.Visibility == PageVisibility.Draft)
{
continue;
}
string category = page.Origin == PageOrigin.ApiGenerated ? "API Reference" : "Documentation";
entries.Add(new SearchEntry { Title = page.FrontMatter.Title, Route = page.Route, Content = page.Content.PlainText, Category = category, Tags = page.FrontMatter.Tags });
// Also add ToC entries as separate search entries for deeper matching
foreach (TocEntry tocEntry in page.TableOfContents.Entries)
{
AddTocEntries(entries, page, tocEntry);
}
}
context.SearchIndex = new SearchIndex
{
Entries = entries
};
logger.LogInformation("Built search index with {Count} entries", entries.Count);
return Task.CompletedTask;
}
private static void AddTocEntries(List<SearchEntry> entries, DocPage page, TocEntry toc)
{
entries.Add(new SearchEntry { Title = page.FrontMatter.Title, Section = toc.Text, Route = $"{page.Route}#{toc.Id}", Content = "", // Individual section content extraction would require splitting HTML
Category = page.Origin == PageOrigin.ApiGenerated ? "API Reference" : "Documentation" });
foreach (TocEntry child in toc.Children)
{
AddTocEntries(entries, page, child);
}
}
}