| | |
| | | if (trim) { |
| | | const includesCheck = (tok: string) => |
| | | tokenizedTerms.some((term) => tok.toLowerCase().startsWith(term.toLowerCase())) |
| | | const occurencesIndices = tokenizedText.map(includesCheck) |
| | | const occurrencesIndices = tokenizedText.map(includesCheck) |
| | | |
| | | let bestSum = 0 |
| | | let bestIndex = 0 |
| | | for (let i = 0; i < Math.max(tokenizedText.length - contextWindowWords, 0); i++) { |
| | | const window = occurencesIndices.slice(i, i + contextWindowWords) |
| | | const window = occurrencesIndices.slice(i, i + contextWindowWords) |
| | | const windowSum = window.reduce((total, cur) => total + (cur ? 1 : 0), 0) |
| | | if (windowSum >= bestSum) { |
| | | bestSum = windowSum |
| | |
| | | const searchIcon = document.getElementById("search-icon") |
| | | const searchBar = document.getElementById("search-bar") as HTMLInputElement | null |
| | | const results = document.getElementById("results-container") |
| | | const resultCards = document.getElementsByClassName("result-card") |
| | | const idDataMap = Object.keys(data) as FullSlug[] |
| | | |
| | | function hideSearch() { |
| | |
| | | |
| | | // add "#" prefix for tag search |
| | | if (searchBar) searchBar.value = "#" |
| | | } else if (e.key === "Enter") { |
| | | const anchor = document.getElementsByClassName("result-card")[0] as HTMLInputElement | null |
| | | if (anchor) { |
| | | anchor.click() |
| | | } |
| | | |
| | | if (!container?.classList.contains("active")) return |
| | | else if (e.key === "Enter") { |
| | | // If result has focus, navigate to that one, otherwise pick first result |
| | | if (results?.contains(document.activeElement)) { |
| | | const active = document.activeElement as HTMLInputElement |
| | | active.click() |
| | | } else { |
| | | const anchor = document.getElementsByClassName("result-card")[0] as HTMLInputElement | null |
| | | anchor?.click() |
| | | } |
| | | } else if (e.key === "ArrowDown") { |
| | | e.preventDefault() |
| | | // When first pressing ArrowDown, results wont contain the active element, so focus first element |
| | | if (!results?.contains(document.activeElement)) { |
| | | const firstResult = resultCards[0] as HTMLInputElement | null |
| | | firstResult?.focus() |
| | | } else { |
| | | // If an element in results-container already has focus, focus next one |
| | | const nextResult = document.activeElement?.nextElementSibling as HTMLInputElement | null |
| | | nextResult?.focus() |
| | | } |
| | | } else if (e.key === "ArrowUp") { |
| | | e.preventDefault() |
| | | if (results?.contains(document.activeElement)) { |
| | | // If an element in results-container already has focus, focus previous one |
| | | const prevResult = document.activeElement?.previousElementSibling as HTMLInputElement | null |
| | | prevResult?.focus() |
| | | } |
| | | } |
| | | } |
| | |
| | | return { |
| | | id, |
| | | slug, |
| | | title: highlight(term, data[slug].title ?? ""), |
| | | title: searchType === "tags" ? data[slug].title : highlight(term, data[slug].title ?? ""), |
| | | // if searchType is tag, display context from start of file and trim, otherwise use regular highlight |
| | | content: |
| | | searchType === "tags" |
| | |
| | | const termLower = term.toLowerCase() |
| | | let matching = tags.filter((str) => str.includes(termLower)) |
| | | |
| | | // Substract matching from original tags, then push difference |
| | | // Subtract matching from original tags, then push difference |
| | | if (matching.length > 0) { |
| | | let difference = tags.filter((x) => !matching.includes(x)) |
| | | |
| | |
| | | // setup index if it hasn't been already |
| | | if (!index) { |
| | | index = new Document({ |
| | | cache: true, |
| | | charset: "latin:extra", |
| | | optimize: true, |
| | | encode: encoder, |