| | |
| | | |
| | | const data = await fetchData |
| | | const container = document.getElementById("search-container") |
| | | const searchSpace = document.getElementById("search-space") |
| | | const sidebar = container?.closest(".sidebar") as HTMLElement |
| | | const searchIcon = document.getElementById("search-icon") |
| | | const searchBar = document.getElementById("search-bar") as HTMLInputElement | null |
| | |
| | | removeAllChildren(preview) |
| | | } |
| | | if (searchLayout) { |
| | | searchLayout.style.opacity = "0" |
| | | searchLayout.style.visibility = "hidden" |
| | | } |
| | | |
| | | searchType = "basic" // reset search type after closing |
| | |
| | | currentSearchTerm = (e.target as HTMLInputElement).value |
| | | |
| | | if (searchLayout) { |
| | | searchLayout.style.opacity = "1" |
| | | searchLayout.style.visibility = "visible" |
| | | } |
| | | |
| | | if (term === "" && searchLayout) { |
| | | searchLayout.style.opacity = "0" |
| | | searchLayout.style.visibility = "hidden" |
| | | } |
| | | |
| | | if (term.toLowerCase().startsWith("#")) { |
| | |
| | | searchBar?.addEventListener("input", onType) |
| | | window.addCleanup(() => searchBar?.removeEventListener("input", onType)) |
| | | |
| | | // setup index if it hasn't been already |
| | | if (!index) { |
| | | index = new FlexSearch.Document({ |
| | | charset: "latin:extra", |
| | | encode: encoder, |
| | | document: { |
| | | id: "id", |
| | | index: [ |
| | | { |
| | | field: "title", |
| | | tokenize: "forward", |
| | | }, |
| | | { |
| | | field: "content", |
| | | tokenize: "forward", |
| | | }, |
| | | { |
| | | field: "tags", |
| | | tokenize: "forward", |
| | | }, |
| | | ], |
| | | }, |
| | | }) |
| | | |
| | | fillDocument(index, data) |
| | | } |
| | | |
| | | // register handlers |
| | | registerEscapeHandler(container, hideSearch) |
| | | index ??= await fillDocument(data) |
| | | registerEscapeHandler(searchSpace, hideSearch) |
| | | }) |
| | | |
| | | /** |
| | |
| | | * @param index index to fill |
| | | * @param data data to fill index with |
| | | */ |
| | | async function fillDocument(index: FlexSearch.Document<Item, false>, data: any) { |
| | | async function fillDocument(data: { [key: FullSlug]: ContentDetails }) { |
| | | const index = new FlexSearch.Document<Item>({ |
| | | charset: "latin:extra", |
| | | encode: encoder, |
| | | document: { |
| | | id: "id", |
| | | index: [ |
| | | { |
| | | field: "title", |
| | | tokenize: "forward", |
| | | }, |
| | | { |
| | | field: "content", |
| | | tokenize: "forward", |
| | | }, |
| | | { |
| | | field: "tags", |
| | | tokenize: "forward", |
| | | }, |
| | | ], |
| | | }, |
| | | }) |
| | | let id = 0 |
| | | for (const [slug, fileData] of Object.entries<ContentDetails>(data)) { |
| | | await index.addAsync(id++, { |
| | |
| | | tags: fileData.tags, |
| | | }) |
| | | } |
| | | |
| | | return index |
| | | } |