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(