From bbbb914b889805f1cee46cd4e40bc104e78d0393 Mon Sep 17 00:00:00 2001 From: Marco Roth Date: Mon, 23 Mar 2026 20:09:06 +0100 Subject: [PATCH] fix(search): resolve `$frontmatter` expressions in local search index --- src/node/plugins/localSearchPlugin.ts | 36 ++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/src/node/plugins/localSearchPlugin.ts b/src/node/plugins/localSearchPlugin.ts index 0af42dacb..188c80097 100644 --- a/src/node/plugins/localSearchPlugin.ts +++ b/src/node/plugins/localSearchPlugin.ts @@ -56,12 +56,23 @@ export async function localSearchPlugin( const env: MarkdownEnv = { path: file, relativePath, cleanUrls } const md_raw = await fs.promises.readFile(file, 'utf-8') const md_src = processIncludes(md, srcDir, md_raw, file, [], cleanUrls) + let html: string + if (options._render) { - return await options._render(md_src, env, md) + html = await options._render(md_src, env, md) } else { - const html = await md.renderAsync(md_src, env) - return env.frontmatter?.search === false ? '' : html + html = await md.renderAsync(md_src, env) + + if (env.frontmatter?.search === false) { + return '' + } } + + if (env.frontmatter) { + html = resolveFrontmatterExpressions(html, env.frontmatter) + } + + return html } const indexByLocales = new Map>() @@ -248,3 +259,22 @@ function getSearchableText(content: string) { function clearHtmlTags(str: string) { return str.replace(/<[^>]*>/g, '') } + +function resolveFrontmatterExpressions( + html: string, + frontmatter: Record +): string { + return html.replace( + /\{\{\s*\$frontmatter\.(\S+?)\s*\}\}/g, + (match, key: string) => { + const value = key + .split('.') + .reduce( + (object, key) => (object != null ? object[key] : undefined), + frontmatter + ) + + return value != null ? String(value) : match + } + ) +}