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

NameDescription
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

NameDescription
Name
Order

Methods

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);
        }
    }
}
Was this page helpful?