| | |
| | | "cli-spinner": "^0.2.10", |
| | | "d3": "^7.8.5", |
| | | "esbuild-sass-plugin": "^2.16.0", |
| | | "flexsearch": "0.7.21", |
| | | "flexsearch": "0.7.43", |
| | | "github-slugger": "^2.0.0", |
| | | "globby": "^14.0.0", |
| | | "gray-matter": "^4.0.3", |
| | |
| | | "devDependencies": { |
| | | "@types/cli-spinner": "^0.2.3", |
| | | "@types/d3": "^7.4.3", |
| | | "@types/flexsearch": "^0.7.3", |
| | | "@types/hast": "^3.0.3", |
| | | "@types/js-yaml": "^4.0.9", |
| | | "@types/node": "^20.1.2", |
| | |
| | | "@types/estree": "*" |
| | | } |
| | | }, |
| | | "node_modules/@types/flexsearch": { |
| | | "version": "0.7.3", |
| | | "resolved": "https://registry.npmjs.org/@types/flexsearch/-/flexsearch-0.7.3.tgz", |
| | | "integrity": "sha512-HXwADeHEP4exXkCIwy2n1+i0f1ilP1ETQOH5KDOugjkTFZPntWo0Gr8stZOaebkxsdx+k0X/K6obU/+it07ocg==", |
| | | "dev": true |
| | | }, |
| | | "node_modules/@types/geojson": { |
| | | "version": "7946.0.10", |
| | | "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", |
| | |
| | | } |
| | | }, |
| | | "node_modules/flexsearch": { |
| | | "version": "0.7.21", |
| | | "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.21.tgz", |
| | | "integrity": "sha512-W7cHV7Hrwjid6lWmy0IhsWDFQboWSng25U3VVywpHOTJnnAZNPScog67G+cVpeX9f7yDD21ih0WDrMMT+JoaYg==" |
| | | "version": "0.7.43", |
| | | "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.43.tgz", |
| | | "integrity": "sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==" |
| | | }, |
| | | "node_modules/foreground-child": { |
| | | "version": "3.1.1", |
| | |
| | | "cli-spinner": "^0.2.10", |
| | | "d3": "^7.8.5", |
| | | "esbuild-sass-plugin": "^2.16.0", |
| | | "flexsearch": "0.7.21", |
| | | "flexsearch": "0.7.43", |
| | | "github-slugger": "^2.0.0", |
| | | "globby": "^14.0.0", |
| | | "gray-matter": "^4.0.3", |
| | |
| | | "devDependencies": { |
| | | "@types/cli-spinner": "^0.2.3", |
| | | "@types/d3": "^7.4.3", |
| | | "@types/flexsearch": "^0.7.3", |
| | | "@types/hast": "^3.0.3", |
| | | "@types/js-yaml": "^4.0.9", |
| | | "@types/node": "^20.1.2", |
| | |
| | | }, |
| | | write: false, |
| | | bundle: true, |
| | | minify: true, |
| | | platform: "browser", |
| | | format: "esm", |
| | | }) |
| | |
| | | import { Document, SimpleDocumentSearchResultSetUnit } from "flexsearch" |
| | | import FlexSearch from "flexsearch" |
| | | import { ContentDetails } from "../../plugins/emitters/contentIndex" |
| | | import { registerEscapeHandler, removeAllChildren } from "./util" |
| | | import { FullSlug, resolveRelative } from "../../util/path" |
| | |
| | | tags: string[] |
| | | } |
| | | |
| | | let index: Document<Item> | undefined = undefined |
| | | let index: FlexSearch.Document<Item> | undefined = undefined |
| | | |
| | | // Can be expanded with things like "term" in the future |
| | | type SearchType = "basic" | "tags" |
| | |
| | | |
| | | async function onType(e: HTMLElementEventMap["input"]) { |
| | | let term = (e.target as HTMLInputElement).value |
| | | let searchResults: SimpleDocumentSearchResultSetUnit[] |
| | | let searchResults: FlexSearch.SimpleDocumentSearchResultSetUnit[] |
| | | |
| | | if (term.toLowerCase().startsWith("#")) { |
| | | searchType = "tags" |
| | |
| | | |
| | | // setup index if it hasn't been already |
| | | if (!index) { |
| | | index = new Document({ |
| | | index = new FlexSearch.Document({ |
| | | charset: "latin:extra", |
| | | optimize: true, |
| | | encode: encoder, |
| | | document: { |
| | | id: "id", |
| | | index: [ |
| | | { |
| | | field: "title", |
| | | tokenize: "reverse", |
| | | tokenize: "forward", |
| | | }, |
| | | { |
| | | field: "content", |
| | | tokenize: "reverse", |
| | | tokenize: "forward", |
| | | }, |
| | | { |
| | | field: "tags", |
| | | tokenize: "reverse", |
| | | tokenize: "forward", |
| | | }, |
| | | ], |
| | | }, |
| | |
| | | * @param index index to fill |
| | | * @param data data to fill index with |
| | | */ |
| | | async function fillDocument(index: Document<Item, false>, data: any) { |
| | | async function fillDocument(index: FlexSearch.Document<Item, false>, data: any) { |
| | | let id = 0 |
| | | for (const [slug, fileData] of Object.entries<ContentDetails>(data)) { |
| | | await index.addAsync(id, { |
| | |
| | | "experimentalDecorators": true, |
| | | "module": "esnext", |
| | | "target": "esnext", |
| | | "moduleResolution": "node", |
| | | "moduleResolution": "bundler", |
| | | "strict": true, |
| | | "incremental": true, |
| | | "resolveJsonModule": true, |