From 1a67388f856bcf14bfbd3c2910884590881ca090 Mon Sep 17 00:00:00 2001
From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com>
Date: Thu, 10 Jul 2025 16:09:03 -0400
Subject: [PATCH] Include page body in search
---
__tests__/renderMarkdown.test.js | 2 ++
assets/theme.js | 3 ++-
src/generator/index.js | 5 ++++-
3 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/__tests__/renderMarkdown.test.js b/__tests__/renderMarkdown.test.js
index 2f8d5b0..58c4c8f 100644
--- a/__tests__/renderMarkdown.test.js
+++ b/__tests__/renderMarkdown.test.js
@@ -70,6 +70,8 @@ test('markdown files render with layout and appear in nav/search', async () => {
const docs = search.docs.map(d => d.id);
expect(docs).toContain('index.html');
expect(docs).toContain('guide/install.html');
+ const installDoc = search.docs.find(d => d.id === 'guide/install.html');
+ expect(installDoc.body).toContain('Steps');
fs.rmSync(tmp, { recursive: true, force: true });
});
diff --git a/assets/theme.js b/assets/theme.js
index ddc978f..2d0ebfc 100644
--- a/assets/theme.js
+++ b/assets/theme.js
@@ -65,7 +65,8 @@ document.addEventListener('DOMContentLoaded', () => {
if (!doc) return;
const a = document.createElement('a');
a.href = doc.url;
- a.innerHTML = '' + highlight(doc.title, q) + '
' + highlight(doc.headings, q) + '';
+ const snippet = doc.body ? doc.body.slice(0, 160) + (doc.body.length > 160 ? '...' : '') : '';
+ a.innerHTML = '' + highlight(doc.title, q) + '
' + highlight(snippet, q) + '';
searchResults.appendChild(a);
});
searchResults.style.display = 'block';
diff --git a/src/generator/index.js b/src/generator/index.js
index ccd1d6b..8fbd4da 100644
--- a/src/generator/index.js
+++ b/src/generator/index.js
@@ -142,8 +142,10 @@ async function generate({ contentDir = 'content', outputDir = '_site', configPat
const firstHeading = tokens.find(t => t.type === 'heading');
const title = parsed.data.title || (firstHeading ? firstHeading.text : path.basename(rel, '.md'));
const headings = tokens.filter(t => t.type === 'heading').map(t => t.text).join(' ');
+ const htmlBody = require('marked').parse(parsed.content || '');
+ const bodyText = htmlBody.replace(/<[^>]+>/g, ' ');
pages.push({ file: rel, data: { ...parsed.data, title } });
- searchDocs.push({ id: rel.replace(/\.md$/, '.html'), url: '/' + rel.replace(/\.md$/, '.html'), title, headings });
+ searchDocs.push({ id: rel.replace(/\.md$/, '.html'), url: '/' + rel.replace(/\.md$/, '.html'), title, headings, body: bodyText });
} else {
assets.push(rel);
}
@@ -158,6 +160,7 @@ async function generate({ contentDir = 'content', outputDir = '_site', configPat
this.ref('id');
this.field('title');
this.field('headings');
+ this.field('body');
searchDocs.forEach(d => this.add(d));
});
await fs.promises.writeFile(