From 4d0799668fdb0f85ff014e7e5be0de0211127414 Mon Sep 17 00:00:00 2001 From: Daniel-I-Am Date: Sat, 11 Jun 2022 21:52:30 +0200 Subject: [PATCH] Add page indexer script --- .gitignore | 1 + assets/js/app.js | 1 + assets/js/lunr.js | 21 +++++++++ docker/prod-host/search-indexer.js | 76 ++++++++++++++++++++++++++++++ package.json | 4 +- yarn.lock | 10 ++++ 6 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 assets/js/lunr.js create mode 100644 docker/prod-host/search-indexer.js diff --git a/.gitignore b/.gitignore index d1798b3..53e7b2c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .hugo_build.lock resources/_gen/ +static/js/lunr/PagesIndex.json node_modules/ diff --git a/assets/js/app.js b/assets/js/app.js index b3c0579..5f9d749 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -1,4 +1,5 @@ import clickableMaker from "./clickable-maker"; +import _ from "./lunr"; window.addEventListener('load', () => { clickableMaker(); diff --git a/assets/js/lunr.js b/assets/js/lunr.js new file mode 100644 index 0000000..0eb2e67 --- /dev/null +++ b/assets/js/lunr.js @@ -0,0 +1,21 @@ +const lunr = require('lunr'); + +fetch("/js/lunr/PagesIndex.json") + .then(pagesIndex => { + const lunrIndex = lunr(function() { + this.field('title', { + boost: 10, + }); + this.field('tags', { + boost: 5, + }); + this.field('content'); + + this.ref('href'); + }); + + pagesIndex.forEach(page => { + lunrIndex.add(page); + }); + }) +; diff --git a/docker/prod-host/search-indexer.js b/docker/prod-host/search-indexer.js new file mode 100644 index 0000000..b5e449d --- /dev/null +++ b/docker/prod-host/search-indexer.js @@ -0,0 +1,76 @@ +const fs = require('fs'); +const S = require('string'); +const path = require('path'); + +const CONTENT_PATH_PREFIX = 'content/' +const OUTPUT_PATH = "static/js/lunr/PagesIndex.json" + +const getTree = dir => { + const allFiles = []; + + const items = fs.readdirSync(dir); + items.forEach(item => { + const itemPath = path.join(dir, item); + const stats = fs.statSync(itemPath); + if (stats.isDirectory()) { + allFiles.push(...getTree(itemPath)); + } else { + allFiles.push(itemPath); + } + }); + return allFiles; +} + +const pageIndices = getTree(CONTENT_PATH_PREFIX) + .map(file => { + const href = S(file).chompLeft(CONTENT_PATH_PREFIX).chompRight('.md').s; + + if (href.startsWith('_')) { + return; + } + + const content = fs.readFileSync(file).toString(); + + const splitContent = content.split('---') + const frontMatter = {}; + try { + const frontMatterRaw = splitContent[1].trim(); + + for (const line of frontMatterRaw.split('\n')) { + try { + const parts = line.split(':'); + const key = parts[0].trim() + const value = JSON.parse(parts[1]); + + frontMatter[key] = value; + } catch (e) { + continue; + } + } + } catch (e) { + return; + } + + if (frontMatter.draft !== false) { + return; + } + + const pageIndex = {} + + pageIndex['title'] = frontMatter.title; + pageIndex['href'] = href; + pageIndex['content'] = S(splitContent[2]).trim().stripTags().stripPunctuation().s; + + if (frontMatter.tags) { + pageIndex['tags'] = frontMatter.tags; + } + + return pageIndex; + }) + .filter(e => e) +; + +fs.mkdirSync(path.dirname(OUTPUT_PATH), { + recursive: true, +}); +fs.writeFileSync(OUTPUT_PATH, JSON.stringify(pageIndices)); diff --git a/package.json b/package.json index 073f7bc..df0b41b 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,8 @@ "name": "personal-site", "version": "1.0.0", "devDependencies": { - "@fortawesome/fontawesome-free": "^6.1.1" + "@fortawesome/fontawesome-free": "^6.1.1", + "lunr": "^2.3.9", + "string": "^3.3.3" } } diff --git a/yarn.lock b/yarn.lock index 070c113..062ae06 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6,3 +6,13 @@ version "6.1.1" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.1.1.tgz#bf5d45611ab74890be386712a0e5d998c65ee2a1" integrity sha512-J/3yg2AIXc9wznaVqpHVX3Wa5jwKovVF0AMYSnbmcXTiL3PpRPfF58pzWucCwEiCJBp+hCNRLWClTomD8SseKg== + +lunr@^2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== + +string@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/string/-/string-3.3.3.tgz#5ea211cd92d228e184294990a6cc97b366a77cb0" + integrity sha512-LbvprpPZT/39QKfNrlPX9vXtS7If80vqbPQ7clnHQb5oVOM5hz/cs3iQCCZjvQDwsAWl+HpLQX3gRgN6IC8t3g==