\s?/gm, "") + .replace(/^[-*+]\s+/gm, "") + .replace(/^\d+\.\s+/gm, "") + .replace(/^:::.*$/gm, "") + .replace(/\n{3,}/g, "\n\n") + .trim(); +} + +/** + * Build a search index from sorted doc pages. + * Used at build time to generate the static data embedded in every docs page. + */ +export function buildSearchIndex< + T extends { id: string; body?: string; data?: { title?: string } }, +>(sortedPages: T[]): DocsSearchEntry[] { + return sortedPages.map((page) => { + const parsed = parseDocCollectionId(page.id); + const cleanSlug = getCleanSlug(page.id); + const title = + page.data?.title ?? + (page.body ? extractTitleFromMarkdown(page.body) : null) ?? + parsed.title; + return { + title, + slug: cleanSlug, + chapter: formatChapterTitle(parsed.chapter), + body: stripMarkdown(page.body || ""), + }; + }); +}