| | |
| | | encode: encoder, |
| | | document: { |
| | | id: "id", |
| | | tag: "tags", |
| | | index: [ |
| | | { |
| | | field: "title", |
| | |
| | | const data = await fetchData |
| | | const container = document.getElementById("search-container") |
| | | const sidebar = container?.closest(".sidebar") as HTMLElement |
| | | const searchIcon = document.getElementById("search-icon") |
| | | const searchButton = document.getElementById("search-button") |
| | | const searchBar = document.getElementById("search-bar") as HTMLInputElement | null |
| | | const searchLayout = document.getElementById("search-layout") |
| | | const idDataMap = Object.keys(data) as FullSlug[] |
| | |
| | | let previewInner: HTMLDivElement | undefined = undefined |
| | | const results = document.createElement("div") |
| | | results.id = "results-container" |
| | | results.style.flexBasis = enablePreview ? "min(30%, 450px)" : "100%" |
| | | appendLayout(results) |
| | | |
| | | if (enablePreview) { |
| | | preview = document.createElement("div") |
| | | preview.id = "preview-container" |
| | | preview.style.flexBasis = "100%" |
| | | appendLayout(preview) |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | searchType = "basic" // reset search type after closing |
| | | |
| | | searchButton?.focus() |
| | | } |
| | | |
| | | function showSearch(searchTypeNew: SearchType) { |
| | |
| | | itemTile.classList.add("result-card") |
| | | itemTile.id = slug |
| | | itemTile.href = resolveUrl(slug).toString() |
| | | itemTile.innerHTML = `<h3>${title}</h3>${htmlTags}<p class="preview">${content}</p>` |
| | | itemTile.innerHTML = `<h3>${title}</h3>${htmlTags}${ |
| | | enablePreview && window.innerWidth > 600 ? "" : `<p>${content}</p>` |
| | | }` |
| | | itemTile.addEventListener("click", (event) => { |
| | | if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return |
| | | hideSearch() |
| | | }) |
| | | |
| | | const handler = (event: MouseEvent) => { |
| | | if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return |
| | |
| | | |
| | | let searchResults: FlexSearch.SimpleDocumentSearchResultSetUnit[] |
| | | if (searchType === "tags") { |
| | | searchResults = await index.searchAsync({ |
| | | query: currentSearchTerm.substring(1), |
| | | limit: numSearchResults, |
| | | index: ["tags"], |
| | | }) |
| | | currentSearchTerm = currentSearchTerm.substring(1).trim() |
| | | const separatorIndex = currentSearchTerm.indexOf(" ") |
| | | if (separatorIndex != -1) { |
| | | // search by title and content index and then filter by tag (implemented in flexsearch) |
| | | const tag = currentSearchTerm.substring(0, separatorIndex) |
| | | const query = currentSearchTerm.substring(separatorIndex + 1).trim() |
| | | searchResults = await index.searchAsync({ |
| | | query: query, |
| | | // return at least 10000 documents, so it is enough to filter them by tag (implemented in flexsearch) |
| | | limit: Math.max(numSearchResults, 10000), |
| | | index: ["title", "content"], |
| | | tag: tag, |
| | | }) |
| | | for (let searchResult of searchResults) { |
| | | searchResult.result = searchResult.result.slice(0, numSearchResults) |
| | | } |
| | | // set search type to basic and remove tag from term for proper highlightning and scroll |
| | | searchType = "basic" |
| | | currentSearchTerm = query |
| | | } else { |
| | | // default search by tags index |
| | | searchResults = await index.searchAsync({ |
| | | query: currentSearchTerm, |
| | | limit: numSearchResults, |
| | | index: ["tags"], |
| | | }) |
| | | } |
| | | } else if (searchType === "basic") { |
| | | searchResults = await index.searchAsync({ |
| | | query: currentSearchTerm, |
| | |
| | | |
| | | document.addEventListener("keydown", shortcutHandler) |
| | | window.addCleanup(() => document.removeEventListener("keydown", shortcutHandler)) |
| | | searchIcon?.addEventListener("click", () => showSearch("basic")) |
| | | window.addCleanup(() => searchIcon?.removeEventListener("click", () => showSearch("basic"))) |
| | | searchButton?.addEventListener("click", () => showSearch("basic")) |
| | | window.addCleanup(() => searchButton?.removeEventListener("click", () => showSearch("basic"))) |
| | | searchBar?.addEventListener("input", onType) |
| | | window.addCleanup(() => searchBar?.removeEventListener("input", onType)) |
| | | |