| | |
| | | |
| | | const contextWindowWords = 30 |
| | | function highlight(searchTerm: string, text: string, trim?: boolean) { |
| | | const tokenizedTerms = searchTerm.split(/\s+/).filter(t => t !== "") |
| | | // try to highlight longest tokens first |
| | | const tokenizedTerms = searchTerm.split(/\s+/).filter(t => t !== "").sort((a, b) => b.length - a.length) |
| | | let tokenizedText = text |
| | | .split(/\s+/) |
| | | .filter(t => t !== "") |
| | |
| | | // see if this tok is prefixed by any search terms |
| | | for (const searchTok of tokenizedTerms) { |
| | | if (tok.toLowerCase().includes(searchTok.toLowerCase())) { |
| | | const regex = new RegExp(searchTok, "gi") |
| | | const regex = new RegExp(searchTok.toLowerCase(), "gi") |
| | | return tok.replace(regex, `<span class="highlight">$&</span>`) |
| | | } |
| | | } |
| | |
| | | }) |
| | | |
| | | for (const [slug, fileData] of Object.entries<ContentDetails>(data)) { |
| | | index.add({ |
| | | await index.addAsync(slug, { |
| | | slug, |
| | | title: fileData.title, |
| | | content: fileData.content |
| | |
| | | displayResults(finalResults) |
| | | } |
| | | |
| | | |
| | | document.removeEventListener("keydown", shortcutHandler) |
| | | document.addEventListener("keydown", shortcutHandler) |
| | | searchIcon?.removeEventListener("click", showSearch) |