fix(search): resolve `$frontmatter` expressions in local search index

pull/5162/head
Marco Roth 3 weeks ago
parent 6730fb8462
commit bbbb914b88
No known key found for this signature in database
GPG Key ID: 752AA13248B5D2D6

@ -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<string, MiniSearch<IndexObject>>()
@ -248,3 +259,22 @@ function getSearchableText(content: string) {
function clearHtmlTags(str: string) {
return str.replace(/<[^>]*>/g, '')
}
function resolveFrontmatterExpressions(
html: string,
frontmatter: Record<string, any>
): 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
}
)
}

Loading…
Cancel
Save