From 3176a78c03d93e9a150be3586a85939ecef6c537 Mon Sep 17 00:00:00 2001 From: Utsob Roy Date: Thu, 19 Jan 2023 19:46:56 +0600 Subject: [PATCH] better tag search (#46) --- .eleventy.js | 21 ++++++++++++++++ netlify/functions/search/search.js | 39 +++++++++++++++--------------- src/site/lunr.njk | 2 +- 3 files changed, 42 insertions(+), 20 deletions(-) diff --git a/.eleventy.js b/.eleventy.js index 6144b6b..ca618f4 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -202,6 +202,27 @@ module.exports = function (eleventyConfig) { ); }); + eleventyConfig.addFilter("searchableTags", function (str) { + let tags; + let match = + str && + str.match( + /(^|\s|\>)(#[^\s!@#$%^&*()=+\.\/,\[{\]};:'"?><]+)(?!([^<]*>))/g + ); + if (match) { + tags = match + .map((m) => { + return `"${m.split("#")[1]}"`; + }) + .join(", "); + } + if (tags) { + return `${tags},`; + } else { + return ""; + } + }); + eleventyConfig.addTransform("callout-block", function (str) { const parsed = parse(str); diff --git a/netlify/functions/search/search.js b/netlify/functions/search/search.js index 6b28075..f4bb4e8 100644 --- a/netlify/functions/search/search.js +++ b/netlify/functions/search/search.js @@ -1,28 +1,29 @@ -const lunrjs = require('lunr'); +const lunrjs = require("lunr"); const handler = async (event) => { try { - const search = event.queryStringParameters.term; - if(!search) throw('Missing term query parameter'); + if (!search) throw "Missing term query parameter"; - const data = require('./data.json'); - const indexJson = require('./index.json'); + const data = require("./data.json"); + const indexJson = require("./index.json"); const index = lunrjs.Index.load(indexJson); - console.log('index made'); + console.log("index made"); - let results = + let results = search[0] == "#" && search.length > 1 - ? index.search(`${search.substring(1)}`) - : index.search(search+"*"); + ? index.search(`tags:${search.substring(1)}`) + : index.search(search + "*"); - results.forEach(r => { + results.forEach((r) => { r.title = data[r.ref].title; r.content = truncate(data[r.ref].content, 400); r.date = data[r.ref].date; r.url = data[r.ref].url; - r.tags = data[r.ref].tags.filter(x=>x!="gardenEntry" && x!="note");//Note is automatically added by 11ty. GardenEntry is used internally to mark the home page - + r.tags = data[r.ref].tags.filter( + (x) => x != "gardenEntry" && x != "note" + ); //Note is automatically added by 11ty. GardenEntry is used internally to mark the home page + delete r.ref; }); @@ -32,17 +33,17 @@ const handler = async (event) => { // // more keys you can return: // headers: { "headerName": "headerValue", ... }, // isBase64Encoded: true, - } + }; } catch (error) { - return { statusCode: 500, body: error.toString() } + return { statusCode: 500, body: error.toString() }; } -} +}; function truncate(str, size) { //first, remove HTML - str = str.replace(/<.*?>/g, ''); - if(str.length < size) return str; - return str.substring(0, size-3) + '...'; + str = str.replace(/<.*?>/g, ""); + if (str.length < size) return str; + return str.substring(0, size - 3) + "..."; } -module.exports = { handler } +module.exports = { handler }; diff --git a/src/site/lunr.njk b/src/site/lunr.njk index 5dd4074..9b1f14d 100644 --- a/src/site/lunr.njk +++ b/src/site/lunr.njk @@ -9,6 +9,6 @@ eleventyExcludeFromCollections: true "date":"{{ post.date }}", "url":"{{ post.url }}", "content": {{ post.templateContent | striptags(true) | link | jsonify | safe }}, - "tags": [{% if post.data.tags %}{% for tag in post.data.tags %}"{{tag}}"{% if not loop.last %},{% endif %}{% endfor %}{% endif %}] + "tags": [{{post.templateContent | link | searchableTags | safe }} {% if post.data.tags %}{% for tag in post.data.tags %}"{{tag}}"{% if not loop.last %},{% endif %}{% endfor %}{% endif %}] }{% if not loop.last %},{% endif %} {% endfor %}]